Bug fixes

This commit is contained in:
sairajzero 2021-08-06 19:37:09 +05:30
parent 50c820310a
commit 5dd422afed
4 changed files with 71 additions and 86 deletions

View File

@ -343,7 +343,7 @@ function Database(user, password, dbname, host = 'localhost') {
.then(result => resolve(result)) .then(result => resolve(result))
.catch(error => reject(error)); .catch(error => reject(error));
}); });
} };
db.clearAuthorisedAppData = function(snID, app, adminID, subAdmins, timestamp) { db.clearAuthorisedAppData = function(snID, app, adminID, subAdmins, timestamp) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {

View File

@ -454,12 +454,12 @@ function orderBackup(order) {
req_sync = []; req_sync = [];
let cur_serve = kBucket.innerNodes(_prevNode.id, myFloID).concat(myFloID); let cur_serve = kBucket.innerNodes(_prevNode.id, myFloID).concat(myFloID);
for (let n in order) { for (let n in order) {
if (!cur_serve.includes(n) && order[n] + 1 !== _list[n]) { if (!cur_serve.includes(n) && order[n] + 1 !== _list[n] && n in floGlobals.supernodes) {
if (order[n] >= floGlobals.sn_config.backupDepth) if (order[n] >= floGlobals.sn_config.backupDepth)
DB.dropTable(n).then(_ => null) DB.dropTable(n).then(_ => null)
.catch(error => console.error(error)) .catch(error => console.error(error))
.finally(_ => _list.delete(n)); .finally(_ => _list.delete(n));
else { else if (order[n] >= 0) {
if (_list[n] === undefined) if (_list[n] === undefined)
req_sync.push(n); req_sync.push(n);
_list[n] = order[n] + 1; _list[n] = order[n] + 1;
@ -583,7 +583,7 @@ function deleteMigratedData(data, from, packet) {
}; };
function initiateRefresh() { function initiateRefresh() {
refresher.invoke(false).then(_ => null).catch(e => console.error(e)); refresher.invoke(false).then(_ => null).catch(_ => null);
}; };
//Forward incoming to next node //Forward incoming to next node
@ -603,16 +603,15 @@ function forwardToNextNode(mode, data) {
function dataMigration(node_change, flag) { function dataMigration(node_change, flag) {
if (!Object.keys(node_change).length) if (!Object.keys(node_change).length)
return; return;
console.log("Node list changed! Data migration required"); console.log("Node list changed! Data migration required", node_change);
if (flag) dataMigration.intimateAllNodes(); //Initmate All nodes to call refresher if (flag) dataMigration.intimateAllNodes(); //Initmate All nodes to call refresher
let new_nodes = [], let new_nodes = [],
del_nodes = []; del_nodes = [];
for (let n in node_change) for (let n in node_change)
(node_change[n] ? new_nodes : del_nodes).push(n); (node_change[n] ? new_nodes : del_nodes).push(n);
if (_prevNode.id && del_nodes.includes(_prevNode.id)) { if (_prevNode.id && del_nodes.includes(_prevNode.id))
_list[_prevNode.id] = 0; //Temporary serve for the deleted node
_prevNode.close(); _prevNode.close();
}; const old_kb = kBucket;
setTimeout(() => { setTimeout(() => {
//reconnect next node if current next node is deleted //reconnect next node if current next node is deleted
if (_nextNode.id) { if (_nextNode.id) {
@ -634,16 +633,17 @@ function dataMigration(node_change, flag) {
setTimeout(() => { setTimeout(() => {
dataMigration.process_new(new_nodes); dataMigration.process_new(new_nodes);
dataMigration.process_del(del_nodes); dataMigration.process_del(del_nodes, old_kb);
}, MIGRATE_WAIT_DELAY); }, MIGRATE_WAIT_DELAY);
}, MIGRATE_WAIT_DELAY); }, MIGRATE_WAIT_DELAY);
}; };
//data migration sub-process: Deleted nodes //data migration sub-process: Deleted nodes
dataMigration.process_del = async function(del_nodes) { dataMigration.process_del = async function(del_nodes, old_kb) {
if (!del_nodes.length) if (!del_nodes.length)
return; return;
let process_nodes = del_nodes.filter(n => _list.serving.includes(n)); let serve = _prevNode.id ? old_kb.innerNodes(_prevNode.id, myFloID) : _list.serving;
let process_nodes = del_nodes.filter(n => serve.includes(n));
if (process_nodes.length) { if (process_nodes.length) {
connectToAllActiveNodes().then(ws_connections => { connectToAllActiveNodes().then(ws_connections => {
let remaining = process_nodes.length; let remaining = process_nodes.length;

View File

@ -1,10 +1,9 @@
'use strict'; 'use strict';
require('./lib/BuildKBucket'); require('./lib/BuildKBucket');
(function(GLOBAL) {
var kBucket = GLOBAL.kBucket = {};
var SNKB, SNCO;
function decodeID(floID) { module.exports = function K_Bucket(options = {}) {
const decodeID = function(floID) {
let k = bitjs.Base58.decode(floID); let k = bitjs.Base58.decode(floID);
k.shift(); k.shift();
k.splice(-4, 4); k.splice(-4, 4);
@ -15,97 +14,84 @@ require('./lib/BuildKBucket');
return nodeIdNewInt8Array; return nodeIdNewInt8Array;
}; };
function distanceOf(floID) { const list = options.list || Object.keys(floGlobals.supernodes);
let decodedId = decodeID(floID); const refID = options.masterID || floGlobals.SNStorageID;
return SNKB.distance(SNKB.localNodeId, decodedId); const _KB = new BuildKBucket({
}; localNodeId: decodeID(refID)
});
list.forEach(id => _KB.add({
id: decodeID(id),
floID: id
}));
const _CO = list.map(sn => [_KB.distance(decodeID(refID), decodeID(sn)), sn])
.sort((a, b) => a[0] - b[0])
.map(a => a[1]);
function constructKB(list, refID) { const self = this;
let KB = new BuildKBucket({
localNodeId: decodeID(refID)
});
list.forEach(id => KB.add({
id: decodeID(id),
floID: id
}));
return KB;
};
kBucket.launch = function() { Object.defineProperty(self, 'order', {
return new Promise((resolve, reject) => { get: () => Array.from(_CO)
try { });
let superNodeList = Object.keys(floGlobals.supernodes);
let masterID = floGlobals.SNStorageID;
SNKB = constructKB(superNodeList, masterID);
SNCO = superNodeList.map(sn => [distanceOf(sn), sn])
.sort((a, b) => a[0] - b[0])
.map(a => a[1]);
resolve('SuperNode KBucket formed');
} catch (error) {
reject(error);
};
});
};
kBucket.innerNodes = function(id1, id2) { self.innerNodes = function(id1, id2) {
if (!SNCO.includes(id1) || !SNCO.includes(id2)) if (!_CO.includes(id1) || !_CO.includes(id2))
throw Error('Given nodes are not supernode'); throw Error('Given nodes are not in KB');
let iNodes = []; let iNodes = [];
for (let i = SNCO.indexOf(id1) + 1; SNCO[i] != id2; i++) { for (let i = _CO.indexOf(id1) + 1; _CO[i] != id2; i++) {
if (i < SNCO.length) if (i < _CO.length)
iNodes.push(SNCO[i]); iNodes.push(_CO[i]);
else i = -1; else i = -1;
}; };
return iNodes; return iNodes;
}; };
kBucket.outterNodes = function(id1, id2) { self.outterNodes = function(id1, id2) {
if (!SNCO.includes(id1) || !SNCO.includes(id2)) if (!_CO.includes(id1) || !_CO.includes(id2))
throw Error('Given nodes are not supernode'); throw Error('Given nodes are not in KB');
let oNodes = []; let oNodes = [];
for (let i = SNCO.indexOf(id2) + 1; SNCO[i] != id1; i++) { for (let i = _CO.indexOf(id2) + 1; _CO[i] != id1; i++) {
if (i < SNCO.length) if (i < _CO.length)
oNodes.push(SNCO[i]); oNodes.push(_CO[i]);
else i = -1; else i = -1;
}; };
return oNodes; return oNodes;
}; };
kBucket.prevNode = function(id, N = 1) { self.prevNode = function(id, N = 1) {
let n = N || SNCO.length; let n = N || _CO.length;
if (!SNCO.includes(id)) if (!_CO.includes(id))
throw Error('Given node is not supernode'); throw Error('Given node is not KB');
let pNodes = []; let pNodes = [];
for (let i = 0, j = SNCO.indexOf(id) - 1; i < n; j--) { for (let i = 0, j = _CO.indexOf(id) - 1; i < n; j--) {
if (j == SNCO.indexOf(id)) if (j == _CO.indexOf(id))
break; break;
else if (j > -1) else if (j > -1)
pNodes[i++] = SNCO[j]; pNodes[i++] = _CO[j];
else j = SNCO.length; else j = _CO.length;
}; };
return (N == 1 ? pNodes[0] : pNodes); return (N == 1 ? pNodes[0] : pNodes);
}; };
kBucket.nextNode = function(id, N = 1) { self.nextNode = function(id, N = 1) {
let n = N || SNCO.length; let n = N || _CO.length;
if (!SNCO.includes(id)) if (!_CO.includes(id))
throw Error('Given node is not supernode'); throw Error('Given node is not KB');
let nNodes = []; let nNodes = [];
for (let i = 0, j = SNCO.indexOf(id) + 1; i < n; j++) { for (let i = 0, j = _CO.indexOf(id) + 1; i < n; j++) {
if (j == SNCO.indexOf(id)) if (j == _CO.indexOf(id))
break; break;
else if (j < SNCO.length) else if (j < _CO.length)
nNodes[i++] = SNCO[j]; nNodes[i++] = _CO[j];
else j = -1; else j = -1;
}; };
return (N == 1 ? nNodes[0] : nNodes); return (N == 1 ? nNodes[0] : nNodes);
}; };
kBucket.closestNode = function(id, N = 1) { self.closestNode = function(id, N = 1) {
let decodedId = decodeID(id); let decodedId = decodeID(id);
let n = N || SNCO.length; let n = N || _CO.length;
let cNodes = SNKB.closest(decodedId, n) let cNodes = _KB.closest(decodedId, n)
.map(k => k.floID); .map(k => k.floID);
return (N == 1 ? cNodes[0] : cNodes); return (N == 1 ? cNodes[0] : cNodes);
}; };
})(typeof global !== "undefined" ? global : window); }

View File

@ -2,7 +2,7 @@ const config = require('../args/config.json');
global.floGlobals = require("./floGlobals"); global.floGlobals = require("./floGlobals");
require('./set_globals'); require('./set_globals');
require('./lib'); require('./lib');
require('./kBucket'); const K_Bucket = require('./kBucket');
require('./floCrypto'); require('./floCrypto');
require('./floBlockchainAPI'); require('./floBlockchainAPI');
const Database = require("./database"); const Database = require("./database");
@ -87,13 +87,12 @@ function refreshBlockchainData(base, flag) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
readSupernodeConfigFromAPI(base, flag).then(result => { readSupernodeConfigFromAPI(base, flag).then(result => {
console.log(result); console.log(result);
kBucket.launch().then(result => { global.kBucket = new K_Bucket();
//console.log(result); console.log("SNCO:", kBucket.order);
readAppSubAdminListFromAPI(base) readAppSubAdminListFromAPI(base)
.then(result => console.log(result)) .then(result => console.log(result))
.catch(warn => console.warn(warn)) .catch(warn => console.warn(warn))
.finally(_ => resolve("Refreshed Data from blockchain")); .finally(_ => resolve("Refreshed Data from blockchain"));
}).catch(error => reject(error));
}).catch(error => reject(error)); }).catch(error => reject(error));
}); });
}; };
@ -241,12 +240,12 @@ function selfDiskMigration(node_change) {
disks.push(result[i][j].split("_")[1]); disks.push(result[i][j].split("_")[1]);
disks.forEach(n => { disks.forEach(n => {
if (node_change[n] === false) if (node_change[n] === false)
DB.dropTable(n).then(_ => null).catch(_ => null); DB.dropTable(n).then(_ => null).catch(e => console.error(e));
DB.getData(n, 0).then(result => { DB.getData(n, 0).then(result => {
result.forEach(d => { result.forEach(d => {
let closest = kBucket.closestNode(d.receiverID); let closest = kBucket.closestNode(d.receiverID);
if (closest !== n) if (closest !== n)
DB.deleteData(n, d.vectorClock).then(_ => null).catch(_ => null); DB.deleteData(n, d.vectorClock).then(_ => null).catch(e => console.error(e));
}); });
}).catch(error => console.error(error)); }).catch(error => console.error(error));
}); });