From a0f8cd1dd6ab9afa925ab8ea9ef3027334cf5bc4 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 24 Nov 2019 10:06:42 +0100 Subject: [PATCH 1/3] Remove empty rewards from cache --- .../app-staking/src/useSessionRewards.tsx | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/packages/app-staking/src/useSessionRewards.tsx b/packages/app-staking/src/useSessionRewards.tsx index 3cc928fea602..9f715871307d 100644 --- a/packages/app-staking/src/useSessionRewards.tsx +++ b/packages/app-staking/src/useSessionRewards.tsx @@ -27,18 +27,35 @@ interface Serialized { slashes: SerializedSlash[]; } +const MAX_BLOCKS = 2500; + function fromJSON (sessions: Serialized[]): SessionRewards[] { - return sessions.map(({ blockHash, blockNumber, isEventsEmpty, reward, sessionIndex, slashes }): SessionRewards => ({ - blockHash: createType(registry, 'Hash', blockHash), - blockNumber: createType(registry, 'BlockNumber', blockNumber), - isEventsEmpty, - reward: createType(registry, 'Balance', reward), - sessionIndex: createType(registry, 'SessionIndex', sessionIndex), - slashes: slashes.map(({ accountId, amount }): Slash => ({ - accountId: createType(registry, 'AccountId', accountId), - amount: createType(registry, 'Balance', amount) + let hasSome = false; + let keepAll = true; + + return sessions + .map(({ blockHash, blockNumber, isEventsEmpty, reward, sessionIndex, slashes }): SessionRewards => ({ + blockHash: createType(registry, 'Hash', blockHash), + blockNumber: createType(registry, 'BlockNumber', blockNumber), + isEventsEmpty, + reward: createType(registry, 'Balance', reward), + sessionIndex: createType(registry, 'SessionIndex', sessionIndex), + slashes: slashes.map(({ accountId, amount }): Slash => ({ + accountId: createType(registry, 'AccountId', accountId), + amount: createType(registry, 'Balance', amount) + })) })) - })); + .filter(({ isEventsEmpty }): boolean => { + if (!isEventsEmpty) { + // we first see if we have some data up to this point (we may not, i.e. non-archive) + hasSome = true; + } else if (hasSome) { + // if data is followed by empty, drop everything from here on + keepAll = false; + } + + return keepAll; + }); } function toJSON (sessions: SessionRewards[], maxSessions: number): Serialized[] { @@ -120,38 +137,35 @@ export default function useSessionRewards (maxSessions: number): SessionRewards[ useEffect((): void => { let workQueue = fromJSON(getCache() || []); + const savedNumber = workQueue[workQueue.length - 1] + ? workQueue[workQueue.length - 1].blockNumber + : undefined; setImmediate((): void => { api.isReady.then(async (): Promise => { const maxSessionsStore = maxSessions + 1; // assuming first is a bust - const sessionLength = api.consts.babe?.epochDuration || new BN(500); - const eraLength = api.consts.staking.sessionsPerEra.toNumber(); - const count = Math.min(sessionLength.muln(maxSessionsStore).divn(10).toNumber(), 7500); const bestHeader = await api.rpc.chain.getHeader(); - let retrieved = 0; let toHash = bestHeader.hash; let toNumber = bestHeader.number.unwrap().toBn(); - let fromHash = api.genesisHash; - let fromNumber = bnMax(toNumber.subn(count), new BN(1)); + let fromNumber = bnMax(toNumber.subn(MAX_BLOCKS), new BN(1)); while (true) { - fromHash = await api.rpc.chain.getBlockHash(fromNumber as any); + // console.log(`Updating rewards cache, #${fromNumber} -> #${toNumber}`); + const fromHash = await api.rpc.chain.getBlockHash(fromNumber as any); const newQueue = await loadSome(api, fromHash, toHash); - retrieved += newQueue.length; workQueue = mergeResults(workQueue, newQueue); toHash = fromHash; toNumber = fromNumber; - fromNumber = bnMax(toNumber.subn(count), new BN(1)); + fromNumber = bnMax(toNumber.subn(MAX_BLOCKS), new BN(1)); setCache(toJSON(workQueue, maxSessionsStore)); setFiltered(workQueue.slice(-maxSessions)); const lastNumber = workQueue[workQueue.length - 1]?.blockNumber; - // we always want to retrieve at least 1 era worth of information, or we are at the start - if (!lastNumber || fromNumber.eqn(1) || (retrieved > eraLength && (workQueue.length >= maxSessionsStore) && fromNumber.lt(lastNumber))) { + if (!lastNumber || fromNumber.eqn(1) || ((workQueue.length >= maxSessionsStore) && fromNumber.lt(savedNumber || lastNumber))) { break; } } From 943abae673083ac6ad2b8e44718a3dbc598e5a05 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 24 Nov 2019 10:07:37 +0100 Subject: [PATCH 2/3] Update MAX_BLOCKS --- packages/app-staking/src/useSessionRewards.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-staking/src/useSessionRewards.tsx b/packages/app-staking/src/useSessionRewards.tsx index 9f715871307d..696fdab98de8 100644 --- a/packages/app-staking/src/useSessionRewards.tsx +++ b/packages/app-staking/src/useSessionRewards.tsx @@ -27,7 +27,7 @@ interface Serialized { slashes: SerializedSlash[]; } -const MAX_BLOCKS = 2500; +const MAX_BLOCKS = 5000; function fromJSON (sessions: Serialized[]): SessionRewards[] { let hasSome = false; From 54272be1e6750d75d2fd6539b5ce3aaaedfcf0e3 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 24 Nov 2019 10:08:23 +0100 Subject: [PATCH 3/3] Revert count change --- packages/app-staking/src/useSessionRewards.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/app-staking/src/useSessionRewards.tsx b/packages/app-staking/src/useSessionRewards.tsx index 696fdab98de8..9f715871307d 100644 --- a/packages/app-staking/src/useSessionRewards.tsx +++ b/packages/app-staking/src/useSessionRewards.tsx @@ -27,7 +27,7 @@ interface Serialized { slashes: SerializedSlash[]; } -const MAX_BLOCKS = 5000; +const MAX_BLOCKS = 2500; function fromJSON (sessions: Serialized[]): SessionRewards[] { let hasSome = false;