From 2f38275d88227fe288a1109f8db3e3a5d1443908 Mon Sep 17 00:00:00 2001 From: Abhishek Sinha Date: Sat, 27 Apr 2019 14:09:44 +0530 Subject: [PATCH] working on db restoring of primary supernode from rest supernodes --- supernode/index.html | 164 +++++++++++++++++++++++++------------------ 1 file changed, 95 insertions(+), 69 deletions(-) diff --git a/supernode/index.html b/supernode/index.html index d432ba7..8f532c7 100644 --- a/supernode/index.html +++ b/supernode/index.html @@ -14871,7 +14871,8 @@ newKeys.address.length > 0) { localbitcoinplusplusObj.myLocalFLOAddress = newKeys.address; localbitcoinplusplusObj.myLocalFLOPublicKey = newKeys.pubKeyHex; - + localbitcoinplusplusObj.lastConnectedTime = + new Date(); + // launch KBuckets launchKBuckects = await localbitcoinplusplus.kademlia.launchKBucket(newKeys.address); @@ -14881,8 +14882,6 @@ throw new Error(kmsg); } - updateinDB("localbitcoinUser", localbitcoinplusplusObj, "00-01"); - wsUri = await localbitcoinplusplus.kademlia.getSupernodeSeed( localbitcoinplusplusObj.myLocalFLOAddress); @@ -14927,6 +14926,10 @@ BACKUP_DB[uri.trader_flo_address].createNewDB(); }); + localbitcoinplusplus.MY_SUPERNODE_FLO_ADDRESS = wsUri[0].trader_flo_address; + + updateinDB("localbitcoinUser", localbitcoinplusplusObj, "00-01"); + resolve(true); return; @@ -14965,12 +14968,21 @@ localbitcoinplusplus.kademlia.restoreSupernodeKBucket(); - // Get the most ideal supernode to connect - - // 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 (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 await privateKeyBuilder(); @@ -15501,9 +15513,24 @@ this.ws_connection = new WebSocket(this.ws_url); const switchMyWS = new backupSupernodesWebSocketObject(); 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}.`); 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'); }.bind(this); @@ -15647,13 +15674,7 @@ } function onOpen(evt) { - reactor.addEventListener('primary_supernode_up', function() { - 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'); + reactor.dispatchEvent('new_supernode_connected', evt); } function onClose(evt) { @@ -16661,7 +16682,7 @@ (async function() { let getPrimarySuObj = await localbitcoinplusplus.kademlia - .determineClosestSupernode(subjectUser); + .determineClosestSupernode(res_obj.params[0].trader_flo_address); let primarySupernode = getPrimarySuObj[0].data.id; @@ -16684,36 +16705,9 @@ showMessage(mss); throw new Error(mss); } - 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) { + if(data.vectorClock > myOwnDBData.vectorClock) { // You have old data, update respective DB. + data.increaseVectorClock = false; updateinDB(dbTable, data).then(()=>{ showMessage(`INFO: Data updated in ${dbTable} for id ${data.id}.`); }); @@ -18111,6 +18105,8 @@ myLocalFLOAddress: "", myLocalFLOPublicKey: "", myAddressTrustLevel: 1, + lastConnectedSupernode: "", + lastConnectedTime: "", }; const userPublicData = { @@ -18498,6 +18494,9 @@ try { if(typeof Obj.vectorClock == "undefined") { Obj.vectorClock = 0; + } else if(typeof Obj.increaseVectorClock == "boolean" + && Obj.increaseVectorClock === false) { + // leave the vector clock field unchanged } else { Obj.vectorClock += 1; } @@ -19729,12 +19728,17 @@ +