From b9296d627c02899c502ec3c0f0dfc77c970ab851 Mon Sep 17 00:00:00 2001 From: Benoit Lavenier <benoit.lavenier@e-is.pro> Date: Mon, 5 Jun 2023 11:17:46 +0200 Subject: [PATCH] fix(dal) Remove unused triggerInit(), and small code refactoring --- app/lib/dal/drivers/SQLiteDriver.ts | 4 +- app/lib/dal/fileDAL.ts | 45 ++++++++++--------- app/lib/dal/indexDAL/abstract/GenericDAO.ts | 4 -- app/lib/dal/indexDAL/abstract/PeerDAO.ts | 4 -- app/lib/dal/indexDAL/abstract/TxsDAO.ts | 5 +++ app/lib/dal/indexDAL/abstract/WalletDAO.ts | 4 -- .../dal/indexDAL/leveldb/LevelDBDividend.ts | 3 -- app/lib/dal/indexDAL/leveldb/LevelDBTable.ts | 1 - app/lib/dal/indexDAL/sqlite/SqliteDividend.ts | 2 - app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts | 2 - app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts | 2 - app/lib/dal/indexDAL/sqlite/SqlitePeers.ts | 2 - app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts | 2 - app/lib/dal/indexDAL/sqlite/SqliteTable.ts | 14 ++++-- .../dal/indexDAL/sqlite/SqliteTransactions.ts | 2 - app/lib/dal/indexDAL/sqlite/SqliteWallet.ts | 2 - app/modules/crawler/lib/sync.ts | 6 +++ .../crawler/lib/sync/v2/GlobalIndexStream.ts | 6 --- app/modules/prover/lib/proof.ts | 2 +- app/modules/upnp-provider.ts | 2 +- server.ts | 12 +++-- test/dal/basic-dal-tests.ts | 4 ++ 22 files changed, 62 insertions(+), 68 deletions(-) diff --git a/app/lib/dal/drivers/SQLiteDriver.ts b/app/lib/dal/drivers/SQLiteDriver.ts index 404371634..15a437ef5 100644 --- a/app/lib/dal/drivers/SQLiteDriver.ts +++ b/app/lib/dal/drivers/SQLiteDriver.ts @@ -103,8 +103,8 @@ export class SQLiteDriver { this.logger.debug('Database "%s" removed', this.path); } - get closed() { - return this.dbPromise; + isClosed() { + return !this.dbPromise; } async closeConnection(): Promise<void> { diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts index 2d7915db8..b680bf9f4 100644 --- a/app/lib/dal/fileDAL.ts +++ b/app/lib/dal/fileDAL.ts @@ -129,8 +129,7 @@ export class FileDAL implements ServerDAO { sindexDAL: SIndexDAO; cindexDAL: CIndexDAO; dividendDAL: DividendDAO; - newDals: { [k: string]: Initiable }; - private dals: (PeerDAO | WalletDAO | GenericDAO<any>)[]; + dals: { [k: string]: Initiable }; loadConfHook: (conf: ConfDTO) => Promise<void>; saveConfHook: (conf: ConfDTO) => Promise<ConfDTO>; @@ -174,7 +173,7 @@ export class FileDAL implements ServerDAO { this.cindexDAL = new LevelDBCindex(getLevelDB); this.dividendDAL = new LevelDBDividend(getLevelDB); - this.newDals = { + this.dals = { powDAL: this.powDAL, metaDAL: this.metaDAL, blockDAL: this.blockDAL, @@ -196,24 +195,9 @@ export class FileDAL implements ServerDAO { async init(conf: ConfDTO) { this.wotb = this.params.wotbf(); - this.dals = [ - this.blockDAL, - this.txsDAL, - this.peerDAL, - this.walletDAL, - this.bindexDAL, - this.mindexDAL, - this.iindexDAL, - this.sindexDAL, - this.cindexDAL, - this.dividendDAL, - ]; - for (const indexDAL of this.dals) { - indexDAL.triggerInit(); - } - const dalNames = Underscore.keys(this.newDals); + const dalNames = Underscore.keys(this.dals); for (const dalName of dalNames) { - const dal = this.newDals[dalName]; + const dal = this.dals[dalName]; await dal.init(); } logger.debug("Upgrade database..."); @@ -229,6 +213,23 @@ export class FileDAL implements ServerDAO { } } + generateUpgradeSql() { + // Make sure to always renable constraints (a.g. if the last sync failed, it can be still disabled) + return "PRAGMA ignore_check_constraints = true;"; + } + + async disableCheckConstraints() { + logger.info("Disabling database check constraints..."); + await this.metaDAL.exec("PRAGMA ignore_check_constraints = true;"); + await this.txsDAL.disableCheckConstraints(); + } + + async enableCheckConstraints() { + logger.info("Enabling database check constraints..."); + await this.metaDAL.exec("PRAGMA ignore_check_constraints = false;"); + await this.txsDAL.enableCheckConstraints(); + } + getDBVersion() { return this.metaDAL.getVersion(); } @@ -1583,14 +1584,14 @@ export class FileDAL implements ServerDAO { } async cleanCaches() { - await Underscore.values(this.newDals).map( + await Underscore.values(this.dals).map( (dal: Initiable) => dal.cleanCache && dal.cleanCache() ); } async close() { await Promise.all( - Underscore.values(this.newDals).map(async (dal: Initiable) => { + Underscore.values(this.dals).map(async (dal: Initiable) => { dal.cleanCache(); await dal.close(); }) diff --git a/app/lib/dal/indexDAL/abstract/GenericDAO.ts b/app/lib/dal/indexDAL/abstract/GenericDAO.ts index b7df7ad28..e9057917c 100644 --- a/app/lib/dal/indexDAL/abstract/GenericDAO.ts +++ b/app/lib/dal/indexDAL/abstract/GenericDAO.ts @@ -1,10 +1,6 @@ import { Initiable } from "../../sqliteDAL/Initiable"; export interface GenericDAO<T> extends Initiable { - /** - * Trigger the initialization of the DAO. Called when the underlying DB is ready. - */ - triggerInit(): void; /** * Make a generic find with some ordering. diff --git a/app/lib/dal/indexDAL/abstract/PeerDAO.ts b/app/lib/dal/indexDAL/abstract/PeerDAO.ts index 0432e2c15..a3f6e3f23 100644 --- a/app/lib/dal/indexDAL/abstract/PeerDAO.ts +++ b/app/lib/dal/indexDAL/abstract/PeerDAO.ts @@ -2,10 +2,6 @@ import { DBPeer } from "../../../db/DBPeer"; import { Initiable } from "../../sqliteDAL/Initiable"; export interface PeerDAO extends Initiable { - /** - * Trigger the initialization of the DAO. Called when the underlying DB is ready. - */ - triggerInit(): void; listAll(): Promise<DBPeer[]>; diff --git a/app/lib/dal/indexDAL/abstract/TxsDAO.ts b/app/lib/dal/indexDAL/abstract/TxsDAO.ts index 93854de3e..fc91a739d 100644 --- a/app/lib/dal/indexDAL/abstract/TxsDAO.ts +++ b/app/lib/dal/indexDAL/abstract/TxsDAO.ts @@ -4,6 +4,11 @@ import { SandBox } from "../../sqliteDAL/SandBox"; import { DBTx } from "../../../db/DBTx"; export interface TxsDAO extends GenericDAO<DBTx> { + + disableCheckConstraints(): Promise<void>; + + enableCheckConstraints(): Promise<void>; + trimExpiredNonWrittenTxs(limitTime: number): Promise<void>; getAllPending(versionMin: number): Promise<DBTx[]>; diff --git a/app/lib/dal/indexDAL/abstract/WalletDAO.ts b/app/lib/dal/indexDAL/abstract/WalletDAO.ts index 3e076f2eb..4b9f7e96b 100644 --- a/app/lib/dal/indexDAL/abstract/WalletDAO.ts +++ b/app/lib/dal/indexDAL/abstract/WalletDAO.ts @@ -2,10 +2,6 @@ import { Initiable } from "../../sqliteDAL/Initiable"; import { DBWallet } from "../../../db/DBWallet"; export interface WalletDAO extends Initiable { - /** - * Trigger the initialization of the DAO. Called when the underlying DB is ready. - */ - triggerInit(): void; /** * Saves a wallet. diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts index 4d1afc8e8..161ddca38 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts @@ -32,9 +32,6 @@ export class LevelDBDividend extends LevelDBTable<DividendEntry> */ cleanCache(): void {} - - triggerInit(): void {} - async init(): Promise<void> { await super.init(); this.indexForTrimming = new LevelDBTable<string[]>( diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts index c6b1f6de2..9b23982b1 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts @@ -12,7 +12,6 @@ export class LevelDBTable<T> { cleanCache(): void {} - triggerInit(): void {} async close() { await this.db.close(); diff --git a/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts b/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts index 3152d1174..d64cc48b3 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteDividend.ts @@ -35,8 +35,6 @@ export class SqliteDividend extends SqliteTable<DividendEntry> cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts index d31696ed6..a50fdb041 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteIIndex.ts @@ -44,8 +44,6 @@ export class SqliteIIndex extends SqliteTable<IindexEntry> cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts index 6fe3b6230..0d8b60d2b 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts @@ -74,8 +74,6 @@ export class SqliteMIndex extends SqliteTable<MindexEntry> `); } - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts b/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts index 3b67bd9fe..50ce41093 100644 --- a/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts +++ b/app/lib/dal/indexDAL/sqlite/SqlitePeers.ts @@ -95,8 +95,6 @@ export class SqlitePeers extends SqliteTable<DBPeer> implements PeerDAO { return peer; } - triggerInit(): void {} - withUPStatus(): Promise<DBPeer[]> { return this.findEntities("SELECT * FROM peers WHERE status = ?", ["UP"]); } diff --git a/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts index c208fa380..fd27cead1 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteSIndex.ts @@ -46,8 +46,6 @@ export class SqliteSIndex extends SqliteTable<SindexEntry> cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts index 756d367c5..d2c39b33b 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts @@ -4,7 +4,7 @@ import { SqliteNodeIOManager } from "./SqliteNodeIOManager"; import { SQLiteDriver } from "../../drivers/SQLiteDriver"; export class SqliteTable<T> { - private readonly pdriver: Promise<SQLiteDriver>; + private readonly _driverPromise: Promise<SQLiteDriver>; protected driver: SqliteNodeIOManager<T>; protected constructor( @@ -14,11 +14,11 @@ export class SqliteTable<T> { }, getSqliteDB: (dbName: string) => Promise<SQLiteDriver> ) { - this.pdriver = getSqliteDB(`${name}.db`); + this._driverPromise = getSqliteDB(`${name}.db`); } async init(): Promise<void> { - this.driver = new SqliteNodeIOManager(await this.pdriver, "sindex"); + this.driver = new SqliteNodeIOManager(await this._driverPromise, this.name); await this.driver.sqlExec(` BEGIN; ${this.generateCreateTable()}; @@ -32,6 +32,14 @@ export class SqliteTable<T> { await this.driver.close(); } + async disableCheckConstraints(): Promise<void> { + await this.driver.sqlExec("PRAGMA ignore_check_constraints = true;"); + } + + async enableCheckConstraints(): Promise<void> { + await this.driver.sqlExec("PRAGMA ignore_check_constraints = false;"); + } + generateCreateTable() { let sql = `CREATE TABLE IF NOT EXISTS ${this.name} (`; const fields = this.keys() diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts index c7a90a92f..f739136e5 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts @@ -368,8 +368,6 @@ export class SqliteTransactions extends SqliteTable<DBTx> implements TxsDAO { return this.driver.sqlWrite("DELETE FROM txs WHERE hash = ?", [hash]); } - triggerInit(): void {} - trimExpiredNonWrittenTxs(limitTime: number): Promise<void> { return this.driver.sqlWrite( "DELETE FROM txs WHERE NOT written AND blockstampTime <= ?", diff --git a/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts b/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts index 3b70811fe..a9f8fb031 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteWallet.ts @@ -23,8 +23,6 @@ export class SqliteWallet extends SqliteTable<DBWallet> implements WalletDAO { cleanCache(): void {} - triggerInit(): void {} - /** * INSERT */ diff --git a/app/modules/crawler/lib/sync.ts b/app/modules/crawler/lib/sync.ts index 69d073a23..de68f7920 100644 --- a/app/modules/crawler/lib/sync.ts +++ b/app/modules/crawler/lib/sync.ts @@ -183,6 +183,9 @@ export class Synchroniser extends stream.Duplex { // We use cautious mode if it is asked, or not particulary asked but blockchain has been started const cautious = askedCautious === true || localNumber >= 0; + // Disable constraints + if (!cautious) await this.server.dal.disableCheckConstraints(); + const milestonesStream = new ValidatorStream( localNumber, to, @@ -241,6 +244,9 @@ export class Synchroniser extends stream.Duplex { await this.syncStrategy.syncPeers(fullSync, to); } + // Enable constraints + if (!cautious) await this.server.dal.enableCheckConstraints(); + const syncDuration = Date.now() - syncStartTime; this.watcher.end(syncDuration); this.push({ sync: true }); diff --git a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts index 242ecf2b1..120578daa 100644 --- a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts +++ b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts @@ -124,12 +124,6 @@ export class GlobalIndexStream extends Duplex { })(); } - private async injectLoki<T, K extends keyof T>(dal: T, f: K, obj: T[K]) { - // this.mapInjection[f] = dal[f] - // dal[f] = obj - // await (obj as any).triggerInit() - } - readChunk(i: number) {} _read(size: number) { diff --git a/app/modules/prover/lib/proof.ts b/app/modules/prover/lib/proof.ts index f24d30571..2ce2942c5 100644 --- a/app/modules/prover/lib/proof.ts +++ b/app/modules/prover/lib/proof.ts @@ -53,7 +53,7 @@ export function createPowWorker() { process.exit(ExitCodes.OK); }); - process.on("message", async (message) => { + process.on("message", async (message: any) => { switch (message.command) { case "newPoW": (async () => { diff --git a/app/modules/upnp-provider.ts b/app/modules/upnp-provider.ts index 776453de1..7631e3196 100644 --- a/app/modules/upnp-provider.ts +++ b/app/modules/upnp-provider.ts @@ -200,7 +200,7 @@ export class UpnpProvider { let keys = Underscore.keys(netInterfaces); let res = []; for (const name of keys) { - let addresses = netInterfaces[name]; + let addresses = netInterfaces[name] || []; for (const addr of addresses) { if (!family || addr.family == family) { res.push({ diff --git a/server.ts b/server.ts index d5c4b7e5d..97f067ffa 100644 --- a/server.ts +++ b/server.ts @@ -167,9 +167,9 @@ export class Server extends stream.Duplex implements HookableServer { async getSQLiteDB(dbName: string, home: string) { // Check in cach (useful to avoid migration task to create a new driver on the same DB file) let driver: SQLiteDriver = this.sqliteDBs[dbName]; - if (!driver || driver.closed) { + if (!driver || driver.isClosed()) { driver = await Directory.getHomeDB(this.memoryOnly, dbName, home); - this.sqliteDBs[dbName] = driver; + if (!this.memoryOnly) this.sqliteDBs[dbName] = driver; } return driver; } @@ -179,7 +179,7 @@ export class Server extends stream.Duplex implements HookableServer { let driver: LevelUp = this.levelDBs[dbName]; if (!driver || driver.isClosed()) { driver = await Directory.getHomeLevelDB(this.memoryOnly, dbName, home); - this.levelDBs[dbName] = driver; + if (!this.memoryOnly) this.levelDBs[dbName] = driver; } return driver; } @@ -514,6 +514,12 @@ export class Server extends stream.Duplex implements HookableServer { if (this.dal) { await this.dal.close() } + await Promise.all(Object.values(this.sqliteDBs) + .filter(db => db && !db.isClosed()) + .map(db => db.closeConnection())); + await Promise.all(Object.values(this.levelDBs) + .filter(db => db && !db.isClosed()) + .map(db => db.close())); } revert() { diff --git a/test/dal/basic-dal-tests.ts b/test/dal/basic-dal-tests.ts index ccc4ffd26..6696c74c3 100644 --- a/test/dal/basic-dal-tests.ts +++ b/test/dal/basic-dal-tests.ts @@ -113,6 +113,10 @@ describe("DAL", function(){ return fileDAL.saveConf({ currency: "meta_brouzouf" } as any); }) + after(() => { + return fileDAL.close(); + }) + it('should have last DB version', async () => { let version = await fileDAL.getDBVersion(); should.exist(version); -- GitLab