Files
Igor Lins e Silva a5558cbe0e merge update
2020-01-24 15:55:45 -03:00

104 lines
3.2 KiB
JavaScript

const {ConnectionManager} = require('../connections/manager');
const manager = new ConnectionManager();
let client;
let total_missing = 0;
let last_block = 0;
let activeScrollID;
const starting_block = 1;
const stop_on_block = 0;
let monitoringLoop;
async function countMissingBlocks() {
const results = await client.search({
index: process.env.CHAIN + "-block*",
size: 1,
track_total_hits: true,
body: {
query: {match_all: {}},
sort: [{block_num: {order: "desc"}}]
}
});
const block_count = results['body']['hits'].total.value;
const latest_block = results['body']['hits']['hits'][0]['_source']['block_num'];
console.log('Indexed block count = ' + block_count);
console.log('Last Indexed block = ' + latest_block);
console.log('Missing blocks = ' + (latest_block - block_count));
return latest_block - block_count;
}
async function createScroller(missingArray) {
const range_filter = {
"block_num": {
"gte": starting_block
}
};
if (stop_on_block !== 0) {
range_filter.block_num['lte'] = stop_on_block;
}
const response = await client.search({
index: process.env.CHAIN + "-block*",
scroll: '30s',
_source: ['block_num'],
size: 1000,
body: {
query: {bool: {must: [{range: range_filter}]}},
sort: [{block_num: {order: "asc"}}]
}
});
const scrollId = response['body']['_scroll_id'];
await checkBlocks(response, missingArray);
return scrollId;
}
async function checkBlocks(response, missingArray) {
for (const block of response['body'].hits.hits) {
if (block._source.block_num !== last_block + 1) {
const range_start = last_block + 1;
const range_end = block._source.block_num - 1;
const range_count = range_end - range_start + 1;
console.log(`Missing ${range_count} blocks on range [${last_block + 1},${block._source.block_num - 1}]`);
missingArray.push({
start: range_start,
end: range_end + 1
});
}
last_block = block._source.block_num;
}
}
async function runScroller(scroll_id, missingArray) {
const next_resp = await client.scroll({
scrollId: scroll_id,
scroll: '30s'
});
if (next_resp['body']['hits']['hits'].length > 0) {
await checkBlocks(next_resp, missingArray);
await runScroller(scroll_id, missingArray);
}
}
function startMonitoringLoop() {
monitoringLoop = setInterval(() => {
console.log('Repair scanner at block: ' + last_block);
}, 10000);
}
const main = async (missingArray) => {
const start_time = Date.now();
last_block = starting_block - 1;
client = manager.elasticsearchClient;
console.log('Hyperion Doctor initialized.');
total_missing = await countMissingBlocks();
activeScrollID = await createScroller(missingArray);
startMonitoringLoop();
await runScroller(activeScrollID, missingArray);
console.log(`${stop_on_block - starting_block} blocks scanned in ${(Date.now() - start_time) / 1000} seconds!`);
clearInterval(monitoringLoop);
return true;
};
module.exports = {
run: main
};