2020-03-13 17:05:28 +01:00
package lncfg
import (
2020-05-25 18:08:58 +02:00
"context"
2020-03-13 17:05:28 +01:00
"fmt"
2020-11-25 01:40:54 +01:00
"time"
2020-03-13 17:05:28 +01:00
"github.com/lightningnetwork/lnd/channeldb/kvdb"
)
const (
2020-11-25 01:40:54 +01:00
dbName = "channel.db"
BoltBackend = "bolt"
EtcdBackend = "etcd"
DefaultBatchCommitInterval = 500 * time . Millisecond
2020-03-13 17:05:28 +01:00
)
// DB holds database configuration for LND.
type DB struct {
Backend string ` long:"backend" description:"The selected database backend." `
2020-11-25 01:40:54 +01:00
BatchCommitInterval time . Duration ` long:"batch-commit-interval" description:"The maximum duration the channel graph batch schedulers will wait before attempting to commit a batch of pending updates. This can be tradeoff database contenion for commit latency." `
2020-05-15 16:59:37 +02:00
Etcd * kvdb . EtcdConfig ` group:"etcd" namespace:"etcd" description:"Etcd settings." `
2020-03-13 17:05:28 +01:00
2020-05-15 16:59:37 +02:00
Bolt * kvdb . BoltConfig ` group:"bolt" namespace:"bolt" description:"Bolt settings." `
2020-03-13 17:05:28 +01:00
}
// NewDB creates and returns a new default DB config.
func DefaultDB ( ) * DB {
return & DB {
2020-11-25 01:40:54 +01:00
Backend : BoltBackend ,
BatchCommitInterval : DefaultBatchCommitInterval ,
2020-11-09 10:21:23 +01:00
Bolt : & kvdb . BoltConfig {
AutoCompactMinAge : kvdb . DefaultBoltAutoCompactMinAge ,
} ,
2020-03-13 17:05:28 +01:00
}
}
// Validate validates the DB config.
func ( db * DB ) Validate ( ) error {
switch db . Backend {
2020-08-05 00:34:29 +02:00
case BoltBackend :
2020-03-13 17:05:28 +01:00
2020-08-05 00:34:29 +02:00
case EtcdBackend :
2020-06-18 21:42:59 +02:00
if ! db . Etcd . Embedded && db . Etcd . Host == "" {
2020-03-13 17:05:28 +01:00
return fmt . Errorf ( "etcd host must be set" )
}
default :
return fmt . Errorf ( "unknown backend, must be either \"%v\" or \"%v\"" ,
2020-08-05 00:34:29 +02:00
BoltBackend , EtcdBackend )
2020-03-13 17:05:28 +01:00
}
return nil
}
2020-05-07 05:48:05 +02:00
// DatabaseBackends is a two-tuple that holds the set of active database
// backends for the daemon. The two backends we expose are the local database
// backend, and the remote backend. The LocalDB attribute will always be
// populated. However, the remote DB will only be set if a replicated database
// is active.
type DatabaseBackends struct {
// LocalDB points to the local non-replicated backend.
LocalDB kvdb . Backend
// RemoteDB points to a possibly networked replicated backend. If no
// replicated backend is active, then this pointer will be nil.
RemoteDB kvdb . Backend
}
// GetBackends returns a set of kvdb.Backends as set in the DB config. The
// local database will ALWAYS be non-nil, while the remote database will only
// be populated if etcd is specified.
func ( db * DB ) GetBackends ( ctx context . Context , dbPath string ,
networkName string ) ( * DatabaseBackends , error ) {
var (
localDB , remoteDB kvdb . Backend
err error
)
2020-05-20 14:04:34 +02:00
2020-08-05 00:34:29 +02:00
if db . Backend == EtcdBackend {
2020-06-18 21:42:59 +02:00
if db . Etcd . Embedded {
remoteDB , _ , err = kvdb . GetEtcdTestBackend ( dbPath , dbName )
} else {
// Prefix will separate key/values in the db.
remoteDB , err = kvdb . GetEtcdBackend ( ctx , networkName , db . Etcd )
}
2020-05-07 05:48:05 +02:00
if err != nil {
return nil , err
}
}
2020-11-09 10:21:25 +01:00
localDB , err = kvdb . GetBoltBackend ( & kvdb . BoltBackendConfig {
DBPath : dbPath ,
DBFileName : dbName ,
NoFreelistSync : ! db . Bolt . SyncFreelist ,
AutoCompact : db . Bolt . AutoCompact ,
AutoCompactMinAge : db . Bolt . AutoCompactMinAge ,
} )
2020-05-07 05:48:05 +02:00
if err != nil {
return nil , err
2020-03-13 17:05:28 +01:00
}
2020-05-07 05:48:05 +02:00
return & DatabaseBackends {
LocalDB : localDB ,
RemoteDB : remoteDB ,
} , nil
2020-03-13 17:05:28 +01:00
}
// Compile-time constraint to ensure Workers implements the Validator interface.
var _ Validator = ( * DB ) ( nil )