working on db restoring of primary supernode from rest supernodes

This commit is contained in:
Abhishek Sinha 2019-04-27 14:09:44 +05:30
parent d95812e4f0
commit 2f38275d88

View File

@ -14871,7 +14871,8 @@
newKeys.address.length > 0) { newKeys.address.length > 0) {
localbitcoinplusplusObj.myLocalFLOAddress = newKeys.address; localbitcoinplusplusObj.myLocalFLOAddress = newKeys.address;
localbitcoinplusplusObj.myLocalFLOPublicKey = newKeys.pubKeyHex; localbitcoinplusplusObj.myLocalFLOPublicKey = newKeys.pubKeyHex;
localbitcoinplusplusObj.lastConnectedTime = + new Date();
// launch KBuckets // launch KBuckets
launchKBuckects = await localbitcoinplusplus.kademlia.launchKBucket(newKeys.address); launchKBuckects = await localbitcoinplusplus.kademlia.launchKBucket(newKeys.address);
@ -14881,8 +14882,6 @@
throw new Error(kmsg); throw new Error(kmsg);
} }
updateinDB("localbitcoinUser", localbitcoinplusplusObj, "00-01");
wsUri = await localbitcoinplusplus.kademlia.getSupernodeSeed( wsUri = await localbitcoinplusplus.kademlia.getSupernodeSeed(
localbitcoinplusplusObj.myLocalFLOAddress); localbitcoinplusplusObj.myLocalFLOAddress);
@ -14927,6 +14926,10 @@
BACKUP_DB[uri.trader_flo_address].createNewDB(); BACKUP_DB[uri.trader_flo_address].createNewDB();
}); });
localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wsUri[0].trader_flo_address;
updateinDB("localbitcoinUser", localbitcoinplusplusObj, "00-01");
resolve(true); resolve(true);
return; return;
@ -14965,12 +14968,21 @@
localbitcoinplusplus.kademlia.restoreSupernodeKBucket(); localbitcoinplusplus.kademlia.restoreSupernodeKBucket();
// Get the most ideal supernode to connect
// Connect with primary supernodes // Connect with primary supernodes
await startWebSocket(`ws://${wsUri[0].ip}:${wsUri[0].port}`); 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 (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.`);
reactor.dispatchEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes',
{ requesting_user_id: idbData.myLocalFLOAddress});
await localbitcoinplusplus.actions.delay(180000).then(()=>{
showMessage(`INFO: Data syncing is complete.`);
});
}
// rebuild private key // rebuild private key
await privateKeyBuilder(); await privateKeyBuilder();
@ -15501,9 +15513,24 @@
this.ws_connection = new WebSocket(this.ws_url); this.ws_connection = new WebSocket(this.ws_url);
const switchMyWS = new backupSupernodesWebSocketObject(); const switchMyWS = new backupSupernodesWebSocketObject();
this.ws_connection.onopen = function (evt) { this.ws_connection.onopen = function (evt) {
reactor.addEventListener('backup_supernode_up', function() { reactor.addEventListener('backup_supernode_up', async function() {
showMessage(`Connected to backup Supernode sever: ${evt.srcElement.url}.`); showMessage(`Connected to backup Supernode sever: ${evt.srcElement.url}.`);
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true); switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
let my_local_data = await readDB('localbitcoinUser', '00-01');
if (typeof my_local_data == "object"
&& localbitcoinplusplus.master_configurations.supernodesPubKeys.includes(my_local_data.myLocalFLOAddress)) {
const conn_su_flo_id = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
if (typeof conn_su_flo_id == "string") {
my_local_data.lastConnectedTime = + new Date();
my_local_data.lastConnectedSupernode = conn_su_flo_id;
updateinDB('localbitcoinUser', my_local_data);
} else {
mss = `WARNING: Failed to update current supernode connected status in localbitcoinUser.`;
showMessage(mss);
throw new Error(mss);
}
}
}); });
reactor.dispatchEvent('backup_supernode_up'); reactor.dispatchEvent('backup_supernode_up');
}.bind(this); }.bind(this);
@ -15647,13 +15674,7 @@
} }
function onOpen(evt) { function onOpen(evt) {
reactor.addEventListener('primary_supernode_up', function() { reactor.dispatchEvent('new_supernode_connected', evt);
const switchMyWS = new backupSupernodesWebSocketObject();
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
showMessage(`Connected successfully to Supernode: ${evt.srcElement.url}`);
writeToScreen("CONNECTED");
});
reactor.dispatchEvent('primary_supernode_up');
} }
function onClose(evt) { function onClose(evt) {
@ -16661,7 +16682,7 @@
(async function() { (async function() {
let getPrimarySuObj = await localbitcoinplusplus.kademlia let getPrimarySuObj = await localbitcoinplusplus.kademlia
.determineClosestSupernode(subjectUser); .determineClosestSupernode(res_obj.params[0].trader_flo_address);
let primarySupernode = getPrimarySuObj[0].data.id; let primarySupernode = getPrimarySuObj[0].data.id;
@ -16684,36 +16705,9 @@
showMessage(mss); showMessage(mss);
throw new Error(mss); throw new Error(mss);
} }
if (data.vectorClock < myOwnDBData.vectorClock) { if(data.vectorClock > myOwnDBData.vectorClock) {
// You have the latest data, send it to other supernodes
let getNextClosestSuObj = await localbitcoinplusplus.kademlia
.determineClosestSupernode(req_dt.leaving_supernode_flo_id, 3);
getNextClosestSuObj.map((nextSu, i)=>{
if(nextSu.data.id !==localbitcoinplusplus.wallets.my_local_flo_address) {
let nextSuConn = localbitcoinplusplus.backupWS[nextSu.data.id];
if(typeof nextSuConn !== "object") {
let msg = `WARNING: Failed to open a backup WS connection with Supernode ${nextSu}.`;
showMessage(msg);
throw new Error(msg);
}
let server_response = RM_RPC
.send_rpc
.call(this, "sync_data_by_vector_clock", {
trader_flo_address: data.trader_flo_address,
receiver_flo_address: nextSu.data.id,
leaving_supernode_flo_id: req_dt.leaving_supernode_flo_id,
data: myOwnDBData,
dbTable: dbTable
});
doSend(server_response, nextSu.data.id);
}
})
} else if(data.vectorClock > myOwnDBData.vectorClock) {
// You have old data, update respective DB. // You have old data, update respective DB.
data.increaseVectorClock = false;
updateinDB(dbTable, data).then(()=>{ updateinDB(dbTable, data).then(()=>{
showMessage(`INFO: Data updated in ${dbTable} for id ${data.id}.`); showMessage(`INFO: Data updated in ${dbTable} for id ${data.id}.`);
}); });
@ -18111,6 +18105,8 @@
myLocalFLOAddress: "", myLocalFLOAddress: "",
myLocalFLOPublicKey: "", myLocalFLOPublicKey: "",
myAddressTrustLevel: 1, myAddressTrustLevel: 1,
lastConnectedSupernode: "",
lastConnectedTime: "",
}; };
const userPublicData = { const userPublicData = {
@ -18498,6 +18494,9 @@
try { try {
if(typeof Obj.vectorClock == "undefined") { if(typeof Obj.vectorClock == "undefined") {
Obj.vectorClock = 0; Obj.vectorClock = 0;
} else if(typeof Obj.increaseVectorClock == "boolean"
&& Obj.increaseVectorClock === false) {
// leave the vector clock field unchanged
} else { } else {
Obj.vectorClock += 1; Obj.vectorClock += 1;
} }
@ -19729,12 +19728,17 @@
</script> </script>
<!-- Events -->
<script> <script>
reactor.registerEvent('primary_supernode_up'); reactor.registerEvent('new_supernode_connected');
reactor.registerEvent('primary_supernode_down'); reactor.registerEvent('primary_supernode_down');
reactor.registerEvent('backup_supernode_up'); reactor.registerEvent('backup_supernode_up');
reactor.registerEvent('backup_supernode_down'); reactor.registerEvent('backup_supernode_down');
reactor.registerEvent('fireNodeWelcomeBackEvent'); reactor.registerEvent('fireNodeWelcomeBackEvent');
reactor.registerEvent('fireNodeGoodByeEvent');
reactor.registerEvent('requestSupernodeToActAsBackupServerForRequestingUserNode');
reactor.registerEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes');
reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) { reactor.addEventListener('fireNodeWelcomeBackEvent', function(evt) {
let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key); let getFLOId = bitjs.FLO_TEST.pubkey2address(evt.flo_public_key);
if(localbitcoinplusplus.master_configurations.supernodesPubKeys if(localbitcoinplusplus.master_configurations.supernodesPubKeys
@ -19744,9 +19748,33 @@
msg = `INFO: User node ${getFLOId} joined.`; msg = `INFO: User node ${getFLOId} joined.`;
} }
showMessage(msg); showMessage(msg);
}) });
reactor.addEventListener('new_supernode_connected', async function(evt) {
const switchMyWS = new backupSupernodesWebSocketObject();
switchMyWS.updateSupernodeAvailabilityStatus(evt.srcElement.url, true);
showMessage(`INFO: Connected successfully to Supernode: ${evt.srcElement.url}`);
writeToScreen("CONNECTED");
let my_local_data = await readDB('localbitcoinUser', '00-01');
if (typeof my_local_data == "object"
&& !localbitcoinplusplus.master_configurations.supernodesPubKeys
.includes(my_local_data.myLocalFLOAddress)) {
const conn_su_flo_id = await switchMyWS.getFloIdFromWSUrl(evt.srcElement.url);
if (typeof conn_su_flo_id == "string") {
my_local_data.lastConnectedTime = + new Date();
my_local_data.lastConnectedSupernode = conn_su_flo_id;
updateinDB('localbitcoinUser', my_local_data);
} else {
mss = `WARNING: Failed to update current supernode connected status in localbitcoinUser.`;
showMessage(mss);
throw new Error(mss);
}
}
});
reactor.registerEvent('fireNodeGoodByeEvent');
reactor.addEventListener('fireNodeGoodByeEvent', function(evt_msg) { reactor.addEventListener('fireNodeGoodByeEvent', function(evt_msg) {
let i = evt_msg.indexOf(' ') let i = evt_msg.indexOf(' ')
let temp_ip = evt_msg.substr(0, i) let temp_ip = evt_msg.substr(0, i)
@ -19765,7 +19793,6 @@
}); });
}); });
reactor.registerEvent('requestSupernodeToActAsBackupServerForRequestingUserNode');
reactor.addEventListener('requestSupernodeToActAsBackupServerForRequestingUserNode', reactor.addEventListener('requestSupernodeToActAsBackupServerForRequestingUserNode',
async function(params) { async function(params) {
let getNextClosestSuObj = await localbitcoinplusplus.kademlia.determineClosestSupernode(params.leaving_supernode_flo_id, 3); let getNextClosestSuObj = await localbitcoinplusplus.kademlia.determineClosestSupernode(params.leaving_supernode_flo_id, 3);
@ -19814,7 +19841,6 @@
} }
}); });
reactor.registerEvent('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes');
reactor.addEventListener('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes', async function(params) { reactor.addEventListener('primarySupernodeUpdatingLatestDataForItsUserFromOtherSupernodes', async function(params) {
let msg = ''; let msg = '';
if (typeof params.requesting_user_id !== "string") { if (typeof params.requesting_user_id !== "string") {
@ -19836,25 +19862,25 @@
if (localbitcoinplusplus.wallets.my_local_flo_address !== primarySupernode) return; if (localbitcoinplusplus.wallets.my_local_flo_address !== primarySupernode) return;
getPrimarySuObj.map(nextSu=>{ const RM_RPC = new localbitcoinplusplus.rpc;
if (nextSu.data.id !== primarySupernode) {
let nextSuConn = localbitcoinplusplus.newBackupDatabase.db[nextSu.data.id];
if(typeof nextSuConn !== "object") {
let msg = `WARNING: Failed to open a backup DB with Supernode ${nextSu}.`;
showMessage(msg);
throw new Error(msg);
}
const RM_RPC = new localbitcoinplusplus.rpc;
const table_array = ["deposit", "withdraw_cash", "withdraw_btc", const table_array = ["deposit", "withdraw_cash", "withdraw_btc",
"crypto_balances", "cash_balances", "sellOrders", "buyOrders", "crypto_balances", "cash_balances", "sellOrders", "buyOrders",
]; ];
table_array.map(async tbl=>{ table_array.map(async tbl=>{
let record = await nextSuConn.backup_readDBbyIndex(tbl, 'trader_flo_address', params.requesting_user_id); let record = await readDBbyIndex(tbl, 'trader_flo_address', params.requesting_user_id);
record.map(rec=>{
getNextClosestSuObjOfPrimarySupernode.map(nextSu=>{
if (nextSu.data.id !== primarySupernode) {
let nextSuConn = localbitcoinplusplus.newBackupDatabase.db[nextSu.data.id];
if(typeof nextSuConn !== "object") {
let msg = `WARNING: Failed to open a backup DB with Supernode ${nextSu}.`;
showMessage(msg);
throw new Error(msg);
}
record.map(rec=>{
let server_response = RM_RPC let server_response = RM_RPC
.send_rpc .send_rpc
.call(this, "sync_data_by_vector_clock", { .call(this, "sync_data_by_vector_clock", {
@ -19864,11 +19890,11 @@
data: rec, data: rec,
dbTable: tbl dbTable: tbl
}); });
doSend(server_response, nextSu.data.id); doSend(server_response, nextSu.data.id);
}); }
}); });
}
});
}); });