2020-03-13 19:05:28 +03:00
|
|
|
package lncfg
|
|
|
|
|
|
|
|
import (
|
2020-05-25 19:08:58 +03:00
|
|
|
"context"
|
2020-03-13 19:05:28 +03:00
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/lightningnetwork/lnd/channeldb/kvdb"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
dbName = "channel.db"
|
2020-08-05 01:34:29 +03:00
|
|
|
BoltBackend = "bolt"
|
|
|
|
EtcdBackend = "etcd"
|
2020-03-13 19:05:28 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
// DB holds database configuration for LND.
|
|
|
|
type DB struct {
|
|
|
|
Backend string `long:"backend" description:"The selected database backend."`
|
|
|
|
|
2020-05-15 17:59:37 +03:00
|
|
|
Etcd *kvdb.EtcdConfig `group:"etcd" namespace:"etcd" description:"Etcd settings."`
|
2020-03-13 19:05:28 +03:00
|
|
|
|
2020-05-15 17:59:37 +03:00
|
|
|
Bolt *kvdb.BoltConfig `group:"bolt" namespace:"bolt" description:"Bolt settings."`
|
2020-03-13 19:05:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// NewDB creates and returns a new default DB config.
|
|
|
|
func DefaultDB() *DB {
|
|
|
|
return &DB{
|
2020-08-05 01:34:29 +03:00
|
|
|
Backend: BoltBackend,
|
2020-11-09 12:21:23 +03:00
|
|
|
Bolt: &kvdb.BoltConfig{
|
|
|
|
AutoCompactMinAge: kvdb.DefaultBoltAutoCompactMinAge,
|
|
|
|
},
|
2020-03-13 19:05:28 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Validate validates the DB config.
|
|
|
|
func (db *DB) Validate() error {
|
|
|
|
switch db.Backend {
|
2020-08-05 01:34:29 +03:00
|
|
|
case BoltBackend:
|
2020-03-13 19:05:28 +03:00
|
|
|
|
2020-08-05 01:34:29 +03:00
|
|
|
case EtcdBackend:
|
2020-03-13 19:05:28 +03:00
|
|
|
if db.Etcd.Host == "" {
|
|
|
|
return fmt.Errorf("etcd host must be set")
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
return fmt.Errorf("unknown backend, must be either \"%v\" or \"%v\"",
|
2020-08-05 01:34:29 +03:00
|
|
|
BoltBackend, EtcdBackend)
|
2020-03-13 19:05:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-05-07 06:48:05 +03: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 15:04:34 +03:00
|
|
|
|
2020-08-05 01:34:29 +03:00
|
|
|
if db.Backend == EtcdBackend {
|
2020-05-12 17:02:46 +03:00
|
|
|
// Prefix will separate key/values in the db.
|
2020-05-07 06:48:05 +03:00
|
|
|
remoteDB, err = kvdb.GetEtcdBackend(ctx, networkName, db.Etcd)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-11-09 12:21:25 +03: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 06:48:05 +03:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
2020-03-13 19:05:28 +03:00
|
|
|
}
|
|
|
|
|
2020-05-07 06:48:05 +03:00
|
|
|
return &DatabaseBackends{
|
|
|
|
LocalDB: localDB,
|
|
|
|
RemoteDB: remoteDB,
|
|
|
|
}, nil
|
2020-03-13 19:05:28 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Compile-time constraint to ensure Workers implements the Validator interface.
|
|
|
|
var _ Validator = (*DB)(nil)
|