Merge pull request #6084 from guggero/backend-readonly

channeldb: allow to be used read-only in external tools
This commit is contained in:
Oliver Gugger authored and GitHub committed 2021-12-13 14:06:27 +01:00
commit 22607a1c53
6 files changed
+36 -13

No files matched your search

+12 -8
View File
@@ -263,15 +263,17 @@ func Open(dbPath string, modifiers ...OptionModifier) (*DB, error) {
// CreateWithBackend creates channeldb instance using the passed kvdb.Backend. // CreateWithBackend creates channeldb instance using the passed kvdb.Backend.
// Any necessary schemas migrations due to updates will take place as necessary. // Any necessary schemas migrations due to updates will take place as necessary.
func CreateWithBackend(backend kvdb.Backend, modifiers ...OptionModifier) (*DB, error) { func CreateWithBackend(backend kvdb.Backend, modifiers ...OptionModifier) (*DB, error) {
if err := initChannelDB(backend); err != nil {
return nil, err
}
opts := DefaultOptions() opts := DefaultOptions()
for _, modifier := range modifiers { for _, modifier := range modifiers {
modifier(&opts) modifier(&opts)
} }
if !opts.NoMigration {
if err := initChannelDB(backend); err != nil {
return nil, err
}
}
chanDB := &DB{ chanDB := &DB{
Backend: backend, Backend: backend,
channelStateDB: &ChannelStateDB{ channelStateDB: &ChannelStateDB{
@@ -291,16 +293,18 @@ func CreateWithBackend(backend kvdb.Backend, modifiers ...OptionModifier) (*DB,
chanDB.graph, err = NewChannelGraph( chanDB.graph, err = NewChannelGraph(
backend, opts.RejectCacheSize, opts.ChannelCacheSize, backend, opts.RejectCacheSize, opts.ChannelCacheSize,
opts.BatchCommitInterval, opts.PreAllocCacheNumNodes, opts.BatchCommitInterval, opts.PreAllocCacheNumNodes,
opts.UseGraphCache, opts.UseGraphCache, opts.NoMigration,
) )
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Synchronize the version of database and apply migrations if needed. // Synchronize the version of database and apply migrations if needed.
if err := chanDB.syncVersions(dbVersions); err != nil { if !opts.NoMigration {
backend.Close() if err := chanDB.syncVersions(dbVersions); err != nil {
return nil, err backend.Close()
return nil, err
}
} }
return chanDB, nil return chanDB, nil
+5 -3
View File
@@ -189,10 +189,12 @@ type ChannelGraph struct {
// returned instance has its own unique reject cache and channel cache. // returned instance has its own unique reject cache and channel cache.
func NewChannelGraph(db kvdb.Backend, rejectCacheSize, chanCacheSize int, func NewChannelGraph(db kvdb.Backend, rejectCacheSize, chanCacheSize int,
batchCommitInterval time.Duration, preAllocCacheNumNodes int, batchCommitInterval time.Duration, preAllocCacheNumNodes int,
useGraphCache bool) (*ChannelGraph, error) { useGraphCache, noMigrations bool) (*ChannelGraph, error) {
if err := initChannelGraph(db); err != nil { if !noMigrations {
return nil, err if err := initChannelGraph(db); err != nil {
return nil, err
}
} }
g := &ChannelGraph{ g := &ChannelGraph{
+1 -1
View File
@@ -77,7 +77,7 @@ func MakeTestGraph(modifiers ...OptionModifier) (*ChannelGraph, func(), error) {
graph, err := NewChannelGraph( graph, err := NewChannelGraph(
backend, opts.RejectCacheSize, opts.ChannelCacheSize, backend, opts.RejectCacheSize, opts.ChannelCacheSize,
opts.BatchCommitInterval, opts.PreAllocCacheNumNodes, opts.BatchCommitInterval, opts.PreAllocCacheNumNodes,
true, true, false,
) )
if err != nil { if err != nil {
backendCleanup() backendCleanup()
+14
View File
@@ -50,6 +50,11 @@ type Options struct {
// path finding. // path finding.
UseGraphCache bool 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.
NoMigration bool
// clock is the time source used by the database. // clock is the time source used by the database.
clock clock.Clock clock clock.Clock
@@ -71,6 +76,7 @@ func DefaultOptions() Options {
ChannelCacheSize: DefaultChannelCacheSize, ChannelCacheSize: DefaultChannelCacheSize,
PreAllocCacheNumNodes: DefaultPreAllocCacheNumNodes, PreAllocCacheNumNodes: DefaultPreAllocCacheNumNodes,
UseGraphCache: true, UseGraphCache: true,
NoMigration: false,
clock: clock.NewDefaultClock(), clock: clock.NewDefaultClock(),
} }
} }
@@ -136,6 +142,14 @@ func OptionSetBatchCommitInterval(interval time.Duration) OptionModifier {
} }
} }
// OptionNoMigration allows the database to be opened in read only mode by
// disabling migrations.
func OptionNoMigration(b bool) OptionModifier {
return func(o *Options) {
o.NoMigration = b
}
}
// OptionClock sets a non-default clock dependency. // OptionClock sets a non-default clock dependency.
func OptionClock(clock clock.Clock) OptionModifier { func OptionClock(clock clock.Clock) OptionModifier {
return func(o *Options) { return func(o *Options) {
@@ -16,6 +16,9 @@
for running lnd alongside a bitcoind service is now provided in for running lnd alongside a bitcoind service is now provided in
`contrib/init/lnd.service`. `contrib/init/lnd.service`.
* [Allow disabling migrations if the database backend passed to `channeldb` was
opened in read-only mode](https://github.com/lightningnetwork/lnd/pull/6084).
## Code Health ## Code Health
### Code cleanup, refactor, typo fixes ### Code cleanup, refactor, typo fixes
+1 -1
View File
@@ -175,7 +175,7 @@ func makeTestGraph(useCache bool) (*channeldb.ChannelGraph, kvdb.Backend,
graph, err := channeldb.NewChannelGraph( graph, err := channeldb.NewChannelGraph(
backend, opts.RejectCacheSize, opts.ChannelCacheSize, backend, opts.RejectCacheSize, opts.ChannelCacheSize,
opts.BatchCommitInterval, opts.PreAllocCacheNumNodes, opts.BatchCommitInterval, opts.PreAllocCacheNumNodes,
useCache, useCache, false,
) )
if err != nil { if err != nil {
cleanUp() cleanUp()