channeldb+graphdb: init graph DB outside of channel db
We also now use the graph DB's own optional functions. An instance of the graph is currently still passed to the channeldb's `CreateWithBackend` function. This will be removed in a later commit once the two have been completely disjoint.
This commit is contained in:
11 files changed
+98
-203
No files matched your search
+19
-22
@@ -351,24 +351,24 @@ type DB struct {
|
||||
// to updates will take place as necessary.
|
||||
// TODO(bhandras): deprecate this function.
|
||||
func Open(dbPath string, modifiers ...OptionModifier) (*DB, error) {
|
||||
opts := DefaultOptions()
|
||||
for _, modifier := range modifiers {
|
||||
modifier(&opts)
|
||||
}
|
||||
|
||||
backend, err := kvdb.GetBoltBackend(&kvdb.BoltBackendConfig{
|
||||
DBPath: dbPath,
|
||||
DBFileName: dbName,
|
||||
NoFreelistSync: opts.NoFreelistSync,
|
||||
AutoCompact: opts.AutoCompact,
|
||||
AutoCompactMinAge: opts.AutoCompactMinAge,
|
||||
DBTimeout: opts.DBTimeout,
|
||||
NoFreelistSync: true,
|
||||
AutoCompact: false,
|
||||
AutoCompactMinAge: kvdb.DefaultBoltAutoCompactMinAge,
|
||||
DBTimeout: kvdb.DefaultDBTimeout,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
db, err := CreateWithBackend(backend, modifiers...)
|
||||
graphDB, err := graphdb.NewChannelGraph(backend)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
db, err := CreateWithBackend(backend, graphDB, modifiers...)
|
||||
if err == nil {
|
||||
db.dbPath = dbPath
|
||||
}
|
||||
@@ -377,7 +377,7 @@ func Open(dbPath string, modifiers ...OptionModifier) (*DB, error) {
|
||||
|
||||
// CreateWithBackend creates channeldb instance using the passed kvdb.Backend.
|
||||
// Any necessary schemas migrations due to updates will take place as necessary.
|
||||
func CreateWithBackend(backend kvdb.Backend,
|
||||
func CreateWithBackend(backend kvdb.Backend, graph *graphdb.ChannelGraph,
|
||||
modifiers ...OptionModifier) (*DB, error) {
|
||||
|
||||
opts := DefaultOptions()
|
||||
@@ -404,21 +404,12 @@ func CreateWithBackend(backend kvdb.Backend,
|
||||
keepFailedPaymentAttempts: opts.keepFailedPaymentAttempts,
|
||||
storeFinalHtlcResolutions: opts.storeFinalHtlcResolutions,
|
||||
noRevLogAmtData: opts.NoRevLogAmtData,
|
||||
graph: graph,
|
||||
}
|
||||
|
||||
// Set the parent pointer (only used in tests).
|
||||
chanDB.channelStateDB.parent = chanDB
|
||||
|
||||
var err error
|
||||
chanDB.graph, err = graphdb.NewChannelGraph(
|
||||
backend, opts.RejectCacheSize, opts.ChannelCacheSize,
|
||||
opts.BatchCommitInterval, opts.PreAllocCacheNumNodes,
|
||||
opts.UseGraphCache, opts.NoMigration,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Synchronize the version of database and apply migrations if needed.
|
||||
if !opts.NoMigration {
|
||||
if err := chanDB.syncVersions(dbVersions); err != nil {
|
||||
@@ -1866,7 +1857,13 @@ func MakeTestDB(t *testing.T, modifiers ...OptionModifier) (*DB, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cdb, err := CreateWithBackend(backend, modifiers...)
|
||||
graphDB, err := graphdb.NewChannelGraph(backend)
|
||||
if err != nil {
|
||||
backendCleanup()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
cdb, err := CreateWithBackend(backend, graphDB, modifiers...)
|
||||
if err != nil {
|
||||
backendCleanup()
|
||||
return nil, err
|
||||
|
||||
@@ -51,7 +51,10 @@ func TestOpenWithCreate(t *testing.T) {
|
||||
require.NoError(t, err, "unable to get test db backend")
|
||||
t.Cleanup(cleanup)
|
||||
|
||||
cdb, err := CreateWithBackend(backend)
|
||||
graphDB, err := graphdb.NewChannelGraph(backend)
|
||||
require.NoError(t, err)
|
||||
|
||||
cdb, err := CreateWithBackend(backend, graphDB)
|
||||
require.NoError(t, err, "unable to create channeldb")
|
||||
if err := cdb.Close(); err != nil {
|
||||
t.Fatalf("unable to close channeldb: %v", err)
|
||||
@@ -87,7 +90,10 @@ func TestWipe(t *testing.T) {
|
||||
require.NoError(t, err, "unable to get test db backend")
|
||||
t.Cleanup(cleanup)
|
||||
|
||||
fullDB, err := CreateWithBackend(backend)
|
||||
graphDB, err := graphdb.NewChannelGraph(backend)
|
||||
require.NoError(t, err)
|
||||
|
||||
fullDB, err := CreateWithBackend(backend, graphDB)
|
||||
require.NoError(t, err, "unable to create channeldb")
|
||||
defer fullDB.Close()
|
||||
|
||||
|
||||
+13
-3
@@ -6,6 +6,7 @@ import (
|
||||
|
||||
"github.com/btcsuite/btcwallet/walletdb"
|
||||
"github.com/go-errors/errors"
|
||||
graphdb "github.com/lightningnetwork/lnd/graph/db"
|
||||
"github.com/lightningnetwork/lnd/kvdb"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
@@ -422,7 +423,10 @@ func TestMigrationReversion(t *testing.T) {
|
||||
backend, cleanup, err := kvdb.GetTestBackend(tempDirName, "cdb")
|
||||
require.NoError(t, err, "unable to get test db backend")
|
||||
|
||||
cdb, err := CreateWithBackend(backend)
|
||||
graphDB, err := graphdb.NewChannelGraph(backend)
|
||||
require.NoError(t, err)
|
||||
|
||||
cdb, err := CreateWithBackend(backend, graphDB)
|
||||
if err != nil {
|
||||
cleanup()
|
||||
t.Fatalf("unable to open channeldb: %v", err)
|
||||
@@ -448,7 +452,10 @@ func TestMigrationReversion(t *testing.T) {
|
||||
require.NoError(t, err, "unable to get test db backend")
|
||||
t.Cleanup(cleanup)
|
||||
|
||||
_, err = CreateWithBackend(backend)
|
||||
graphDB, err = graphdb.NewChannelGraph(backend)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = CreateWithBackend(backend, graphDB)
|
||||
if err != ErrDBReversion {
|
||||
t.Fatalf("unexpected error when opening channeldb, "+
|
||||
"want: %v, got: %v", ErrDBReversion, err)
|
||||
@@ -676,8 +683,11 @@ func TestMarkerAndTombstone(t *testing.T) {
|
||||
err = db.View(EnsureNoTombstone, func() {})
|
||||
require.ErrorContains(t, err, string(tombstoneText))
|
||||
|
||||
graphDB, err := graphdb.NewChannelGraph(db.Backend)
|
||||
require.NoError(t, err)
|
||||
|
||||
// Now that the DB has a tombstone, we should no longer be able to open
|
||||
// it once we close it.
|
||||
_, err = CreateWithBackend(db.Backend)
|
||||
_, err = CreateWithBackend(db.Backend, graphDB)
|
||||
require.ErrorContains(t, err, string(tombstoneText))
|
||||
}
|
||||
@@ -1,10 +1,7 @@
|
||||
package channeldb
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/lightningnetwork/lnd/clock"
|
||||
"github.com/lightningnetwork/lnd/kvdb"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -35,30 +32,8 @@ type OptionalMiragtionConfig struct {
|
||||
|
||||
// Options holds parameters for tuning and customizing a channeldb.DB.
|
||||
type Options struct {
|
||||
kvdb.BoltBackendConfig
|
||||
OptionalMiragtionConfig
|
||||
|
||||
// RejectCacheSize is the maximum number of rejectCacheEntries to hold
|
||||
// in the rejection cache.
|
||||
RejectCacheSize int
|
||||
|
||||
// ChannelCacheSize is the maximum number of ChannelEdges to hold in the
|
||||
// channel cache.
|
||||
ChannelCacheSize int
|
||||
|
||||
// BatchCommitInterval is the maximum duration the batch schedulers will
|
||||
// wait before attempting to commit a pending set of updates.
|
||||
BatchCommitInterval time.Duration
|
||||
|
||||
// PreAllocCacheNumNodes is the number of nodes we expect to be in the
|
||||
// graph cache, so we can pre-allocate the map accordingly.
|
||||
PreAllocCacheNumNodes int
|
||||
|
||||
// UseGraphCache denotes whether the in-memory graph cache should be
|
||||
// used or a fallback version that uses the underlying database for
|
||||
// path finding.
|
||||
UseGraphCache bool
|
||||
|
||||
// NoMigration specifies that underlying backend was opened in read-only
|
||||
// mode and migrations shouldn't be performed. This can be useful for
|
||||
// applications that use the channeldb package as a library.
|
||||
@@ -87,17 +62,7 @@ type Options struct {
|
||||
// DefaultOptions returns an Options populated with default values.
|
||||
func DefaultOptions() Options {
|
||||
return Options{
|
||||
BoltBackendConfig: kvdb.BoltBackendConfig{
|
||||
NoFreelistSync: true,
|
||||
AutoCompact: false,
|
||||
AutoCompactMinAge: kvdb.DefaultBoltAutoCompactMinAge,
|
||||
DBTimeout: kvdb.DefaultDBTimeout,
|
||||
},
|
||||
OptionalMiragtionConfig: OptionalMiragtionConfig{},
|
||||
RejectCacheSize: DefaultRejectCacheSize,
|
||||
ChannelCacheSize: DefaultChannelCacheSize,
|
||||
PreAllocCacheNumNodes: DefaultPreAllocCacheNumNodes,
|
||||
UseGraphCache: true,
|
||||
NoMigration: false,
|
||||
clock: clock.NewDefaultClock(),
|
||||
}
|
||||
@@ -106,34 +71,6 @@ func DefaultOptions() Options {
|
||||
// OptionModifier is a function signature for modifying the default Options.
|
||||
type OptionModifier func(*Options)
|
||||
|
||||
// OptionSetRejectCacheSize sets the RejectCacheSize to n.
|
||||
func OptionSetRejectCacheSize(n int) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.RejectCacheSize = n
|
||||
}
|
||||
}
|
||||
|
||||
// OptionSetChannelCacheSize sets the ChannelCacheSize to n.
|
||||
func OptionSetChannelCacheSize(n int) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.ChannelCacheSize = n
|
||||
}
|
||||
}
|
||||
|
||||
// OptionSetPreAllocCacheNumNodes sets the PreAllocCacheNumNodes to n.
|
||||
func OptionSetPreAllocCacheNumNodes(n int) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.PreAllocCacheNumNodes = n
|
||||
}
|
||||
}
|
||||
|
||||
// OptionSetUseGraphCache sets the UseGraphCache option to the given value.
|
||||
func OptionSetUseGraphCache(use bool) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.UseGraphCache = use
|
||||
}
|
||||
}
|
||||
|
||||
// OptionNoRevLogAmtData sets the NoRevLogAmtData option to the given value. If
|
||||
// it is set to true then amount data will not be stored in the revocation log.
|
||||
func OptionNoRevLogAmtData(noAmtData bool) OptionModifier {
|
||||
@@ -142,36 +79,6 @@ func OptionNoRevLogAmtData(noAmtData bool) OptionModifier {
|
||||
}
|
||||
}
|
||||
|
||||
// OptionSetSyncFreelist allows the database to sync its freelist.
|
||||
func OptionSetSyncFreelist(b bool) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.NoFreelistSync = !b
|
||||
}
|
||||
}
|
||||
|
||||
// OptionAutoCompact turns on automatic database compaction on startup.
|
||||
func OptionAutoCompact() OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.AutoCompact = true
|
||||
}
|
||||
}
|
||||
|
||||
// OptionAutoCompactMinAge sets the minimum age for automatic database
|
||||
// compaction.
|
||||
func OptionAutoCompactMinAge(minAge time.Duration) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.AutoCompactMinAge = minAge
|
||||
}
|
||||
}
|
||||
|
||||
// OptionSetBatchCommitInterval sets the batch commit interval for the internval
|
||||
// batch schedulers.
|
||||
func OptionSetBatchCommitInterval(interval time.Duration) OptionModifier {
|
||||
return func(o *Options) {
|
||||
o.BatchCommitInterval = interval
|
||||
}
|
||||
}
|
||||
|
||||
// OptionNoMigration allows the database to be opened in read only mode by
|
||||
// disabling migrations.
|
||||
func OptionNoMigration(b bool) OptionModifier {
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
package channeldb_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/lightningnetwork/lnd/channeldb"
|
||||
"github.com/lightningnetwork/lnd/kvdb"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// TestDefaultOptions tests the default options are created as intended.
|
||||
func TestDefaultOptions(t *testing.T) {
|
||||
opts := channeldb.DefaultOptions()
|
||||
|
||||
require.True(t, opts.NoFreelistSync)
|
||||
require.False(t, opts.AutoCompact)
|
||||
require.Equal(
|
||||
t, kvdb.DefaultBoltAutoCompactMinAge, opts.AutoCompactMinAge,
|
||||
)
|
||||
require.Equal(t, kvdb.DefaultDBTimeout, opts.DBTimeout)
|
||||
require.Equal(
|
||||
t, channeldb.DefaultRejectCacheSize, opts.RejectCacheSize,
|
||||
)
|
||||
require.Equal(
|
||||
t, channeldb.DefaultChannelCacheSize, opts.ChannelCacheSize,
|
||||
)
|
||||
}
|
||||
Reference in new issue
Block a user