fixed primary backup issues
This commit is contained in:
parent
07cea65783
commit
a8c94586b7
@ -10165,7 +10165,13 @@
|
||||
"trader_flo_address": primary_su,
|
||||
"job": "SYNC_PRIMARY_SUPERNODE_DB_WITH_BACKUP_SUPERNODE_DB",
|
||||
"receiver_flo_address": backup_su,
|
||||
}).then(sync_request=>doSend(sync_request, backup_su));
|
||||
}).then(sync_request=>{
|
||||
if (typeof localbitcoinplusplus.backupWS[backup_su]=="object") {
|
||||
doSend(sync_request, backup_su);
|
||||
} else {
|
||||
doSend(sync_request);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
sync_backup_supernode_from_backup_supernode: function (requester="", receiver="", flo_addr_of_backup="") {
|
||||
@ -10176,7 +10182,13 @@
|
||||
"job": "SYNC_BACKUP_SUPERNODE_DB_WITH_BACKUP_SUPERNODE_DB",
|
||||
"receiver_flo_address": receiver,
|
||||
"requester_flo_id": requester
|
||||
}).then(sync_request=>doSend(sync_request, receiver));
|
||||
}).then(sync_request=>{
|
||||
if (typeof localbitcoinplusplus.backupWS[receiver]=="object") {
|
||||
doSend(sync_request, receiver);
|
||||
} else {
|
||||
doSend(sync_request);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
get_sharable_db_data: async function (dbTableNamesArray, backup_db="") {
|
||||
@ -12619,7 +12631,7 @@
|
||||
.call(this, "sync_primary_supernode_from_backup_supernode_response",
|
||||
su_db_data)
|
||||
.then(server_sync_response=>
|
||||
doSend(server_sync_response, params.trader_flo_address));
|
||||
doSend(server_sync_response));
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -15238,51 +15250,6 @@
|
||||
// Connect with primary supernodes
|
||||
await startWebSocket(`ws://${wsUri[0].ip}:${wsUri[0].port}`);
|
||||
|
||||
// Check last connected supernode, if not primary then
|
||||
// update the user data from other su first
|
||||
if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(idbData.myLocalFLOPublicKey)) {
|
||||
if (typeof idbData.lastConnectedSupernode == "string"
|
||||
&& idbData.lastConnectedSupernode !== wsUri[0].trader_flo_address) {
|
||||
showMessage(`INFO: We are fetching your latest data. This could take some time. Do not close the window until then.`);
|
||||
|
||||
// Get data for deposits and withdraw starting from first (and currently alive) backup supernode
|
||||
let closestSuNodes = await readAllDB('myClosestSupernodes');
|
||||
let firstAliveBackupFloIdForPrimarySupernode;
|
||||
|
||||
for (let index = 1; index <= closestSuNodes.length-1; index++) {
|
||||
if (closestSuNodes[index].is_live==true && typeof firstAliveBackupFloIdForPrimarySupernode !== "string") {
|
||||
firstAliveBackupFloIdForPrimarySupernode = closestSuNodes[index].trader_flo_address;
|
||||
localbitcoinplusplus.actions
|
||||
.sync_primary_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address, firstAliveBackupFloIdForPrimarySupernode);
|
||||
}
|
||||
}
|
||||
|
||||
// Update backup db as well for all supernodes you're serving as backup
|
||||
for (let index = closestSuNodes.length-1; index >= closestSuNodes.length-localbitcoinplusplus.master_configurations.MaxBackups; index--) {
|
||||
let firstAliveBackupFloIdForBackupSupernode;
|
||||
if (closestSuNodes[index].is_live==true && typeof firstAliveBackupFloIdForBackupSupernode !== "string") {
|
||||
firstAliveBackupFloIdForBackupSupernode = closestSuNodes[index].trader_flo_address;
|
||||
localbitcoinplusplus.actions
|
||||
.sync_backup_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address,
|
||||
firstAliveBackupFloIdForBackupSupernode, closestSuNodes[index].trader_flo_address);
|
||||
} else {
|
||||
// it will ask backup from backup su next closest
|
||||
for (let j = index-1; j >= index-localbitcoinplusplus.master_configurations.MaxBackups; j--) {
|
||||
const nextBKSu = closestSuNodes[j].trader_flo_address;
|
||||
if (nextBKSu !== idbData.myLocalFLOAddress
|
||||
&& closestSuNodes[index].is_live==true
|
||||
&& typeof firstAliveBackupFloIdForBackupSupernode !== "string") {
|
||||
localbitcoinplusplus.actions
|
||||
.sync_backup_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address,
|
||||
firstAliveBackupFloIdForBackupSupernode, closestSuNodes[j].trader_flo_address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// rebuild private key
|
||||
await privateKeyBuilder();
|
||||
|
||||
@ -15375,6 +15342,7 @@
|
||||
let incoming_msg_local_ip = ``;
|
||||
if (isRequestToLinkIp>=0 || isRequestToLinkOthersIp>=0) {
|
||||
handle_backup_server_messages(response);
|
||||
return;
|
||||
}
|
||||
var res_pos = response.indexOf('{');
|
||||
if (res_pos >= 0) {
|
||||
@ -15383,19 +15351,17 @@
|
||||
if (res_obj.method==="add_user_public_data") {
|
||||
handle_backup_server_messages(response);
|
||||
}
|
||||
if (res_obj.method==="sync_backup_supernode_from_backup_supernode") {
|
||||
// if (localbitcoinplusplus.master_configurations.supernodesPubKeys
|
||||
// .includes(localbitcoinplusplus.wallets.my_local_flo_public_key)) {
|
||||
// response_from_sever = RM_RPC.backup_receive_rpc_response.call(this,
|
||||
// JSON.stringify(res_obj));
|
||||
// }
|
||||
if (res_obj.method==="sync_backup_supernode_from_backup_supernode"
|
||||
|| res_obj.method==="sync_primary_supernode_from_backup_supernode_response") {
|
||||
onMessage(response);
|
||||
return;
|
||||
}
|
||||
if (res_obj.method==="is_node_alive_request"
|
||||
&& localbitcoinplusplus.master_configurations.supernodesPubKeys
|
||||
.includes(localbitcoinplusplus.wallets.my_local_flo_public_key)
|
||||
&& (res_obj.params[0].receiver_flo_address == localbitcoinplusplus.wallets.my_local_flo_address)) {
|
||||
reactor.dispatchEvent('nodeIsAlive', res_obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}.bind(this);
|
||||
@ -15536,7 +15502,7 @@
|
||||
}
|
||||
|
||||
async function onMessage(evt) {
|
||||
var response = evt.data;
|
||||
var response = evt.data || evt;
|
||||
console.log('RESPONSE: ' + response);
|
||||
// If the message is about leaving of a node determine its FLO Id
|
||||
// and fire respective events
|
||||
@ -16563,39 +16529,7 @@
|
||||
let i = 0;
|
||||
for (let tableStoreName in su_db_data) {
|
||||
i++;
|
||||
if (i==Object.keys(su_db_data).length-2) {
|
||||
// Get data for crypto and fiat balances based on vector clock from all backup supernodes
|
||||
reactor.dispatchEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes',
|
||||
{ requesting_user_id: localbitcoinplusplus.wallets.my_local_flo_address});
|
||||
await localbitcoinplusplus.actions.delay(180000).then(()=>{
|
||||
showMessage(`INFO: Balance syncing is complete.`);
|
||||
|
||||
localbitcoinplusplus.amIreadyToServePrimaryUsers = true;
|
||||
|
||||
const RM_RPC = new localbitcoinplusplus.rpc;
|
||||
|
||||
// Method 1: Inform user nodes they can now trade
|
||||
RM_RPC
|
||||
.send_rpc
|
||||
.call(this, "reconnect_with_another_supernode", {
|
||||
"trader_flo_address": respective_trader_id,
|
||||
"receiver_flo_address": "", // message for all
|
||||
"ws_url": websocket.url,
|
||||
"server_msg": `Your primary Supernode is live and synced. You can start using the system.`,
|
||||
}).then(server_response=>doSend(server_response));
|
||||
|
||||
// Method 2: Now inform all backup supernodes you are back and request to stop serving your users
|
||||
// RM_RPC
|
||||
// .send_rpc
|
||||
// .call(this, "update_supernode_status", {
|
||||
// trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address,
|
||||
// trader_pub_key: localbitcoinplusplus.wallets.my_local_flo_public_key,
|
||||
// su_status: true,
|
||||
// }).then(server_response=>
|
||||
// doSend(server_response, nextSu.data.id));
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// skip loop if the property is from prototype
|
||||
if (tableStoreName == 'trader_flo_address'
|
||||
|| tableStoreName == 'receiver_flo_address'
|
||||
@ -16628,6 +16562,40 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (i==Object.keys(su_db_data).length-2) {
|
||||
// Get data for crypto and fiat balances based on vector clock from all backup supernodes
|
||||
reactor.dispatchEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes',
|
||||
{ requesting_user_id: localbitcoinplusplus.wallets.my_local_flo_address});
|
||||
await localbitcoinplusplus.actions.delay(180000).then(()=>{
|
||||
showMessage(`INFO: Balance syncing is complete.`);
|
||||
|
||||
localbitcoinplusplus.amIreadyToServePrimaryUsers = true;
|
||||
|
||||
const RM_RPC = new localbitcoinplusplus.rpc;
|
||||
|
||||
// Method 1: Inform user nodes they can now trade
|
||||
RM_RPC
|
||||
.send_rpc
|
||||
.call(this, "reconnect_with_another_supernode", {
|
||||
"trader_flo_address": su_db_data.trader_flo_address,
|
||||
//"receiver_flo_address": "", // message for all
|
||||
"ws_url": websocket.url,
|
||||
"server_msg": `Your primary Supernode is live and synced. You can start using the system.`,
|
||||
}).then(server_response=>doSend(server_response));
|
||||
|
||||
// Method 2: Now inform all backup supernodes you are back and request to stop serving your users
|
||||
// RM_RPC
|
||||
// .send_rpc
|
||||
// .call(this, "update_supernode_status", {
|
||||
// trader_flo_address: localbitcoinplusplus.wallets.my_local_flo_address,
|
||||
// trader_pub_key: localbitcoinplusplus.wallets.my_local_flo_public_key,
|
||||
// su_status: true,
|
||||
// }).then(server_response=>
|
||||
// doSend(server_response, nextSu.data.id));
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
}
|
||||
@ -18827,14 +18795,16 @@
|
||||
// The message is for a specific supernode only
|
||||
if (user_flo_id!=="" && user_flo_id.length>0) {
|
||||
try {
|
||||
wsConn = localbitcoinplusplus.backupWS[user_flo_id].ws_connection;
|
||||
if(wsConn.readyState !== 1) {
|
||||
let msg = "WARNING: Websocket not ready to broadcast messages.";
|
||||
showMessage(msg);
|
||||
console.warn(msg);
|
||||
return;
|
||||
if (typeof localbitcoinplusplus.backupWS[user_flo_id]=="object") {
|
||||
wsConn = localbitcoinplusplus.backupWS[user_flo_id].ws_connection;
|
||||
if(wsConn.readyState !== 1) {
|
||||
let msg = "WARNING: Websocket not ready to broadcast messages.";
|
||||
showMessage(msg);
|
||||
console.warn(msg);
|
||||
return;
|
||||
}
|
||||
wsConn.send(finalMessage);
|
||||
}
|
||||
wsConn.send(finalMessage);
|
||||
} catch (error) {
|
||||
showMessage(`ERROR: Failed to determine WS connection with ${user_flo_id}.`);
|
||||
throw new Error(error);
|
||||
@ -18847,14 +18817,16 @@
|
||||
|
||||
for (const key in localbitcoinplusplus.backupWS) {
|
||||
if (localbitcoinplusplus.backupWS.hasOwnProperty(key)) {
|
||||
const ws_conn = localbitcoinplusplus.backupWS[key].ws_connection;
|
||||
if(ws_conn.readyState !== 1) {
|
||||
let msg = "WARNING: Websocket not ready to broadcast messages.";
|
||||
showMessage(msg);
|
||||
console.warn(msg);
|
||||
break;
|
||||
if (typeof localbitcoinplusplus.backupWS[key]=="object") {
|
||||
const ws_conn = localbitcoinplusplus.backupWS[key].ws_connection;
|
||||
if(ws_conn.readyState !== 1) {
|
||||
let msg = "WARNING: Websocket not ready to broadcast messages.";
|
||||
showMessage(msg);
|
||||
console.warn(msg);
|
||||
break;
|
||||
}
|
||||
ws_conn.send(finalMessage);
|
||||
}
|
||||
ws_conn.send(finalMessage);
|
||||
}
|
||||
}
|
||||
|
||||
@ -19936,6 +19908,55 @@
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Check last connected supernode, if not primary then
|
||||
// update the user data from other su first
|
||||
wsUri = await localbitcoinplusplus.kademlia.getSupernodeSeed(idbData.myLocalFLOAddress);
|
||||
|
||||
if (localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(idbData.myLocalFLOPublicKey)) {
|
||||
if (typeof idbData.lastConnectedSupernode == "string"
|
||||
&& idbData.lastConnectedSupernode !== wsUri[0].trader_flo_address) {
|
||||
showMessage(`INFO: We are fetching your latest data. This could take some time. Do not close the window until then.`);
|
||||
|
||||
// Get data for deposits and withdraw starting from first (and currently alive) backup supernode
|
||||
let closestSuNodes = await readAllDB('myClosestSupernodes');
|
||||
let firstAliveBackupFloIdForPrimarySupernode;
|
||||
|
||||
for (let index = 1; index <= closestSuNodes.length-1; index++) {
|
||||
if (closestSuNodes[index].is_live==true && typeof firstAliveBackupFloIdForPrimarySupernode !== "string") {
|
||||
firstAliveBackupFloIdForPrimarySupernode = closestSuNodes[index].trader_flo_address;
|
||||
localbitcoinplusplus.actions
|
||||
.sync_primary_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address, firstAliveBackupFloIdForPrimarySupernode);
|
||||
}
|
||||
}
|
||||
|
||||
// Update backup db as well for all supernodes you're serving as backup
|
||||
for (let index = closestSuNodes.length-1; index >= closestSuNodes.length-localbitcoinplusplus.master_configurations.MaxBackups; index--) {
|
||||
let firstAliveBackupFloIdForBackupSupernode;
|
||||
if (closestSuNodes[index].is_live==true && typeof firstAliveBackupFloIdForBackupSupernode !== "string") {
|
||||
firstAliveBackupFloIdForBackupSupernode = closestSuNodes[index].trader_flo_address;
|
||||
localbitcoinplusplus.actions
|
||||
.sync_backup_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address,
|
||||
firstAliveBackupFloIdForBackupSupernode, closestSuNodes[index].trader_flo_address);
|
||||
} else {
|
||||
// it will ask backup from backup su next closest
|
||||
for (let j = index-1; j >= index-localbitcoinplusplus.master_configurations.MaxBackups; j--) {
|
||||
const nextBKSu = closestSuNodes[j].trader_flo_address;
|
||||
if (nextBKSu !== idbData.myLocalFLOAddress
|
||||
&& closestSuNodes[index].is_live==true
|
||||
&& typeof firstAliveBackupFloIdForBackupSupernode !== "string") {
|
||||
localbitcoinplusplus.actions
|
||||
.sync_backup_supernode_from_backup_supernode(closestSuNodes[0].trader_flo_address,
|
||||
firstAliveBackupFloIdForBackupSupernode, closestSuNodes[j].trader_flo_address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Show balances
|
||||
displayBalances(idbData.myLocalFLOAddress);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user