diff --git a/app/lib/blockchain/DuniterBlockchain.ts b/app/lib/blockchain/DuniterBlockchain.ts index 063a095053c85b91d8b9495532c5bdde7c93e24b..81603eb1b8d90bc6167ef36c11a8aef5b6607f25 100644 --- a/app/lib/blockchain/DuniterBlockchain.ts +++ b/app/lib/blockchain/DuniterBlockchain.ts @@ -319,14 +319,21 @@ export class DuniterBlockchain { await this.removeMembershipsFromSandbox(block, dal); // Compute to be revoked members await this.computeToBeRevoked(indexes.mindex, dal); + // Delete eventually present transactions - await this.deleteTransactions(block, dal); + // NOT NEED => already done in saveTxsInFiles() + //await this.deleteTransactions(block, dal); await dal.trimSandboxes(block); // Saves the block (DAL) await dal.saveBlock(dbb); + // Save Transactions (DAL) + if (conf.storage?.transactions !== false) { + await dal.saveTxsInFiles(dbb.transactions, dbb.number, dbb.medianTime); + } + // Save wot file if (!dal.fs.isMemoryOnly()) { const wotbFilepath = Directory.getWotbFilePath(dal.rootPath); @@ -684,7 +691,7 @@ export class DuniterBlockchain { try { // Saves the block (DAL) block.wrong = false; - await dal.saveSideBlockInFile(block); + await dal.saveSideBlock(block); logger.info( "SIDE Block #%s-%s added to the blockchain in %s ms", block.number, diff --git a/app/lib/common-libs/constants.ts b/app/lib/common-libs/constants.ts index 91266e0aa9849d407ca7d2cfac5bdc6bc8ab1698..04fa63eb59012f589bb2c63c5319952bfc1190ff 100755 --- a/app/lib/common-libs/constants.ts +++ b/app/lib/common-libs/constants.ts @@ -548,6 +548,7 @@ export const CommonConstants = { MILESTONES_PER_PAGE: 50, CHUNK_PREFIX: "chunk_", BLOCKS_IN_MEMORY_MAX: 288 * 60, // 288 = 1 day + MAX_SQLITE_WRITE_PENDINGS: 200, MAX_AGE_OF_PEER_IN_BLOCKS: 200, // blocks INITIAL_DOWNLOAD_SLOTS: 1, // 1 peer diff --git a/app/lib/common-libs/underscore.ts b/app/lib/common-libs/underscore.ts index 3f567e3d81296ec7161300d45a01d39a0fd080af..a9d9073af7e0ef38892de5785edb02844999ccb8 100644 --- a/app/lib/common-libs/underscore.ts +++ b/app/lib/common-libs/underscore.ts @@ -92,8 +92,8 @@ export const Underscore = { return _underscore_.extend(t1, t2); }, - range: (count: number, end?: number): number[] => { - return _underscore_.range(count, end); + range: (count: number, end?: number, step?: number): number[] => { + return _underscore_.range(count, end, step); }, chain: <T>(element: T[]): UnderscoreClass<T> => { diff --git a/app/lib/dal/drivers/LevelDBDriver.ts b/app/lib/dal/drivers/LevelDBDriver.ts index 0fd4c034488a0a9c40fa892c52a7969c90a71876..c6f1a461ec1f1add98db6afad47e0189c4e44806 100644 --- a/app/lib/dal/drivers/LevelDBDriver.ts +++ b/app/lib/dal/drivers/LevelDBDriver.ts @@ -13,7 +13,6 @@ import * as levelup from "levelup"; import { LevelUp } from "levelup"; -import { AbstractLevelDOWN, ErrorCallback } from "abstract-leveldown"; import * as leveldown from "leveldown"; import * as memdown from "memdown"; diff --git a/app/lib/dal/drivers/SQLiteDriver.ts b/app/lib/dal/drivers/SQLiteDriver.ts index 0cc9700382c7bae95d6e2760beb10a3fbc722cdd..2145d965ac44d01b2cf29c8a73c65a7f9868dcaa 100644 --- a/app/lib/dal/drivers/SQLiteDriver.ts +++ b/app/lib/dal/drivers/SQLiteDriver.ts @@ -29,10 +29,15 @@ export class SQLiteDriver { getDB(): Promise<any> { if (!this.dbPromise) { this.dbPromise = (async () => { - this.logger.debug('Opening SQLite database "%s"...', this.path); + this.logger.trace('Opening SQLite database "%s"...', this.path); + let sqlite = new sqlite3.Database(this.path); await new Promise<any>((resolve) => sqlite.once("open", resolve)); + // Database is opened + //this.logger.debug('Database "%s" opened', this.path); + + // Trace SQL queries if (OtherConstants.SQL_TRACES) { sqlite.on("trace", (trace: any) => { this.logger.trace(trace); @@ -116,9 +121,9 @@ export class SQLiteDriver { db.open; // For an unknown reason, we need this line. } await new Promise<void>((resolve, reject) => { - this.logger.debug('Closing SQLite database "%s"...', this.path); + this.logger.trace('Closing SQLite database "%s"...', this.path); db.on("close", () => { - this.logger.info('Database "%s" closed.', this.path); + //this.logger.info('Database "%s" closed.', this.path); this.dbPromise = null; resolve(); }); diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts index 2d04a61636ba9be157619801b22795d084a05e23..bfb07a09ce45f38fe9bcf473dc684fba6339eddf 100644 --- a/app/lib/dal/fileDAL.ts +++ b/app/lib/dal/fileDAL.ts @@ -234,14 +234,6 @@ export class FileDAL implements ServerDAO { return this.metaDAL.getVersion(); } - writeFileOfBlock(block: DBBlock) { - return this.blockDAL.saveBlock(block); - } - - writeSideFileOfBlock(block: DBBlock) { - return this.blockDAL.saveSideBlock(block); - } - listAllPeers() { return this.peerDAL.listAll(); } @@ -1243,12 +1235,16 @@ export class FileDAL implements ServerDAO { } } - async saveBlock(dbb: DBBlock) { + saveBlock(dbb: DBBlock) { dbb.wrong = false; - await Promise.all([ - this.saveBlockInFile(dbb), - this.saveTxsInFiles(dbb.transactions, dbb.number, dbb.medianTime), - ]); + return this.blockDAL.saveBlock(dbb); + + // Since v1.8.7, saveTxsInFiles() should be call only if TX storage enabled, by the caller + //await this.saveTxsInFiles(dbb.transactions, dbb.number, dbb.medianTime); + } + + saveSideBlock(block: DBBlock) { + return this.blockDAL.saveSideBlock(block); } async generateIndexes( @@ -1343,14 +1339,6 @@ export class FileDAL implements ServerDAO { return this.msDAL.savePendingMembership(ms); } - async saveBlockInFile(block: DBBlock) { - await this.writeFileOfBlock(block); - } - - saveSideBlockInFile(block: DBBlock) { - return this.writeSideFileOfBlock(block); - } - /** * Map tx DTO into DBtxs * @param txs @@ -1399,9 +1387,14 @@ export class FileDAL implements ServerDAO { medianTime: number ): Promise<DBTx[]> { if (!txs.length) return []; - const dbTxs = await this.mapToDBTxs(txs, block_number, medianTime); - await this.txsDAL.insertBatch(dbTxs); - return dbTxs; + const records = await this.mapToDBTxs(txs, block_number, medianTime); + await this.txsDAL.insertBatch(records); + return records; + } + + removeAllTxs() { + logger.debug("Removing all existing txs..."); + return this.txsDAL.removeAll(); } async merkleForPeers() { @@ -1583,17 +1576,19 @@ export class FileDAL implements ServerDAO { } } - async cleanCaches() { - await Underscore.values(this.dals).map( - (dal: Initiable) => dal.cleanCache && dal.cleanCache() + cleanCaches() { + return Promise.all( + Underscore.values(this.dals) + .filter((dal: Initiable) => typeof dal.cleanCache === "function") + .map((dal: Initiable) => dal.cleanCache()) ); } async close() { await Promise.all( - Underscore.values(this.dals).map(async (dal: Initiable) => { + Underscore.values(this.dals).map((dal: Initiable) => { dal.cleanCache(); - await dal.close(); + return dal.close(); }) ); await this.sqliteDriver.closeConnection(); diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBBlockchain.ts b/app/lib/dal/indexDAL/leveldb/LevelDBBlockchain.ts index e0101e8bbc79ee670eb043e51493fb21f6986c2c..6a76cb67d2b9308e8257edcb17f3e1241f95b793 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBBlockchain.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBBlockchain.ts @@ -106,8 +106,10 @@ export class LevelDBBlockchain extends LevelDBTable<DBBlock> async close(): Promise<void> { await super.close(); - await this.forks.close(); - await Promise.all(this.indexers.map((i) => i.close())); + if (this.indexers.length) { + await this.forks.close(); + await Promise.all(this.indexers.map((i) => i.close())); + } } /** diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts index 161ddca3883413a691077d090b03296ac9d21493..896abf561440c210d60192c5d15e11b78d327752 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBDividend.ts @@ -31,7 +31,6 @@ export class LevelDBDividend extends LevelDBTable<DividendEntry> * TECHNICAL */ - cleanCache(): void {} async init(): Promise<void> { await super.init(); this.indexForTrimming = new LevelDBTable<string[]>( diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBIindex.ts b/app/lib/dal/indexDAL/leveldb/LevelDBIindex.ts index fd5010024ec958c2e6768c2ac5de27427f3c9ba1..becb73a5af5af1eb78572bd5c5b3392ec183a2ea 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBIindex.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBIindex.ts @@ -61,10 +61,10 @@ export class LevelDBIindex extends LevelDBTable<IindexEntry[]> async close(): Promise<void> { await super.close(); - await this.indexForHash.close(); - await this.indexForUid.close(); - await this.indexForKick.close(); - await this.indexForWrittenOn.close(); + await this.indexForHash?.close(); + await this.indexForUid?.close(); + await this.indexForKick?.close(); + await this.indexForWrittenOn?.close(); } /** diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBMindex.ts b/app/lib/dal/indexDAL/leveldb/LevelDBMindex.ts index dcadf4ad721d46e668bc6809c47dd91f68334672..6def894d35697ea8a48f73330cf7b4622758d8e8 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBMindex.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBMindex.ts @@ -52,9 +52,9 @@ export class LevelDBMindex extends LevelDBTable<MindexEntry[]> async close(): Promise<void> { await super.close(); - await this.indexForExpiresOn.close(); - await this.indexForRevokesOn.close(); - await this.indexForWrittenOn.close(); + await this.indexForExpiresOn?.close(); + await this.indexForRevokesOn?.close(); + await this.indexForWrittenOn?.close(); } /** diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBSindex.ts b/app/lib/dal/indexDAL/leveldb/LevelDBSindex.ts index 4fd8de92bfd2fa6ff76002c5059d67831a0139b4..a32ed465681498589915aafc9860ae17d29c4b9d 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBSindex.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBSindex.ts @@ -215,7 +215,11 @@ export class LevelDBSindex extends LevelDBTable<SindexEntry> const createRecord = await this.getOrNull(createKey); const updateKey = LevelDBSindex.trimKey(identifier, pos, true); const updateRecord = await this.getOrNull(updateKey); - if (createRecord && updateRecord && updateRecord.writtenOn < belowNumber) { + if ( + createRecord && + updateRecord && + updateRecord.writtenOn < belowNumber + ) { // We remember the trimmed source id to remove it from the writtenOn and conditions index mapIds[id] = { createdOn: createRecord.writtenOn, @@ -357,16 +361,21 @@ export class LevelDBSindex extends LevelDBTable<SindexEntry> * Allow to get internal index, for unit test (see test triming-dal.ts) */ getInternalIndexes(): LevelDBTable<any>[] { - return [this.indexForTrimming, this.indexForConditions, this.indexForConsumed, this.indexOfComplexeConditionForPubkeys]; + return [ + this.indexForTrimming, + this.indexForConditions, + this.indexForConsumed, + this.indexOfComplexeConditionForPubkeys, + ]; } getIndexForTrimming(): LevelDBTable<any> { - return this.indexForTrimming + return this.indexForTrimming; } getIndexForConditions(): LevelDBTable<any> { - return this.indexForConditions + return this.indexForConditions; } getIndexForConsumed(): LevelDBTable<any> { - return this.indexForConsumed + return this.indexForConsumed; } private async trimConditions(condition: string, id: string) { diff --git a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts index f9d018a11a4afaef0ffe07e57d739cbb9d6d93ed..668351f06334fa0c03faa66834ecc3e01e0c60e6 100644 --- a/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts +++ b/app/lib/dal/indexDAL/leveldb/LevelDBTable.ts @@ -12,12 +12,13 @@ export class LevelDBTable<T> { cleanCache(): void {} - async close() { - await this.db.close(); - } - async init(): Promise<void> { this.db = await this.getLevelDB(`${this.name}`); + await this.db.open(); + } + + async close() { + await this.db?.close(); } public async get(k: string): Promise<T> { diff --git a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts index 0d8b60d2bb4768e50ddbd91490cf6ec222449d10..db86d71f1e3fa2f5b5deff54b085fd4cf7f1d9e6 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteMIndex.ts @@ -74,6 +74,11 @@ export class SqliteMIndex extends SqliteTable<MindexEntry> `); } + async close(): Promise<void> { + await super.close(); + await this.d2?.close(); + } + /** * INSERT */ diff --git a/app/lib/dal/indexDAL/sqlite/SqliteNodeIOManager.ts b/app/lib/dal/indexDAL/sqlite/SqliteNodeIOManager.ts index be65c3308f6d23dc9121f2016eb30bd2b4191a32..915cf21800683c5a2fb0ebbd5855649b6a3a6785 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteNodeIOManager.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteNodeIOManager.ts @@ -2,9 +2,11 @@ import { SQLiteDriver } from "../../drivers/SQLiteDriver"; import { MonitorExecutionTime } from "../../../debug/MonitorExecutionTime"; import { NewLogger } from "../../../logger"; import { ExitCodes } from "../../../common-libs/exit-codes"; +import { CommonConstants } from "../../../common-libs/constants"; export class SqliteNodeIOManager<T> { private writePromise: Promise<any> | null = null; + private writePendingCount = 0; constructor(private driver: SQLiteDriver, private id: string) {} @@ -13,12 +15,19 @@ export class SqliteNodeIOManager<T> { await this.writePromise; // We no more need to wait this.writePromise = null; + this.writePendingCount = 0; } public async sqlWrite(sql: string, params: any[]) { - // // Just promise that the writing will be done + if (this.writePendingCount >= CommonConstants.MAX_SQLITE_WRITE_PENDINGS) { + await this.wait4writing(); + } + + this.writePendingCount++; + // Just promise that the writing will be done this.writePromise = (this.writePromise || Promise.resolve()) .then(() => this.driver.executeAll(sql, params)) + .then(() => this.writePendingCount--) .catch((e) => { NewLogger().error(e); process.exit(ExitCodes.MINDEX_WRITING_ERROR); @@ -42,6 +51,10 @@ export class SqliteNodeIOManager<T> { } async close() { + if (this.writePromise) { + // Wait for current writings to be done + await this.wait4writing(); + } await this.driver.closeConnection(); } } diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts index a0ee566e0a120a2b74af4bd8cd7fe040907ce34f..18738529666ce4e2f8da1f1b87235b031b39063f 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteTable.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteTable.ts @@ -22,14 +22,14 @@ export class SqliteTable<T> { await this.driver.sqlExec(` BEGIN; ${this.generateCreateTable()}; - ${this.generateUpgradeSql()}; - ${this.generateCreateIndexes()}; + ${this.generateUpgradeSql()} + ${this.generateCreateIndexes()} COMMIT; `); } async close(): Promise<void> { - await this.driver.close(); + await this.driver?.close(); } async disableCheckConstraints(): Promise<void> { diff --git a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts index f739136e5e47d3bdb3f1927a26c41038b140dbbb..4c2439b4bb0704bba08b1badabd79b289091a576 100644 --- a/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts +++ b/app/lib/dal/indexDAL/sqlite/SqliteTransactions.ts @@ -9,6 +9,7 @@ import { DBTx } from "../../../db/DBTx"; import { TxsDAO } from "../abstract/TxsDAO"; import { SandBox } from "../../sqliteDAL/SandBox"; import { TransactionDTO } from "../../../dto/TransactionDTO"; +import { Underscore } from "../../../common-libs/underscore"; const constants = require("../../../constants"); @@ -112,17 +113,15 @@ export class SqliteTransactions extends SqliteTable<DBTx> implements TxsDAO { @MonitorExecutionTime() async insertBatch(records: DBTx[]): Promise<void> { - if (records.length) { - return this.insertBatchInTable(this.driver, records); - } + if (!records.length) return; + return this.insertBatchInTable(this.driver, records); } @MonitorExecutionTime() async saveBatch(records: DBTx[]): Promise<void> { - if (records.length) { - await this.removeByHashBatch(records.map((t) => t.hash)); - await this.insertBatch(records); - } + if (!records.length) return; + await this.removeByHashBatch(Underscore.uniq(records.map((t) => t.hash))); + return this.insertBatchInTable(this.driver, records); } sandbox: SandBox<{ @@ -352,16 +351,17 @@ export class SqliteTransactions extends SqliteTable<DBTx> implements TxsDAO { } async removeByHashBatch(hashArray: string[]): Promise<void> { - let i = 0; - // Delete by slice of 500 items (because SQLite IN operator is limited) - while (i < hashArray.length - 1) { - const slice = hashArray.slice(i, i + 500); - await this.driver.sqlWrite( - `DELETE FROM txs WHERE hash IN (${slice.map((_) => "?").join(",")})`, - slice - ); - i += 500; - } + // Delete by slice of 100 items (because SQLite IN operator is limited) + await Promise.all( + Underscore.range(0, hashArray.length, 100) + .map( + (start) => + `DELETE FROM txs WHERE hash IN ('${hashArray + .slice(start, start + 100) + .join("', '")}')` + ) + .map((sql) => this.driver.sqlWrite(sql, [])) + ); } removeByHash(hash: string): Promise<void> { diff --git a/app/modules/bma/lib/controllers/node.ts b/app/modules/bma/lib/controllers/node.ts index 2bd24394fe1ae7dc7381aff50d29efd87d8dcc88..770a2eb93000ba47db1167e3355932e69cb26131 100644 --- a/app/modules/bma/lib/controllers/node.ts +++ b/app/modules/bma/lib/controllers/node.ts @@ -23,10 +23,8 @@ export class NodeBinding extends AbstractController { version: this.server.version, forkWindowSize: this.server.conf.forksize, storage: { - transactions: this.server.conf.storage - ? this.server.conf.storage.transactions - : true, // true by default (see app/module/config.ts) - wotwizard: this.server.conf.storage?.wotwizard || false, // false by default (see app/module/config.ts) + transactions: this.server.conf.storage?.transactions !== false, // true by default + wotwizard: this.server.conf.storage?.wotwizard === true, // false by default }, }, }; diff --git a/app/modules/config.ts b/app/modules/config.ts index f5e90b3e0826e8422859303cb8b8a58492a9bb68..e69bd60f0af470f80c3006b40a10948a2445e7da 100644 --- a/app/modules/config.ts +++ b/app/modules/config.ts @@ -37,22 +37,18 @@ module.exports = { CommonConstants.SWITCH_ON_BRANCH_AHEAD_BY_X_BLOCKS; // Transactions storage + conf.storage = conf.storage || { + transactions: false, + wotwizard: false, + }; if ( program.storeTxs || (program.storeTxs === undefined && !conf.nobma) ) { - if (!conf.storage) { - conf.storage = { transactions: true, wotwizard: false }; - } else { - conf.storage.transactions = true; - } + conf.storage.transactions = true; } if (program.storeWw) { - if (!conf.storage) { - conf.storage = { transactions: false, wotwizard: true }; - } else { - conf.storage.wotwizard = true; - } + conf.storage.wotwizard = true; } }, beforeSave: async (conf: ConfDTO) => { diff --git a/app/modules/crawler/lib/sync.ts b/app/modules/crawler/lib/sync.ts index 715c64f874b76f3e6c2989dec3c3d6f3a2968a0d..45bab02f99b2aee0fbb6d418c937807bcc3054f2 100644 --- a/app/modules/crawler/lib/sync.ts +++ b/app/modules/crawler/lib/sync.ts @@ -186,6 +186,10 @@ export class Synchroniser extends stream.Duplex { // Disable check constraints if (!cautious) await this.server.dal.disableCheckConstraints(); + // Remove existing TX, because we will all download it again + // This is required to be able to insert, instead of save + if (fullSync) await this.dal.removeAllTxs(); + const milestonesStream = new ValidatorStream( localNumber, to, @@ -228,7 +232,7 @@ export class Synchroniser extends stream.Duplex { this.watcher.storagePercent(100.0); this.watcher.appliedPercent(100.0); - this.server.dal.blockDAL.cleanCache(); + await this.server.dal.cleanCaches(); if (!cliprogram.nosbx) { //======= diff --git a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts index 120578daa16ede72927bdef3cdae5fcc4e290a5d..f27fb91493b1893ae53679ee78798c7605c3f1aa 100644 --- a/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts +++ b/app/modules/crawler/lib/sync/v2/GlobalIndexStream.ts @@ -422,18 +422,18 @@ export class GlobalIndexStream extends Duplex { @MonitorExecutionTime() private async beforeBlocks(blocks: BlockDTO[]) { + let newTxCount = 0; await this.dal.blockDAL.insertBatch( blocks.map((b) => { - txCount += b.transactions.length; + newTxCount += b.transactions.length; const block = DBBlock.fromBlockDTO(b); block.fork = false; return block; }) ); - if (this.conf.storage?.transactions) { - // if cautious, use a save (insert or update) - if (this.cautious) { + if (newTxCount && this.conf.storage?.transactions !== false) { + if (this.cautious || this.localNumber >= 0) { await Promise.all( blocks.map((block) => this.dal.saveTxsInFiles( @@ -443,9 +443,7 @@ export class GlobalIndexStream extends Duplex { ) ) ); - } - // If not cautious: use insert only - else { + } else { await Promise.all( blocks.map((block) => this.dal.insertTxsInFiles( @@ -456,9 +454,9 @@ export class GlobalIndexStream extends Duplex { ) ); } + txCount += newTxCount; + logger.debug("Total tx count: %s", txCount); } - - logger.debug("Total tx count: %s", txCount); } @MonitorExecutionTime() diff --git a/app/modules/ws2p/lib/WS2PCluster.ts b/app/modules/ws2p/lib/WS2PCluster.ts index f5a7fcb287a89f5357391afb4dda864791b1ae10..711d238bb86fe2ae8cc4eef8ca6d62aab5455496 100644 --- a/app/modules/ws2p/lib/WS2PCluster.ts +++ b/app/modules/ws2p/lib/WS2PCluster.ts @@ -11,28 +11,28 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. -import {WS2PServer} from "./WS2PServer"; -import {Server} from "../../../../server"; -import {WS2PClient} from "./WS2PClient"; -import {WS2PConnection} from "./WS2PConnection"; -import {randomPick} from "../../../lib/common-libs/randomPick"; -import {CrawlerConstants} from "../../crawler/lib/constants"; -import {WS2PBlockPuller} from "./WS2PBlockPuller"; -import {WS2PDocpoolPuller} from "./WS2PDocpoolPuller"; -import {WS2PConstants} from "./constants"; -import {PeerDTO, WS2PEndpoint} from "../../../lib/dto/PeerDTO"; -import {GlobalFifoPromise} from "../../../service/GlobalFifoPromise"; -import {OtherConstants} from "../../../lib/other_constants"; -import {Key} from "../../../lib/common-libs/crypto/keyring"; -import {verify} from "../../../../neon/lib"; -import {WS2PServerMessageHandler} from "./interface/WS2PServerMessageHandler"; -import {WS2PMessageHandler} from "./impl/WS2PMessageHandler"; -import {CommonConstants} from "../../../lib/common-libs/constants"; -import {Package} from "../../../lib/common/package"; -import {ProverConstants} from "../../prover/lib/constants"; -import {ProxiesConf} from "../../../lib/proxy"; -import {Underscore} from "../../../lib/common-libs/underscore"; -import {NewLogger} from "../../../lib/logger"; +import { WS2PServer } from "./WS2PServer"; +import { Server } from "../../../../server"; +import { WS2PClient } from "./WS2PClient"; +import { WS2PConnection } from "./WS2PConnection"; +import { randomPick } from "../../../lib/common-libs/randomPick"; +import { CrawlerConstants } from "../../crawler/lib/constants"; +import { WS2PBlockPuller } from "./WS2PBlockPuller"; +import { WS2PDocpoolPuller } from "./WS2PDocpoolPuller"; +import { WS2PConstants } from "./constants"; +import { PeerDTO, WS2PEndpoint } from "../../../lib/dto/PeerDTO"; +import { GlobalFifoPromise } from "../../../service/GlobalFifoPromise"; +import { OtherConstants } from "../../../lib/other_constants"; +import { Key } from "../../../lib/common-libs/crypto/keyring"; +import { verify } from "../../../../neon/lib"; +import { WS2PServerMessageHandler } from "./interface/WS2PServerMessageHandler"; +import { WS2PMessageHandler } from "./impl/WS2PMessageHandler"; +import { CommonConstants } from "../../../lib/common-libs/constants"; +import { Package } from "../../../lib/common/package"; +import { ProverConstants } from "../../prover/lib/constants"; +import { ProxiesConf } from "../../../lib/proxy"; +import { Underscore } from "../../../lib/common-libs/underscore"; +import { NewLogger } from "../../../lib/logger"; const es = require("event-stream"); const nuuid = require("node-uuid"); diff --git a/server.ts b/server.ts index 97f067ffa985d39c9d2af94c82cab73fa37ad81a..199ebe35f6dee5bb79d49d18668c532d6d7d6608 100644 --- a/server.ts +++ b/server.ts @@ -175,7 +175,7 @@ export class Server extends stream.Duplex implements HookableServer { } async getLevelDB(dbName: string, home: string) { - // Check in cach (useful to avoid migration task to create a new driver on the same DB file) + // Check in cache (useful to avoid migration task to create a new driver on the same DB file) let driver: LevelUp = this.levelDBs[dbName]; if (!driver || driver.isClosed()) { driver = await Directory.getHomeLevelDB(this.memoryOnly, dbName, home); diff --git a/test/integration/network/network-merkle.ts b/test/integration/network/network-merkle.ts index d1ea5d084537f2be595610d24fb14aad9ece9638..4f624defdaaa0021ab515ad30e76f50076677bb9 100644 --- a/test/integration/network/network-merkle.ts +++ b/test/integration/network/network-merkle.ts @@ -13,7 +13,7 @@ import {Underscore} from "../../../app/lib/common-libs/underscore" import {HttpMerkleOfPeers} from "../../../app/modules/bma/lib/dtos" -import {NewTestingServer} from "../tools/toolbox" +import {NewTestingServer, TestingServer} from "../tools/toolbox" import {expectAnswer, expectHttpCode} from "../tools/http-expect" const rp = require('request-promise'); @@ -28,34 +28,37 @@ const commonConf = { sigQty: 1 }; -const s1 = NewTestingServer(Underscore.extend({ - name: 'bb33', - ipv4: '127.0.0.1', - port: '20501', - remoteport: '20501', - ws2p: { upnp: false }, - pair: { - pub: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', - sec: '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP' - }, - rootoffset: 10, - sigQty: 1, dt: 0, ud0: 120 -}, commonConf)); - -const s2 = NewTestingServer(Underscore.extend({ - name: 'bb12', - port: '20502', - remoteport: '20502', - ws2p: { upnp: false }, - pair: { - pub: 'DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo', - sec: '64EYRvdPpTfLGGmaX5nijLXRqWXaVz8r1Z1GtaahXwVSJGQRn7tqkxLb288zwSYzELMEG5ZhXSBYSxsTsz1m9y8F' - } -}, commonConf)); - describe("Network Merkle", function() { + let s1: TestingServer, s2: TestingServer; + before(async () => { + + s1 = NewTestingServer(Underscore.extend({ + name: 'bb33', + ipv4: '127.0.0.1', + port: '20501', + remoteport: '20501', + ws2p: { upnp: false }, + pair: { + pub: 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd', + sec: '51w4fEShBk1jCMauWu4mLpmDVfHksKmWcygpxriqCEZizbtERA6de4STKRkQBpxmMUwsKXRjSzuQ8ECwmqN1u2DP' + }, + rootoffset: 10, + sigQty: 1, dt: 0, ud0: 120 + }, commonConf)); + + s2 = NewTestingServer(Underscore.extend({ + name: 'bb12', + port: '20502', + remoteport: '20502', + ws2p: { upnp: false }, + pair: { + pub: 'DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo', + sec: '64EYRvdPpTfLGGmaX5nijLXRqWXaVz8r1Z1GtaahXwVSJGQRn7tqkxLb288zwSYzELMEG5ZhXSBYSxsTsz1m9y8F' + } + }, commonConf)); + await s1.initDalBmaConnections() await s2.initDalBmaConnections() await s1._server.PeeringService.generateSelfPeer(s1._server.conf, 0) diff --git a/test/integration/tools/toolbox.ts b/test/integration/tools/toolbox.ts index 5c3b65dcf327550c55409430c8bee8b3c3e2ddc6..4d18549d85e4f52b9f3c9807d0f4d0e0d0847e1d 100644 --- a/test/integration/tools/toolbox.ts +++ b/test/integration/tools/toolbox.ts @@ -243,6 +243,11 @@ export const NewTestingServer = (conf:any) => { httpLogs: true, forksize: conf.forksize !== undefined ? conf.forksize : 3, nonWoTPeersLimit: CommonConstants.DEFAULT_NON_WOT_PEERS_LIMIT, + storage: { + transaction: true, + wotwizard: false, + ...conf.storage + } }; if (conf.sigQty === undefined) { conf.sigQty = 1; diff --git a/test/integration/ws2p/ws2p_pulling.ts b/test/integration/ws2p/ws2p_pulling.ts index 52f7aaaf448e026d850a17eace500ac704cae3e2..7794605a2d0686c95c15e95a23333818ef7960b7 100644 --- a/test/integration/ws2p/ws2p_pulling.ts +++ b/test/integration/ws2p/ws2p_pulling.ts @@ -74,7 +74,7 @@ describe("WS2P block pulling", function() { cluster2 = network.cluster2 }) - after(() => wss.close()) + after(() => wss?.close()) it('should have b#6 on s1, b#2 on s2', async () => { const currentS1 = await s1.BlockchainService.current()