Backup module: bug fixes

- Fixed: keys.addShare unhandled on reject
- Fixed: sinks in Cooldown period not added in sink_chest (for market to verify tx that already occurred) on master process start.
- Fixed: sink list from slaves not handled properly for reconstruct (if needed)
- Fixed: minor syntax bugs
This commit is contained in:
sairajzero 2022-11-16 22:23:55 +05:30
parent e4603078d2
commit 70c943c997
2 changed files with 33 additions and 26 deletions

View File

@ -55,7 +55,8 @@ function sendSharesToNodes(sinkID, group, shares) {
let ref = Date.now();
shares_pending[sinkID] = { shares, group, ref };
if (keys.node_id in shares) {
shares.forEach(s => keys.addShare(group, sinkID, ref, s))
shares_pending[sinkID].shares[keys.node_id].forEach(s =>
keys.addShare(group, sinkID, ref, s).then(_ => null).catch(error => console.error(error)));
delete shares_pending[sinkID].shares[keys.node_id];
}
for (let node in shares)
@ -134,7 +135,7 @@ function collectShares(sinkID, ref, share) {
if (_mode !== MASTER_MODE)
return console.warn("Not serving as master");
if (!(sinkID in shares_collected))
return console.error("Something is wrong! Slaves are sending sinkID thats not been collected");
return console.debug("Received shares for sink thats not been collected right now");
if (shares_collected[sinkID].ref > ref)
return console.debug("Received expired share");
else if (shares_collected[sinkID].ref < ref) {
@ -206,16 +207,19 @@ function informLiveNodes(init) {
console.warn(`Node(${nodes[i]}) is offline`);
if (init && flag)
syncRequest();
keys.getStoredList().then(result => {
if (Object.keys(result).length) {
keys.getStoredList().then(stored_list => {
if (Object.keys(stored_list).length) {
keys.getDiscardedList().then(discarded_list => {
for (let group in result)
result.group.forEach(id => {
let cur_time = Date.now();
for (let group in stored_list)
stored_list[group].forEach(id => {
if (!(id in discarded_list))
reconstructShares(group, id);
reconstructShares(group, id)
else if (cur_time - discarded_list[id] < DISCARD_COOLDOWN) //sinkID still in cooldown period
keys.sink_chest.set_id(group, id, null);
});
}).catch(error => console.error(error))
} else if (!flag) {
} else if (init && !flag) {
console.log("Starting the exchange...");
//generate a sinkID for each group in starting list
keys.sink_groups.initial_list.forEach(group =>
@ -248,7 +252,7 @@ function reconstructShares(group, sinkID) {
collectAndCall(group, sinkID, sinkKey => sendSharesToNodes(sinkID, group, generateShares(sinkKey)));
}
function slaveConnect(floID, pubKey, ws, sinks) {
function slaveConnect(floID, pubKey, ws, slave_sinks) {
if (_mode !== MASTER_MODE)
return console.warn("Not serving as master");
ws.floID = floID;
@ -263,17 +267,18 @@ function slaveConnect(floID, pubKey, ws, sinks) {
for (let sinkID in shares_collected)
requestShare(ws, shares_collected[sinkID].group, sinkID);
//check if sinks in slaves are present
if (Array.isArray(sinks)) {
for (let sinkID of sinks) {
if (!keys.sink_chest.includes(shares_collected[sinkID].group, sinkID))
keys.checkIfDiscarded(sinkID)
.then(result => result === false ? reconstructShares(shares_collected[sinkID].group, sinkID) : null)
.catch(error => console.error(error))
}
if (slave_sinks instanceof Object) {
for (let group in slave_sinks)
for (let sinkID of slave_sinks[group]) {
if (!keys.sink_chest.includes(group, sinkID))
keys.checkIfDiscarded(sinkID)
.then(result => result === false ? reconstructShares(group, sinkID) : null)
.catch(error => console.error(error))
}
}
}
const eCode = require('../docs/scripts/floExchangeAPI').errorCode;
const eCode = require('../../docs/scripts/floExchangeAPI').errorCode;
function generateSink(group) {
return new Promise((resolve, reject) => {
@ -292,7 +297,7 @@ function generateSink(group) {
function reshareSink(id) {
return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(data.id))
if (!floCrypto.validateAddr(id))
return reject(INVALID(eCode.INVALID_VALUE, `Invalid ID ${id}`));
else {
let group = keys.sink_chest.find_group(id);
@ -315,7 +320,7 @@ function reshareSink(id) {
function discardSink(id) {
return new Promise((resolve, reject) => {
if (!floCrypto.validateAddr(data.id))
if (!floCrypto.validateAddr(id))
return reject(INVALID(eCode.INVALID_VALUE, `Invalid ID ${id}`));
else if (!keys.sink_chest.find_group(id))
return reject(INVALID(eCode.NOT_FOUND, `ID ${id} not found`));
@ -341,8 +346,8 @@ function checkForDiscardedSinks() {
keys.sink_chest.rm_id(group, id);
else
keys.sink_chest.set_id(group, id, null);
if (sinkID in shares_collected && !discarded_sinks.includes(sinkID))
discarded_sinks.push(sinkID);
if (id in shares_collected && !discarded_sinks.includes(id))
discarded_sinks.push(id);
}
}).catch(error => console.debug(error)))
}

View File

@ -21,14 +21,16 @@ function startSlaveProcess(ws, init) {
//set masterWS
ws.on('message', processDataFromMaster);
masterWS = ws;
let sinks_stored = [];
let sinks_stored = {};
Promise.all([keys.getStoredList(), keys.getDiscardedList()]).then(result => {
let stored_list = result[0],
discarded_list = result[1];
for (let g in stored_list)
for (let id in stored_list[g])
if (!(stored_list[g][id] in discarded_list))
sinks_stored.push(id);
for (let group in stored_list) {
sinks_stored[group] = [];
for (let id of stored_list[group])
if (!(id in discarded_list))
sinks_stored[group].push(id);
}
}).catch(error => console.error(error)).finally(_ => {
//inform master
let message = {