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:
parent
23fcb59a2b
commit
b54f8a1b97
@ -10,6 +10,7 @@ import (
|
||||
|
||||
"github.com/btcsuite/btcd/btcec"
|
||||
"github.com/btcsuite/btcd/wire"
|
||||
"github.com/btcsuite/btcwallet/walletdb"
|
||||
"github.com/go-errors/errors"
|
||||
"github.com/lightningnetwork/lnd/channeldb/kvdb"
|
||||
"github.com/lightningnetwork/lnd/channeldb/migration12"
|
||||
@ -147,12 +148,44 @@ var (
|
||||
// schedules, and reputation data.
|
||||
type DB struct {
|
||||
kvdb.Backend
|
||||
|
||||
dbPath string
|
||||
graph *ChannelGraph
|
||||
clock clock.Clock
|
||||
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
|
||||
// to updates will take place as necessary.
|
||||
// TODO(bhandras): deprecate this function.
|
||||
|
@ -11,13 +11,24 @@ import (
|
||||
// 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.
|
||||
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
|
||||
// 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).
|
||||
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
|
||||
// individual Update transactions into a single write database transaction on
|
||||
@ -36,11 +47,27 @@ var Create = walletdb.Create
|
||||
// through read or read+write transactions.
|
||||
type Backend = walletdb.DB
|
||||
|
||||
// BackendWithStats is and interface to debug/uncover database access patterns.
|
||||
type BackendWithStats interface {
|
||||
// ExtendedBackend is and interface that supports View and Update and also able
|
||||
// to collect database access patterns.
|
||||
type ExtendedBackend interface {
|
||||
Backend
|
||||
|
||||
// PrintStats returns all collected stats pretty printed into a 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
|
||||
|
Loading…
Reference in New Issue
Block a user