Bug fixes
This commit is contained in:
parent
50c820310a
commit
5dd422afed
@ -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) => {
|
||||||
|
|||||||
20
src/intra.js
20
src/intra.js
@ -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;
|
||||||
|
|||||||
116
src/kBucket.js
116
src/kBucket.js
@ -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);
|
}
|
||||||
19
src/main.js
19
src/main.js
@ -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));
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user