Skip to content
This repository was archived by the owner on Jun 11, 2024. It is now read-only.

Commit 6554bb2

Browse files
committed
🐎 Improve indexing speed
- Replace token_getBalances invocation with token_getBalance
1 parent 0e21e4c commit 6554bb2

File tree

3 files changed

+35
-19
lines changed

3 files changed

+35
-19
lines changed

services/blockchain-indexer/shared/indexer/accountBalanceIndex.js

+31-17
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ const {
2121
Logger,
2222
} = require('lisk-service-framework');
2323

24+
const regex = require('../regex');
2425
const config = require('../../config');
26+
const accountBalancesTableSchema = require('../database/schema/accountBalances');
27+
2528
const { MODULE } = require('../constants');
2629
const { getTokenBalances } = require('../dataService');
27-
const accountBalancesTableSchema = require('../database/schema/accountBalances');
30+
const { getPosTokenID } = require('../dataService/business/pos/constants');
2831

2932
const logger = Logger();
3033

@@ -34,9 +37,10 @@ const MYSQL_ENDPOINT = config.endpoints.mysql;
3437

3538
const getAccountBalancesTable = () => getTableInstance(accountBalancesTableSchema, MYSQL_ENDPOINT);
3639

37-
const updateAccountBalances = async address => {
40+
const updateAccountBalances = async addressTokenID => {
3841
const accountBalancesTable = await getAccountBalancesTable();
39-
const { data: balanceInfos } = await getTokenBalances({ address });
42+
const [address, cTokenID] = addressTokenID.split('_');
43+
const { data: balanceInfos } = await getTokenBalances({ address, tokenID: cTokenID });
4044

4145
const updatedTokenBalances = balanceInfos.map(balanceInfo => {
4246
const { tokenID, availableBalance, lockedBalances } = balanceInfo;
@@ -56,14 +60,20 @@ const updateAccountBalances = async address => {
5660
await accountBalancesTable.upsert(updatedTokenBalances);
5761
};
5862

59-
const scheduleAddressesBalanceUpdate = async addresses => {
60-
if (addresses.length) {
61-
redis.sadd(config.set.accountBalanceUpdate.name, addresses);
63+
const scheduleAddressesBalanceUpdate = async addressTokens => {
64+
if (addressTokens.length) {
65+
addressTokens.forEach(addressToken => {
66+
if (!regex.ADDRESS_LISK32_TOKEN_ID.test(addressToken)) {
67+
throw new Error(`Invalid address tokenID format: ${addressToken}`);
68+
}
69+
});
70+
71+
redis.sadd(config.set.accountBalanceUpdate.name, addressTokens);
6272
}
6373
};
6474

65-
const getAddressesFromTokenEvents = events => {
66-
const addressesToUpdate = [];
75+
const getAddressesFromTokenEvents = async events => {
76+
const addressTokensToUpdate = [];
6777
const tokenModuleEvents = events.filter(event => event.module === MODULE.TOKEN);
6878

6979
// eslint-disable-next-line no-restricted-syntax
@@ -74,33 +84,37 @@ const getAddressesFromTokenEvents = events => {
7484
for (const key of eventDataKeys) {
7585
if (key.toLowerCase().includes('address')) {
7686
const address = eventData[key];
77-
addressesToUpdate.push(address);
87+
const tokenID = eventData.tokenID || eventData.messageFeeTokenID || (await getPosTokenID());
88+
addressTokensToUpdate.push(`${address}_${tokenID}`);
7889
}
7990
}
8091
}
8192

82-
return addressesToUpdate;
93+
return addressTokensToUpdate;
8394
};
8495

8596
const triggerAccountsBalanceUpdate = async () => {
86-
const addresses = await redis.spop(
97+
const addressTokenEntries = await redis.spop(
8798
config.set.accountBalanceUpdate.name,
8899
config.set.accountBalanceUpdate.batchSize,
89100
);
90101

91-
const numAddressesScheduled = addresses.length;
102+
const numAddressesScheduled = addressTokenEntries.length;
92103
try {
93104
// eslint-disable-next-line no-restricted-syntax
94-
while (addresses.length) {
95-
const address = addresses.shift();
96-
await updateAccountBalances(address);
105+
while (addressTokenEntries.length) {
106+
const addressToken = addressTokenEntries.shift();
107+
await updateAccountBalances(addressToken).catch(err => {
108+
addressTokenEntries.push(addressToken);
109+
throw err;
110+
});
97111
}
98112
logger.info(`Successfully updated account balances for ${numAddressesScheduled} account(s).`);
99113
} catch (err) {
100114
// Reschedule accounts balance update on error for remaining addresses
101-
await scheduleAddressesBalanceUpdate(addresses);
115+
await scheduleAddressesBalanceUpdate(addressTokenEntries);
102116

103-
const numPending = addresses.length;
117+
const numPending = addressTokenEntries.length;
104118
const numSuccess = numAddressesScheduled - numPending;
105119
logger.info(
106120
`Successfully updated account balances for ${numSuccess} account(s). Rescheduling updates for ${numPending} account(s).`,

services/blockchain-indexer/shared/indexer/blockchainIndex.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ const indexBlock = async job => {
354354
await updateTotalLockedAmounts(tokenIDLockedAmountChangeMap, dbTrx);
355355

356356
// Get addresses to schedule account balance updates from token module events
357-
addressesToUpdateBalance = getAddressesFromTokenEvents(events);
357+
addressesToUpdateBalance = await getAddressesFromTokenEvents(events);
358358
}
359359

360360
const blockToIndex = {
@@ -624,7 +624,7 @@ const deleteIndexedBlocks = async job => {
624624
await updateTotalLockedAmounts(tokenIDLockedAmountChangeMap, dbTrx);
625625

626626
// Get addresses to schedule account balance updates from token module events
627-
addressesToUpdateBalance = getAddressesFromTokenEvents(events);
627+
addressesToUpdateBalance = await getAddressesFromTokenEvents(events);
628628
}
629629

630630
// Invalidate cached events for this block. Must be done after processing all event related calculations

services/blockchain-indexer/shared/regex.js

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const NAME = /^[a-z0-9!@$&_.]{1,20}$/;
2222
const TOKEN_ID = /^\b[a-fA-F0-9]{16}\b$/;
2323
const MAINCHAIN_ID = /^[a-fA-F0-9]{2}000000$/;
2424
const CHAIN_ID = /^\b[a-fA-F0-9]{8}\b$/;
25+
const ADDRESS_LISK32_TOKEN_ID = /^lsk[a-hjkm-z2-9]{38}_[a-fA-F0-9]{16}$/;
2526

2627
module.exports = {
2728
ADDRESS_LISK32,
@@ -32,4 +33,5 @@ module.exports = {
3233
TOKEN_ID,
3334
MAINCHAIN_ID,
3435
CHAIN_ID,
36+
ADDRESS_LISK32_TOKEN_ID,
3537
};

0 commit comments

Comments
 (0)