backup feature : indicate_sn_up, store_backup_data, request_data
Added following features: inidicate the next node when a sn is down inidicate the next node when a sn is up request backuped data when a sn comes back online
This commit is contained in:
parent
4f4dc0b431
commit
0e6c81e5ab
95
index.html
95
index.html
@ -5434,10 +5434,6 @@
|
|||||||
if (floGlobals.serveList.includes(result[0].floID)
|
if (floGlobals.serveList.includes(result[0].floID)
|
||||||
&& data.senderID == floCrypto.getFloIDfromPubkeyHex(data.pubKey)
|
&& data.senderID == floCrypto.getFloIDfromPubkeyHex(data.pubKey)
|
||||||
&& floCrypto.verifySign(JSON.stringify(data.message), data.sign, data.pubKey)){
|
&& floCrypto.verifySign(JSON.stringify(data.message), data.sign, data.pubKey)){
|
||||||
if (floGlobals.storageList.includes(data.application))
|
|
||||||
var table = data.application;
|
|
||||||
else
|
|
||||||
var table = floGlobals.defaultStorage;
|
|
||||||
var key = `${Date.now()}_${data.senderID}`
|
var key = `${Date.now()}_${data.senderID}`
|
||||||
var value = {
|
var value = {
|
||||||
senderID: data.senderID,
|
senderID: data.senderID,
|
||||||
@ -5449,7 +5445,7 @@
|
|||||||
type: data.type,
|
type: data.type,
|
||||||
comment: data.comment
|
comment: data.comment
|
||||||
}
|
}
|
||||||
compactIDB.addData(table, value ,key,`SN_${result[0].floID}`)
|
compactIDB.addData(floGlobals.storageList.includes(value.application) ? value.application:floGlobals.defaultStorage , value ,key,`SN_${result[0].floID}`)
|
||||||
reactor.dispatchEvent("send_backup",{ key:key, value:value, snfloID: result[0].floID})
|
reactor.dispatchEvent("send_backup",{ key:key, value:value, snfloID: result[0].floID})
|
||||||
}
|
}
|
||||||
}).catch(error => console.log(error))
|
}).catch(error => console.log(error))
|
||||||
@ -5594,7 +5590,7 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
searchData: function (obsName, options = {}, dbName = this.dbName) {
|
searchData: function (obsName, options = {}, dbName = this.dbName) {
|
||||||
options.lowerKey = options.atKey || options.lowerKey || 1
|
options.lowerKey = options.atKey || options.lowerKey || 0
|
||||||
options.upperKey = options.atKey || options.upperKey || false
|
options.upperKey = options.atKey || options.upperKey || false
|
||||||
options.patternEval = options.patternEval || ((k,v) => {return true})
|
options.patternEval = options.patternEval || ((k,v) => {return true})
|
||||||
options.lastOnly = options.lastOnly || false
|
options.lastOnly = options.lastOnly || false
|
||||||
@ -6045,8 +6041,16 @@
|
|||||||
console.log(result)
|
console.log(result)
|
||||||
serverPwd = prompt("Enter Server Pass!")
|
serverPwd = prompt("Enter Server Pass!")
|
||||||
setInterval(refreshBlockchainData, 3600000);
|
setInterval(refreshBlockchainData, 3600000);
|
||||||
floSupernode.initSupernode(serverPwd, myFloID)
|
floSupernode.initSupernode(serverPwd, myFloID).then(result => {
|
||||||
.then(result => console.log(result))
|
console.log(result)
|
||||||
|
floSupernode.kBucket.getNextSupernode(myFloID).then(result => {
|
||||||
|
connectToBackupSupernode(result[0].floID).then(result => {
|
||||||
|
console.log(result)
|
||||||
|
reactor.dispatchEvent("indicate_sn_up",myFloID)
|
||||||
|
reactor.dispatchEvent("request_data",{floid:myFloID, holder:floGlobals.backupNode.floID})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -6216,6 +6220,22 @@
|
|||||||
floGlobals.backupNode.wsConn.send(sendData)
|
floGlobals.backupNode.wsConn.send(sendData)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
reactor.registerEvent("indicate_sn_up");
|
||||||
|
reactor.addEventListener("indicate_sn_up", function (snfloID) {
|
||||||
|
console.log("indicate_sn_up");
|
||||||
|
//send message to backup's backup to server for backup node
|
||||||
|
var sendData = {
|
||||||
|
from: myFloID,
|
||||||
|
backupMsg: {
|
||||||
|
type: "supernodeUp",
|
||||||
|
snfloID: snfloID,
|
||||||
|
time: Date.now()
|
||||||
|
},
|
||||||
|
sign: floCrypto.signData(JSON.stringify(this.backupMsg), myPrivKey)
|
||||||
|
}
|
||||||
|
floGlobals.backupNode.wsConn.send(sendData)
|
||||||
|
})
|
||||||
|
|
||||||
reactor.registerEvent("send_backup");
|
reactor.registerEvent("send_backup");
|
||||||
reactor.addEventListener("send_backup", function (data) {
|
reactor.addEventListener("send_backup", function (data) {
|
||||||
console.log("send_backup");
|
console.log("send_backup");
|
||||||
@ -6232,11 +6252,11 @@
|
|||||||
floGlobals.backupNode.wsConn.send(sendData)
|
floGlobals.backupNode.wsConn.send(sendData)
|
||||||
})
|
})
|
||||||
|
|
||||||
reactor.registerEvent("send_all_stored_backup");
|
reactor.registerEvent("send_stored_backup");
|
||||||
reactor.addEventListener("send_all_stored_backup", function (data) {
|
reactor.addEventListener("send_stored_backup", function (data) {
|
||||||
console.log("send_all_stored_backup");
|
console.log("send_stored_backup");
|
||||||
try{
|
try{
|
||||||
var requestorWS = new WebSocket("wss://" + floGlobals.supernodes[backupNodeID].uri + "/ws")
|
var requestorWS = new WebSocket("wss://" + floGlobals.supernodes[data.from].uri + "/ws")
|
||||||
requestorWS.onopen = (evt) => {
|
requestorWS.onopen = (evt) => {
|
||||||
floGlobals.storageList.forEach(obs => {
|
floGlobals.storageList.forEach(obs => {
|
||||||
compactIDB.searchData(obs, {lowerKey: data.backupMsg.lowerKey[obs]}, `SN_${data.backupMsg.snfloID}`).then(result => {
|
compactIDB.searchData(obs, {lowerKey: data.backupMsg.lowerKey[obs]}, `SN_${data.backupMsg.snfloID}`).then(result => {
|
||||||
@ -6257,7 +6277,7 @@
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
requestorWS.onmessage = (evt) => console.log(evt.data);
|
requestorWS.onmessage = (evt) => console.log(evt.data);
|
||||||
requestorWS.onclose = (ev) => console.log("Disconnected from "+data.from);
|
requestorWS.onclose = (evt) => console.log("Disconnected from "+data.from);
|
||||||
requestorWS.onerror = (evt) => console.log("Error connecting to "+data.from);
|
requestorWS.onerror = (evt) => console.log("Error connecting to "+data.from);
|
||||||
}catch(error){
|
}catch(error){
|
||||||
console.log(error.message)
|
console.log(error.message)
|
||||||
@ -6269,11 +6289,54 @@
|
|||||||
console.log("backup_message_event");
|
console.log("backup_message_event");
|
||||||
if(floCrypto.verifySign(JSON.stringify(data.backupMsg), data.sign, floGlobals.supernodes[data.from].pubKey)){
|
if(floCrypto.verifySign(JSON.stringify(data.backupMsg), data.sign, floGlobals.supernodes[data.from].pubKey)){
|
||||||
//Backup event messages
|
//Backup event messages
|
||||||
//1. sn offline => a.(nearest backup node) start_backup_serve; b.(new farest backup node) create new backup
|
if(data.backupMsg.type === "backupData" && floGlobals.backupStoredList.includes(data.backupMsg.snfloID))
|
||||||
//2. sn back online => a.(nearest backup node) stop_backup_serve, send backup data to supernode b.(farest backup node) delete backup
|
reactor.dispatchEvent("store_backup_data", data.backupMsg)
|
||||||
//3. backup data => send_all_backup
|
else if(data.backupMsg.type === "supernodeDown")
|
||||||
|
reactor.dispatchEvent("start_backup_serve", data.backupMsg.snfloID)
|
||||||
|
else if(data.backupMsg.type === "supernodeUp")
|
||||||
|
reactor.dispatchEvent("stop_backup_serve", data.backupMsg.snfloID)
|
||||||
|
else if(data.backupMsg.type === "dataRequest" && floGlobals.backupStoredList.includes(data.backupMsg.snfloID))
|
||||||
|
reactor.dispatchEvent("send_stored_backup", data)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
reactor.registerEvent("request_data");
|
||||||
|
reactor.addEventListener("request_data", function (event) {
|
||||||
|
console.log("request_data");
|
||||||
|
try{
|
||||||
|
var holderWS = new WebSocket("wss://" + floGlobals.supernodes[event.holder].uri + "/ws")
|
||||||
|
holderWS.onopen = (evt) => {
|
||||||
|
var promises = []
|
||||||
|
for(var i=0; i < floGlobals.storageList.length; i++)
|
||||||
|
promises[i] = compactIDB.searchData(floGlobals.storageList[i],{lastOnly: true},`SN_${event.floID}`)
|
||||||
|
Promise.all(promises).then(results => {
|
||||||
|
var lowerKey = {}
|
||||||
|
for(var i=0; i < results.length; i++)
|
||||||
|
for(key in results[i])
|
||||||
|
lowerKey[floGlobals.storageList[i]] = key
|
||||||
|
var sendData = {
|
||||||
|
from: myFloID,
|
||||||
|
backupMsg = {
|
||||||
|
snfloID: event.floID,
|
||||||
|
lowerKey: lowerKey
|
||||||
|
},
|
||||||
|
sign: floCrypto.signData(JSON.stringify(this.backupMsg), myPrivKey)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
holderWS.onmessage = (evt) => console.log(evt.data);
|
||||||
|
holderWS.onclose = (evt) => console.log("Disconnected from " + event.holder);
|
||||||
|
holderWS.onerror = (evt) => console.log("Error connecting to " + event.holder);
|
||||||
|
}catch(error){
|
||||||
|
console.log(error.message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
reactor.registerEvent("store_backup_data");
|
||||||
|
reactor.addEventListener("store_backup_data", function (data) {
|
||||||
|
console.log("store_backup_data");
|
||||||
|
compactIDB.addData(floGlobals.storageList.includes(data.value.application) ? data.value.application:floGlobals.defaultStorage , data.value ,data.key,`SN_${data.snfloID}`)
|
||||||
|
})
|
||||||
|
|
||||||
reactor.registerEvent("start_backup_serve");
|
reactor.registerEvent("start_backup_serve");
|
||||||
reactor.addEventListener("start_backup_serve", function (floID) {
|
reactor.addEventListener("start_backup_serve", function (floID) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user