From ddec55932c721c0604025cd76b155da18b8a35a5 Mon Sep 17 00:00:00 2001 From: cgeek <cem.moreau@gmail.com> Date: Sat, 21 Apr 2018 16:38:25 +0200 Subject: [PATCH] Begin Loki storage --- app/lib/dal/fileDAL.ts | 21 +++++++++++++++++++-- app/lib/dal/indexDAL/abstract/GenericDAO.ts | 5 +++++ app/lib/dal/indexDAL/loki/LokiIndex.ts | 15 ++++++++++++--- app/lib/system/directory.ts | 1 + server.ts | 6 +++--- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/lib/dal/fileDAL.ts b/app/lib/dal/fileDAL.ts index 0db816687..ed49de19c 100644 --- a/app/lib/dal/fileDAL.ts +++ b/app/lib/dal/fileDAL.ts @@ -37,7 +37,7 @@ import {MetaDAL} from "./sqliteDAL/MetaDAL" import {DataErrors} from "../common-libs/errors" import {BasicRevocableIdentity, IdentityDTO} from "../dto/IdentityDTO" import {BlockDAL} from "./sqliteDAL/BlockDAL" -import {FileSystem} from "../system/directory" +import {Directory, FileSystem} from "../system/directory" import {WoTBInstance} from "../wot" import {IIndexDAO} from "./indexDAL/abstract/IIndexDAO" import {LokiIIndex} from "./indexDAL/loki/LokiIIndex" @@ -102,7 +102,24 @@ export class FileDAL { this.sqliteDriver = params.dbf() this.wotb = params.wotb this.profile = 'DAL' - this.loki = new loki('index.db') + const that = this + this.loki = new loki(path.join(this.rootPath, Directory.INDEX_DB_FILE), { + autoload: true, + autoloadCallback : () => { + const dals = [ + that.bindexDAL, + that.mindexDAL, + that.iindexDAL, + that.sindexDAL, + that.cindexDAL, + ] + for (const indexDAL of dals) { + indexDAL.triggerInit() + } + }, + autosave: true, + autosaveInterval: 4000 + }) // DALs this.powDAL = new PowDAL(this.rootPath, params.fs) diff --git a/app/lib/dal/indexDAL/abstract/GenericDAO.ts b/app/lib/dal/indexDAL/abstract/GenericDAO.ts index d224e207e..64382b3f0 100644 --- a/app/lib/dal/indexDAL/abstract/GenericDAO.ts +++ b/app/lib/dal/indexDAL/abstract/GenericDAO.ts @@ -2,6 +2,11 @@ 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. * @param criterion Criterion object, LokiJS's find object format. diff --git a/app/lib/dal/indexDAL/loki/LokiIndex.ts b/app/lib/dal/indexDAL/loki/LokiIndex.ts index 86d4de77d..d80f630d5 100644 --- a/app/lib/dal/indexDAL/loki/LokiIndex.ts +++ b/app/lib/dal/indexDAL/loki/LokiIndex.ts @@ -17,16 +17,25 @@ export interface IndexData { export abstract class LokiIndex<T extends IndexData> implements GenericDAO<T> { protected collection:LokiCollection<T> + protected collectionIsInitialized: Promise<void> + private resolveCollection: () => void public constructor( protected loki:any, protected collectionName:'iindex'|'mindex'|'cindex'|'sindex'|'bindex', - indices: (keyof T)[]) { - const coll = loki.addCollection(collectionName, { indices }) - this.collection = new LokiProxyCollection(coll, collectionName) + protected indices: (keyof T)[]) { + this.collectionIsInitialized = new Promise<void>(res => this.resolveCollection = res) + } + + public triggerInit() { + const coll = this.loki.addCollection(this.collectionName, { indices: this.indices }) + this.collection = new LokiProxyCollection(coll, this.collectionName) + this.resolveCollection() } async init(): Promise<void> { + await this.collectionIsInitialized + logger.info('Collection %s ready', this.collectionName) } cleanCache(): void { diff --git a/app/lib/system/directory.ts b/app/lib/system/directory.ts index 8e1dc9af3..01bac4ded 100644 --- a/app/lib/system/directory.ts +++ b/app/lib/system/directory.ts @@ -88,6 +88,7 @@ export const Directory = { INSTANCE_NAME: getDomain(opts.mdb), INSTANCE_HOME: getHomePath(opts.mdb, opts.home), INSTANCE_HOMELOG_FILE: getLogsPath(opts.mdb, opts.home), + INDEX_DB_FILE: 'index.db', DUNITER_DB_NAME: 'duniter', WOTB_FILE: 'wotb.bin', diff --git a/server.ts b/server.ts index c37248f88..23856c0bd 100644 --- a/server.ts +++ b/server.ts @@ -375,14 +375,14 @@ export class Server extends stream.Duplex implements HookableServer { async resetAll(done:any = null) { await this.resetDataHook() await this.resetConfigHook() - const files = ['stats', 'cores', 'current', Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE, 'export.zip', 'import.zip', 'conf']; + const files = ['stats', 'cores', 'current', Directory.INDEX_DB_FILE, Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE, 'export.zip', 'import.zip', 'conf']; const dirs = ['blocks', 'blockchain', 'ud_history', 'branches', 'certs', 'txs', 'cores', 'sources', 'links', 'ms', 'identities', 'peers', 'indicators', 'leveldb']; return this.resetFiles(files, dirs, done); } async resetData(done:any = null) { await this.resetDataHook() - const files = ['stats', 'cores', 'current', Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE]; + const files = ['stats', 'cores', 'current', Directory.INDEX_DB_FILE, Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log', Directory.WOTB_FILE]; const dirs = ['blocks', 'ud_history', 'branches', 'certs', 'txs', 'cores', 'sources', 'links', 'ms', 'identities', 'peers', 'indicators', 'leveldb']; await this.resetFiles(files, dirs, done); } @@ -436,7 +436,7 @@ export class Server extends stream.Duplex implements HookableServer { async cleanDBData() { await this.dal.cleanCaches(); this.dal.wotb.resetWoT(); - const files = ['stats', 'cores', 'current', Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log']; + const files = ['stats', 'cores', 'current', Directory.INDEX_DB_FILE, Directory.DUNITER_DB_NAME, Directory.DUNITER_DB_NAME + '.db', Directory.DUNITER_DB_NAME + '.log']; const dirs = ['blocks', 'ud_history', 'branches', 'certs', 'txs', 'cores', 'sources', 'links', 'ms', 'identities', 'peers', 'indicators', 'leveldb']; return this.resetFiles(files, dirs); } -- GitLab