diff --git a/mb-xrpl/lib/message-board.js b/mb-xrpl/lib/message-board.js index 07e179e..4fae115 100644 --- a/mb-xrpl/lib/message-board.js +++ b/mb-xrpl/lib/message-board.js @@ -113,7 +113,14 @@ class MessageBoard { await this.destroyInstance(x.containerName, x.tenant, uriInfo.leaseIndex, true); this.activeInstanceCount--; await this.hostClient.updateRegInfo(this.activeInstanceCount); - await this.updateLeaseStatus(x.txHash, LeaseStatus.EXPIRED); + + /** + * Soft deletion for debugging purpose. + */ + // await this.updateLeaseStatus(x.txHash, LeaseStatus.EXPIRED); + + // Delete the lease record related to this instance (Permanent Delete). + await this.deleteLeaseRecord(x.txHash); console.log(`Destroyed ${x.containerName}`); } catch (e) { @@ -421,6 +428,10 @@ class MessageBoard { await this.db.updateValue(this.leaseTable, savingData, { tx_hash: txHash }); } + async deleteLeaseRecord(txHash) { + await this.db.deleteValues(this.leaseTable, { tx_hash: txHash }); + } + getExpiryLedger(ledgerIndex, moments) { return ledgerIndex + moments * this.hostClient.config.momentSize; } diff --git a/mb-xrpl/lib/sqlite-handler.js b/mb-xrpl/lib/sqlite-handler.js index fb8188b..d4722c0 100644 --- a/mb-xrpl/lib/sqlite-handler.js +++ b/mb-xrpl/lib/sqlite-handler.js @@ -164,6 +164,25 @@ class SqliteDatabase { } } + async deleteValues(tableName, filter = null) { + if (!this.db) + throw 'Database connection is not open.'; + + let values = []; + let filterStr = '1 AND ' + if (filter) { + const columnNames = Object.keys(filter); + for (const columnName of columnNames) { + filterStr += `${columnName} = ? AND `; + values.push(filter[columnName] ? filter[columnName] : 'NULL'); + } + } + filterStr = filterStr.slice(0, -5); + + const query = `DELETE FROM ${tableName} WHERE ${filterStr};`; + return (await this.runQuery(query, values)); + } + runQuery(query, params = null) { return new Promise((resolve, reject) => { this.db.run(query, params ? params : [], function (err) { diff --git a/src/hp_manager.cpp b/src/hp_manager.cpp index 822874d..6237098 100644 --- a/src/hp_manager.cpp +++ b/src/hp_manager.cpp @@ -453,7 +453,8 @@ namespace hp LOG_INFO << "Destroying container " << container_name; if (docker_remove(info.username, container_name) == -1 || - sqlite::update_status_in_container(db, container_name, CONTAINER_STATES[STATES::DESTROYED]) == -1) + // sqlite::update_status_in_container(db, container_name, CONTAINER_STATES[STATES::DESTROYED]) == -1) // Soft Deletion. + sqlite::delete_hp_instance(db, container_name) == -1) // Permanent Deletion. { LOG_ERROR << errno << ": Error destroying container " << container_name; return -1; diff --git a/src/sqlite.cpp b/src/sqlite.cpp index 72ffb36..22b5222 100644 --- a/src/sqlite.cpp +++ b/src/sqlite.cpp @@ -45,6 +45,8 @@ namespace sqlite constexpr const char *IS_TABLE_EXISTS = "SELECT * FROM sqlite_master WHERE type='table' AND name = ?"; + constexpr const char *DELETE_HP_INSTANCE = "DELETE FROM instances WHERE name = ?"; + // Message boad database queries constexpr const char *GET_LEASES_LIST = "SELECT timestamp, tx_hash, tenant_xrp_address, life_moments, container_name, created_on_ledger, status FROM leases WHERE status = 'Acquired' OR status = 'Extended'"; @@ -593,4 +595,24 @@ namespace sqlite sqlite3_finalize(stmt); return -1; } + + /** + * Delete an instance record based on the provided container name. + * @param db Database connection. + * @param container_name Name of the container which should be deleted. + * @return 0 on success and -1 on error. + */ + int delete_hp_instance(sqlite3 *db, std::string_view container_name) + { + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db, DELETE_HP_INSTANCE, -1, &stmt, 0) == SQLITE_OK && stmt != NULL && + sqlite3_bind_text(stmt, 1, container_name.data(), container_name.length(), SQLITE_STATIC) == SQLITE_OK && + sqlite3_step(stmt) == SQLITE_DONE) + { + sqlite3_finalize(stmt); + return 0; + } + LOG_ERROR << "Error deleting container " << container_name; + return -1; + } } diff --git a/src/sqlite.hpp b/src/sqlite.hpp index fd6c793..ee99adf 100644 --- a/src/sqlite.hpp +++ b/src/sqlite.hpp @@ -82,5 +82,7 @@ namespace sqlite int get_instance(sqlite3 *db, std::string_view container_name, hp::instance_info &instance); int get_allocated_instance_count(sqlite3 *db); + + int delete_hp_instance(sqlite3 *db, std::string_view container_name); } #endif