Update to how we store share data to avoid transactional locks.

master
Alexander Blair 7 years ago
parent 5d1af0506a
commit a5d99f3401

@ -181,10 +181,10 @@ function Database(){
this.storeBulkShares = function(shareObject) {
let cachedData = {
global_stats: global.database.getCache('global_stats'),
pplns_stats: global.database.getCache('pplns_stats'),
pps_stats: global.database.getCache('pps_stats'),
solo_stats: global.database.getCache('solo_stats')
global_stats: {totalHashes: 0, roundHashes: 0},
pplns_stats: {totalHashes: 0, roundHashes: 0},
pps_stats: {totalHashes: 0, roundHashes: 0},
solo_stats: {totalHashes: 0, roundHashes: 0}
};
let shares = {}; // Shares keyed by blockID
let shareCount = 0;
@ -202,13 +202,6 @@ function Database(){
minerID = minerID + '.' + share.paymentID;
}
let minerIDWithIdentifier = minerID + "_" + share.identifier;
// this.incrementCacheData('global_stats', [{location: 'totalHashes', value: share.shares}, {location: 'roundHashes', value: share.shares}]);
if (!cachedData.global_stats.hasOwnProperty('totalHashes') || cachedData.global_stats.totalHashes === null) {
cachedData.global_stats.totalHashes = 0;
}
if (!cachedData.global_stats.hasOwnProperty('roundHashes') || cachedData.global_stats.roundHashes === null || share.foundBlock) {
cachedData.global_stats.roundHashes = 0;
}
cachedData.global_stats.totalHashes += share.shares;
cachedData.global_stats.roundHashes += share.shares;
let stats_type = 'pplns_stats';
@ -223,39 +216,13 @@ function Database(){
stats_type = 'solo_stats';
break;
}
if (!cachedData[stats_type].hasOwnProperty('totalHashes') || cachedData[stats_type].totalHashes === null) {
cachedData[stats_type].totalHashes = 0;
}
if (!cachedData[stats_type].hasOwnProperty('roundHashes') || cachedData[stats_type].roundHashes === null || share.foundBlock) {
cachedData[stats_type].roundHashes = 0;
}
cachedData[stats_type].totalHashes += share.shares;
cachedData[stats_type].roundHashes += share.shares;
if (!cachedData.hasOwnProperty(minerID)) {
let minerCache = global.database.getCache(minerID);
if (minerCache === false) {
minerCache = {totalHashes: 0, goodShares: 0};
}
cachedData[minerID] = minerCache;
cachedData[minerID] = {totalHashes: 0, goodShares: 0};
}
if (!cachedData.hasOwnProperty(minerIDWithIdentifier)) {
let minerCache = global.database.getCache(minerIDWithIdentifier);
if (minerCache === false) {
minerCache = {totalHashes: 0, goodShares: 0};
}
cachedData[minerIDWithIdentifier] = minerCache;
}
if (!cachedData[minerIDWithIdentifier].hasOwnProperty('totalHashes') || cachedData[minerIDWithIdentifier].totalHashes === null) {
cachedData[minerIDWithIdentifier].totalHashes = 0;
}
if (!cachedData[minerIDWithIdentifier].hasOwnProperty('goodShares') || cachedData[minerIDWithIdentifier].goodShares === null) {
cachedData[minerIDWithIdentifier].goodShares = 0;
}
if (!cachedData[minerID].hasOwnProperty('totalHashes') || cachedData[minerID].totalHashes === null) {
cachedData[minerID].totalHashes = 0;
}
if (!cachedData[minerID].hasOwnProperty('goodShares') || cachedData[minerID].goodShares === null) {
cachedData[minerID].goodShares = 0;
cachedData[minerIDWithIdentifier] = {totalHashes: 0, goodShares: 0};
}
cachedData[minerIDWithIdentifier].totalHashes += share.shares;
cachedData[minerID].totalHashes += share.shares;
@ -266,10 +233,30 @@ function Database(){
}
if(shareObject.length === shareCount){
// Perform insert and return
let inCache = 'notNull';
while (inCache !== null){
let txn_ro = global.database.env.beginTxn({readOnly: true});
inCache = txn_ro.getString(global.database.cacheDB, 'cacheUpdate');
txn_ro.abort();
}
let txn = global.database.env.beginTxn();
for (let key in cachedData){
if (cachedData.hasOwnProperty(key)){
txn.putString(global.database.cacheDB, key, JSON.stringify(cachedData[key]));
let cacheStore = txn.getString(global.database.cacheDB, key);
if (cacheStore === null){
txn.putString(global.database.cacheDB, key, JSON.stringify(cachedData[key]));
} else {
let json_cache = JSON.parse(cacheStore);
if (json_cache.hasOwnProperty('totalHashes')){
json_cache.totalHashes += cachedData[key].totalHashes;
json_cache.goodShares += cachedData[key].goodShares;
} else {
json_cache.totalHashes = cachedData[key].totalHashes;
json_cache.goodShares = cachedData[key].goodShares;
}
txn.putString(global.database.cacheDB, key, JSON.stringify(json_cache));
}
}
}
let blocksSeen = 0;
@ -511,11 +498,15 @@ function Database(){
this.bulkSetCache = function(cacheUpdates){
let txn = this.env.beginTxn();
txn.putString(this.cacheDB, 'cacheUpdate', 'cacheUpdate');
txn.commit();
txn = this.env.beginTxn();
for (let key in cacheUpdates){
if (cacheUpdates.hasOwnProperty(key)){
txn.putString(this.cacheDB, key, JSON.stringify(cacheUpdates[key]));
}
}
txn.del(this.cacheDB, 'cacheUpdate');
txn.commit();
};

Loading…
Cancel
Save