graph/db: expand TestPopulateViaMigration for easy testing
What changed, and why it matters
This commit only expands an existing developer helper test in the LND codebase. It adds configuration options so engineers can locally test migrating graph data between different database backends (bbolt, sqlite, postgres). The test is skipped by default and does not change any production code, network behavior, or user-facing functionality. There is no security issue here.
No action needed. This is a test-only change with no security relevance.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff modifies graph/db/benchmark_test.go. It refactors connectBBoltDB to extract a kvdbBBolt helper, then rewrites TestPopulateViaMigration to make the source/destination database types, paths, and connection strings configurable via commented constants. The test still starts with t.Skipf and is explicitly documented as a helper test not run by default. No runtime logic, migrations, or database schemas are changed.
Changed components
graph/db/benchmark_test.goInspect captured patch +100 / −18
diff --git a/graph/db/benchmark_test.go b/graph/db/benchmark_test.go
index bdb7954..3d690e3 100644
--- a/graph/db/benchmark_test.go
+++ b/graph/db/benchmark_test.go
@@ -240,6 +240,11 @@ func connectKVDBSqlite(t testing.TB, dbPath, fileName string) V1Store {
// connectBBoltDB creates a new BBolt database connection for testing.
func connectBBoltDB(t testing.TB, dbPath, fileName string) V1Store {
+ return newKVStore(t, kvdbBBolt(t, dbPath, fileName))
+}
+
+// kvdbBBolt creates a new bbolt backend for testing.
+func kvdbBBolt(t testing.TB, dbPath, fileName string) kvdb.Backend {
cfg := &kvdb.BoltBackendConfig{
DBPath: dbPath,
DBFileName: fileName,
@@ -252,7 +257,7 @@ func connectBBoltDB(t testing.TB, dbPath, fileName string) V1Store {
kvStore, err := kvdb.GetBoltBackend(cfg)
require.NoError(t, err)
- return newKVStore(t, kvStore)
+ return kvStore
}
// newKVStore creates a new KVStore instance for testing using a provided
@@ -425,45 +430,122 @@ func TestPopulateDBs(t *testing.T) {
}
// TestPopulateViaMigration is a helper test that can be used to populate a
-// local native SQL graph from a kvdb-sql graph using the migration logic.
+// local native SQL graph from a kvdbgraph using the migration logic.
//
// NOTE: the testPostgres variable can be set to true to test with a
// postgres backend instead of the kvdb-sqlite backend.
//
// NOTE: this is a helper test and is not run by default.
func TestPopulateViaMigration(t *testing.T) {
+ // ======= STEP 0 ===========
+ // Comment out this SKipf line.
t.Skipf("Skipping local helper test")
- // Set this to true if you want to test with a postgres backend.
- // By default, we use a kvdb-sqlite backend.
- testPostgres := false
+ const (
+ srcBBolt = "kvdb-bbolt"
+ srcSQLite = "kvdb-sqlite"
+ srcPostgres = "kvdb-postgres"
+ )
- ctx := context.Background()
+ // ======= STEP 1 ===========
+ // Set your chosen SOURCE type by uncommenting the corresponding line
+ // below. By default, a kvdb-sqlite source is chosen.
+ srcDB := srcSQLite
+ // srcDB := srcBBolt
+ // srcDB := srcPostgres
+
+ // ======= STEP 2 ============
+ // Set this variable to the correct genesis hash of the source
+ // DB. By default, mainnet is assumed.
+ chain := *chaincfg.MainNetParams.GenesisHash
+
+ // ======= STEP 3 (ignore if source is postgres) ==============
+ // If your source destination is bbolt or sqlite, then set this to the
+ // path where your source database can be found.
+ const sourceDBPath = "testdata"
+
+ // ======= STEP 4 (only if source is bbolt!) ============
+ // If your source destination is bbolt, then set this to the name of
+ // the bbolt file that contains the channel graph data.
+ const sourceBBoltName = "channel.db"
+
+ // ======= STEP 5 (only if source is sqlite!) ============
+ // If your source destination is sqlite, then set this to the name of
+ // the sqlite file that contains the channel graph data.
+ const sourceSQLiteName = "channel.sqlite"
+
+ // ======= STEP 6 (only if source is postgres!) ============
+ // Set the DNS of your kvdb postgres instance below. This should be the
+ // same as what you have set in the config of the LND node that
+ // populated the instance (ie, whatever your --db.postgres.dsn is set
+ // to).
+ const kvdbPostgresDNS = "postgres://user@host/db_name"
+
+ // ======== STEP 7 ========================
+ // Finally, pick your destination DB! You can choose either SQLite or
+ // Postgres.
+ testSQLite := true
+
+ // ======== STEP 8 (only if destination is sqlite) ========
+ // Set the path where you want to create the destination SQLite
+ // database. This should be a directory that exists and is writable.
+ const destSQLitePath = "testdata"
+
+ // ======== STEP 9 (only if destination is sqlite) ========
+ // Pick a name for your destination SQLite database file.
+ // NOTE: if you run this test again, delete the previously created
+ // file first.
+ const destSQLiteFile = "lnd-graph-test.sqlite"
+
+ // ======== STEP 10 (only if destination is postgres) ========
+ // NB: this has some additional steps:
+ // 1. First, connect to your destination postgres instance: example:
+ // $ psql -U ellemouton -d postgres
+ // 2. Now, create the test database:
+ // CREATE DATABASE graphtest;
+ // NOTE: if you restart this test for postgres, it helps to first drop
+ // the new database & recreate it.
+ // NOTE: the database name that you use above must be whatever you will
+ // use in the DNS you set below.
+ const sqlPostgresDNS = "postgres://user@host/graphtest"
+
+ // ======= YOUR WORK IS DONE =============
+
+ // Connect to source database.
+ var srcKVDB kvdb.Backend
+ switch srcDB {
+ case srcBBolt:
+ srcKVDB = kvdbBBolt(t, sourceDBPath, sourceBBoltName)
+ case srcSQLite:
+ srcKVDB = kvdbSqlite(t, sourceDBPath, sourceSQLiteName)
+ case srcPostgres:
+ srcKVDB = kvdbPostgres(t, kvdbPostgresDNS)
+ default:
+ t.Fatalf("Unsupported source database backend: %s", srcDB)
+ }
+
+ // Connect to destination database.
+ cfg := sqldb.DefaultSQLiteConfig()
+ dstSQL := sqlSQLite(t, destSQLitePath, destSQLiteFile)
+ if !testSQLite {
+ cfg = sqldb.DefaultPostgresConfig()
+ dstSQL = sqlPostgres(t, sqlPostgresDNS)
+ }
// Set up a logger so we can see the migration progress.
logger := btclog.NewDefaultHandler(os.Stdout)
UseLogger(btclog.NewSLogger(logger))
log.SetLevel(btclog.LevelDebug)
- var (
- cfg = sqldb.DefaultSQLiteConfig()
- srcKVDB = kvdbSqlite(t, kvdbSqlitePath, kvdbSqliteFile)
- dstSQL = sqlSQLite(t, nativeSQLSqlitePath, nativeSQLSqliteFile)
- )
- if testPostgres {
- cfg = sqldb.DefaultPostgresConfig()
- srcKVDB = kvdbPostgres(t, kvdbPostgresDNS)
- dstSQL = sqlPostgres(t, nativeSQLPostgresDNS)
- }
-
// Use the graph migration to populate the SQL graph from the
// kvdb graph.
+ ctx := context.Background()
err := dstSQL.ExecTx(
ctx, sqldb.WriteTxOpt(), func(queries SQLQueries) error {
return MigrateGraphToSQL(
ctx, &SQLStoreConfig{
QueryCfg: cfg,
- ChainHash: dbTestChain,
+ ChainHash: chain,
}, srcKVDB, queries,
)
}, func() {},
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.