diff --git a/channeldb/kvdb/backend.go b/channeldb/kvdb/backend.go index 851f430e..309f7540 100644 --- a/channeldb/kvdb/backend.go +++ b/channeldb/kvdb/backend.go @@ -253,7 +253,7 @@ func GetTestBackend(path, name string) (Backend, func(), error) { } return db, empty, nil } else if TestBackend == EtcdBackendName { - return GetEtcdTestBackend(path, name) + return GetEtcdTestBackend(path, 0, 0) } return nil, nil, fmt.Errorf("unknown backend") diff --git a/channeldb/kvdb/config.go b/channeldb/kvdb/config.go index 73c1a303..aeeab574 100644 --- a/channeldb/kvdb/config.go +++ b/channeldb/kvdb/config.go @@ -36,7 +36,11 @@ type BoltConfig struct { // EtcdConfig holds etcd configuration. type EtcdConfig struct { - Embedded bool `long:"embedded" description:"Use embedded etcd instance instead of the external one."` + Embedded bool `long:"embedded" description:"Use embedded etcd instance instead of the external one. Note: use for testing only."` + + EmbeddedClientPort uint16 `long:"embedded_client_port" description:"Client port to use for the embedded instance. Note: use for testing only."` + + EmbeddedPeerPort uint16 `long:"embedded_peer_port" description:"Peer port to use for the embedded instance. Note: use for testing only."` Host string `long:"host" description:"Etcd database host."` diff --git a/channeldb/kvdb/etcd/embed.go b/channeldb/kvdb/etcd/embed.go index b4c5d37b..5b744bc0 100644 --- a/channeldb/kvdb/etcd/embed.go +++ b/channeldb/kvdb/etcd/embed.go @@ -61,7 +61,9 @@ func getFreePort() int { // NewEmbeddedEtcdInstance creates an embedded etcd instance for testing, // listening on random open ports. Returns the backend config and a cleanup // func that will stop the etcd instance. -func NewEmbeddedEtcdInstance(path string) (*BackendConfig, func(), error) { +func NewEmbeddedEtcdInstance(path string, clientPort, peerPort uint16) ( + *BackendConfig, func(), error) { + cfg := embed.NewConfig() cfg.Dir = path @@ -69,9 +71,17 @@ func NewEmbeddedEtcdInstance(path string) (*BackendConfig, func(), error) { cfg.MaxTxnOps = 8192 cfg.MaxRequestBytes = 16384 * 1024 - // Listen on random free ports. - clientURL := fmt.Sprintf("127.0.0.1:%d", getFreePort()) - peerURL := fmt.Sprintf("127.0.0.1:%d", getFreePort()) + // Listen on random free ports if no ports were specified. + if clientPort == 0 { + clientPort = uint16(getFreePort()) + } + + if peerPort == 0 { + peerPort = uint16(getFreePort()) + } + + clientURL := fmt.Sprintf("127.0.0.1:%d", clientPort) + peerURL := fmt.Sprintf("127.0.0.1:%d", peerPort) cfg.LCUrls = []url.URL{{Host: clientURL}} cfg.LPUrls = []url.URL{{Host: peerURL}} diff --git a/channeldb/kvdb/etcd/fixture_test.go b/channeldb/kvdb/etcd/fixture_test.go index 0df75d58..2fa0045f 100644 --- a/channeldb/kvdb/etcd/fixture_test.go +++ b/channeldb/kvdb/etcd/fixture_test.go @@ -32,7 +32,7 @@ type EtcdTestFixture struct { func NewTestEtcdInstance(t *testing.T, path string) (*BackendConfig, func()) { t.Helper() - config, cleanup, err := NewEmbeddedEtcdInstance(path) + config, cleanup, err := NewEmbeddedEtcdInstance(path, 0, 0) if err != nil { t.Fatalf("error while staring embedded etcd instance: %v", err) } diff --git a/channeldb/kvdb/kvdb_etcd.go b/channeldb/kvdb/kvdb_etcd.go index 32791bf6..8369a17c 100644 --- a/channeldb/kvdb/kvdb_etcd.go +++ b/channeldb/kvdb/kvdb_etcd.go @@ -37,10 +37,14 @@ func GetEtcdBackend(ctx context.Context, prefix string, // GetEtcdTestBackend creates an embedded etcd backend for testing // storig the database at the passed path. -func GetEtcdTestBackend(path, name string) (Backend, func(), error) { +func GetEtcdTestBackend(path string, clientPort, peerPort uint16) ( + Backend, func(), error) { + empty := func() {} - config, cleanup, err := etcd.NewEmbeddedEtcdInstance(path) + config, cleanup, err := etcd.NewEmbeddedEtcdInstance( + path, clientPort, peerPort, + ) if err != nil { return nil, empty, err } diff --git a/channeldb/kvdb/kvdb_no_etcd.go b/channeldb/kvdb/kvdb_no_etcd.go index 71090f47..373daeb4 100644 --- a/channeldb/kvdb/kvdb_no_etcd.go +++ b/channeldb/kvdb/kvdb_no_etcd.go @@ -22,6 +22,8 @@ func GetEtcdBackend(ctx context.Context, prefix string, // GetTestEtcdBackend is a stub returning nil, an empty closure and an // errEtcdNotAvailable error. -func GetEtcdTestBackend(path, name string) (Backend, func(), error) { +func GetEtcdTestBackend(path string, clientPort, peerPort uint16) ( + Backend, func(), error) { + return nil, func() {}, errEtcdNotAvailable } diff --git a/lncfg/db.go b/lncfg/db.go index e639ece1..ead5b20f 100644 --- a/lncfg/db.go +++ b/lncfg/db.go @@ -83,10 +83,15 @@ func (db *DB) GetBackends(ctx context.Context, dbPath string, if db.Backend == EtcdBackend { if db.Etcd.Embedded { - remoteDB, _, err = kvdb.GetEtcdTestBackend(dbPath, dbName) + remoteDB, _, err = kvdb.GetEtcdTestBackend( + dbPath, db.Etcd.EmbeddedClientPort, + db.Etcd.EmbeddedPeerPort, + ) } else { // Prefix will separate key/values in the db. - remoteDB, err = kvdb.GetEtcdBackend(ctx, networkName, db.Etcd) + remoteDB, err = kvdb.GetEtcdBackend( + ctx, networkName, db.Etcd, + ) } if err != nil { return nil, err diff --git a/sample-lnd.conf b/sample-lnd.conf index db84a01f..419699ce 100644 --- a/sample-lnd.conf +++ b/sample-lnd.conf @@ -984,6 +984,12 @@ litecoin.node=ltcd ; Useful for testing. ; db.etcd.embedded=false +; If non zero, LND will use this as client port for the embedded etcd instance. +; db.etcd.embedded_client_port=1234 + +; If non zero, LND will use this as peer port for the embedded etcd instance. +; db.etcd.embedded_peer_port=1235 + [bolt] ; If true, prevents the database from syncing its freelist to disk. ; db.bolt.nofreelistsync=1