kvdb+channeldb: create ExtendedBackend interface to allow rich tx logic

This commit adds the ExtendedBackend interface which is an extension to
the walletdb.DB interface. This paves the way to using etcd.db.View and
etcd.db.Update in the global View and Update functions without much code
rewrite.
This commit is contained in:
Andras Banki-Horvath 2020-05-08 17:50:13 +02:00
parent 23fcb59a2b
commit b54f8a1b97
2 changed files with 64 additions and 4 deletions

@ -10,6 +10,7 @@ import (
"github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/btcec"
"github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcd/wire"
"github.com/btcsuite/btcwallet/walletdb"
"github.com/go-errors/errors" "github.com/go-errors/errors"
"github.com/lightningnetwork/lnd/channeldb/kvdb" "github.com/lightningnetwork/lnd/channeldb/kvdb"
"github.com/lightningnetwork/lnd/channeldb/migration12" "github.com/lightningnetwork/lnd/channeldb/migration12"
@ -147,12 +148,44 @@ var (
// schedules, and reputation data. // schedules, and reputation data.
type DB struct { type DB struct {
kvdb.Backend kvdb.Backend
dbPath string dbPath string
graph *ChannelGraph graph *ChannelGraph
clock clock.Clock clock clock.Clock
dryRun bool dryRun bool
} }
// Update is a wrapper around walletdb.Update which calls into the extended
// backend when available. This call is needed to be able to cast DB to
// ExtendedBackend.
func (db *DB) Update(f func(tx walletdb.ReadWriteTx) error) error {
if v, ok := db.Backend.(kvdb.ExtendedBackend); ok {
return v.Update(f)
}
return walletdb.Update(db, f)
}
// View is a wrapper around walletdb.View which calls into the extended
// backend when available. This call is needed to be able to cast DB to
// ExtendedBackend.
func (db *DB) View(f func(tx walletdb.ReadTx) error) error {
if v, ok := db.Backend.(kvdb.ExtendedBackend); ok {
return v.View(f)
}
return walletdb.View(db, f)
}
// PrintStats calls into the extended backend if available. This call is needed
// to be able to cast DB to ExtendedBackend.
func (db *DB) PrintStats() string {
if v, ok := db.Backend.(kvdb.ExtendedBackend); ok {
return v.PrintStats()
}
return "unimplemented"
}
// Open opens or creates channeldb. Any necessary schemas migrations due // Open opens or creates channeldb. Any necessary schemas migrations due
// to updates will take place as necessary. // to updates will take place as necessary.
// TODO(bhandras): deprecate this function. // TODO(bhandras): deprecate this function.

@ -11,13 +11,24 @@ import (
// transaction is rolled back. If the rollback fails, the original error // transaction is rolled back. If the rollback fails, the original error
// returned by f is still returned. If the commit fails, the commit error is // returned by f is still returned. If the commit fails, the commit error is
// returned. // returned.
var Update = walletdb.Update func Update(db Backend, f func(tx RwTx) error) error {
if extendedDB, ok := db.(ExtendedBackend); ok {
return extendedDB.Update(f)
}
return walletdb.Update(db, f)
}
// View opens a database read transaction and executes the function f with the // View opens a database read transaction and executes the function f with the
// transaction passed as a parameter. After f exits, the transaction is rolled // transaction passed as a parameter. After f exits, the transaction is rolled
// back. If f errors, its error is returned, not a rollback error (if any // back. If f errors, its error is returned, not a rollback error (if any
// occur). // occur).
var View = walletdb.View func View(db Backend, f func(tx ReadTx) error) error {
if extendedDB, ok := db.(ExtendedBackend); ok {
return extendedDB.View(f)
}
return walletdb.View(db, f)
}
// Batch is identical to the Update call, but it attempts to combine several // Batch is identical to the Update call, but it attempts to combine several
// individual Update transactions into a single write database transaction on // individual Update transactions into a single write database transaction on
@ -36,11 +47,27 @@ var Create = walletdb.Create
// through read or read+write transactions. // through read or read+write transactions.
type Backend = walletdb.DB type Backend = walletdb.DB
// BackendWithStats is and interface to debug/uncover database access patterns. // ExtendedBackend is and interface that supports View and Update and also able
type BackendWithStats interface { // to collect database access patterns.
type ExtendedBackend interface {
Backend Backend
// PrintStats returns all collected stats pretty printed into a string.
PrintStats() string PrintStats() string
// View opens a database read transaction and executes the function f with
// the transaction passed as a parameter. After f exits, the transaction is
// rolled back. If f errors, its error is returned, not a rollback error
// (if any occur).
View(f func(tx walletdb.ReadTx) error) error
// Update opens a database read/write transaction and executes the function
// f with the transaction passed as a parameter. After f exits, if f did not
// error, the transaction is committed. Otherwise, if f did error, the
// transaction is rolled back. If the rollback fails, the original error
// returned by f is still returned. If the commit fails, the commit error is
// returned.
Update(f func(tx walletdb.ReadWriteTx) error) error
} }
// Open opens an existing database for the specified type. The arguments are // Open opens an existing database for the specified type. The arguments are