Skip to content

Commit 2451a9e

Browse files
fix: handle early missing shred completion
1 parent bdff544 commit 2451a9e

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/features/Overview/ShredsProgression/atoms.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,17 @@ export type SlotsShreds = {
3030
* Use reference / delta slot number and timestamp to minimize memory usage
3131
*/
3232
export function createLiveShredsAtoms() {
33+
const _minCompletedSlotAtom = atom<number>();
3334
const _liveShredsAtom = atom<SlotsShreds>();
3435
const _slotRangeAtom = atom<{
3536
min: number;
3637
max: number;
3738
}>();
3839
return {
40+
/**
41+
* min completed slot we've seen since we started collecting data
42+
*/
43+
minCompletedSlot: atom((get) => get(_minCompletedSlotAtom)),
3944
range: atom((get) => get(_slotRangeAtom)),
4045
slotsShreds: atom((get) => get(_liveShredsAtom)),
4146
addShredEvents: atom(
@@ -53,6 +58,8 @@ export function createLiveShredsAtoms() {
5358
}: LiveShreds,
5459
) => {
5560
let slotRange = get(_slotRangeAtom);
61+
const minCompletedSlot = get(_minCompletedSlotAtom);
62+
let newMinCompletedSlot = minCompletedSlot;
5663

5764
set(_liveShredsAtom, (prev) => {
5865
const updated: SlotsShreds = prev ?? {
@@ -90,6 +97,13 @@ export function createLiveShredsAtoms() {
9097
),
9198
);
9299

100+
if (ev === ShredEvent.slot_complete) {
101+
newMinCompletedSlot = Math.min(
102+
slotNumber,
103+
minCompletedSlot ?? slotNumber,
104+
);
105+
}
106+
93107
// update range
94108
slotRange = {
95109
min: Math.min(slotNumber, slotRange?.min ?? slotNumber),
@@ -101,6 +115,7 @@ export function createLiveShredsAtoms() {
101115
});
102116

103117
set(_slotRangeAtom, slotRange);
118+
set(_minCompletedSlotAtom, newMinCompletedSlot);
104119
},
105120
),
106121

@@ -112,6 +127,7 @@ export function createLiveShredsAtoms() {
112127
atom(null, (get, set, deleteAll: boolean, isStartup: boolean) => {
113128
if (deleteAll) {
114129
set(_slotRangeAtom, undefined);
130+
set(_minCompletedSlotAtom, undefined);
115131
set(_liveShredsAtom, undefined);
116132
return;
117133
}

src/features/Overview/ShredsProgression/shredsProgressionPlugin.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,21 +39,31 @@ export function shredsProgressionPlugin(
3939

4040
const liveShreds = store.get(atoms.slotsShreds);
4141
const slotRange = store.get(atoms.range);
42+
const minCompletedSlot = store.get(atoms.minCompletedSlot);
4243
const skippedSlotsCluster = store.get(skippedClusterSlotsAtom);
4344

4445
if (!liveShreds || !slotRange) {
4546
return;
4647
}
4748

48-
if (!isOnStartupScreen && store.get(showStartupProgressAtom)) {
49+
if (!isOnStartupScreen) {
4950
// if startup is running, prevent drawing non-startup screen chart
50-
return;
51+
if (store.get(showStartupProgressAtom)) return;
52+
// Sometimes we've missed the completion event for the first slots
53+
// depending on connection time. Ignore those slots, and only draw slots
54+
// from min completed.
55+
if (minCompletedSlot == null) return;
5156
}
5257

5358
// Offset to convert shred event delta to chart x value
5459
const delayedNow = new Date().getTime() - delayMs;
5560
const tsXValueOffset = delayedNow - liveShreds.referenceTs;
5661

62+
const minSlot = isOnStartupScreen
63+
? slotRange.min
64+
: Math.max(slotRange.min, minCompletedSlot ?? slotRange.min);
65+
const maxSlot = slotRange.max;
66+
5767
u.ctx.save();
5868
u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);
5969
u.ctx.clip();
@@ -62,8 +72,8 @@ export function shredsProgressionPlugin(
6272
const getXPos = (xVal: number) => u.valToPos(xVal, xScaleKey, true);
6373

6474
const { maxShreds, orderedSlotNumbers } = getDrawInfo(
65-
slotRange.min,
66-
slotRange.max,
75+
minSlot,
76+
maxSlot,
6777
liveShreds,
6878
u.scales[xScaleKey],
6979
tsXValueOffset,

0 commit comments

Comments
 (0)