Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/api/atoms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import type {
GossipPeersSize,
GossipPeersRowsUpdate,
GossipPeersCellUpdate,
ServerTimeNanos,
} from "./types";
import { rafAtom } from "../atomUtils";

Expand Down Expand Up @@ -61,6 +62,7 @@ export const optimisticallyConfirmedSlotAtom = atom<
>(undefined);

export const completedSlotAtom = atom<CompletedSlot | undefined>(undefined);
export const serverTimeNanosAtom = atom<ServerTimeNanos | undefined>(undefined);

export const estimatedSlotAtom = atom<EstimatedSlot | undefined>(undefined);

Expand Down
6 changes: 6 additions & 0 deletions src/api/entities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ export const catchUpHistorySchema = z.object({
turbine: z.number().array(),
});

export const serverTimeNanosSchema = z.coerce.number();

export const estimatedSlotSchema = z.number();
export const resetSlotSchema = z.number().nullable();
export const storageSlotSchema = z.number().nullable();
Expand Down Expand Up @@ -565,6 +567,10 @@ export const summarySchema = z.discriminatedUnion("key", [
key: z.literal("catch_up_history"),
value: catchUpHistorySchema,
}),
summaryTopicSchema.extend({
key: z.literal("server_time_nanos"),
value: serverTimeNanosSchema,
}),
]);

export const epochNewSchema = z.object({
Expand Down
3 changes: 3 additions & 0 deletions src/api/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import type {
gossipStorageStatsSchema,
gossipMessageStatsSchema,
schedulerCountsSchema,
serverTimeNanosSchema,
} from "./entities";

export type Client = z.infer<typeof clientSchema>;
Expand Down Expand Up @@ -94,6 +95,8 @@ export type OptimisticallyConfirmedSlot = z.infer<
export type CompletedSlot = z.infer<typeof completedSlotSchema>;
export type CatchUpHistory = z.infer<typeof catchUpHistorySchema>;

export type ServerTimeNanos = z.infer<typeof serverTimeNanosSchema>;

// export type SlotCompleted = z.infer<typeof slotCompletedSchema>;

export type EstimatedSlot = z.infer<typeof estimatedSlotSchema>;
Expand Down
6 changes: 6 additions & 0 deletions src/api/useSetAtomWsData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
gossipPeersSizeAtom,
gossipPeersRowsUpdateAtom,
gossipPeersCellUpdateAtom,
serverTimeNanosAtom,
} from "./atoms";
import {
blockEngineSchema,
Expand Down Expand Up @@ -196,6 +197,7 @@ export function useSetAtomWsData() {
const setBlockEngine = useSetAtom(blockEngineAtom);

const setCompletedSlot = useSetAtom(completedSlotAtom);
const setServerTimeNanos = useSetAtom(serverTimeNanosAtom);

const addSkippedClusterSlots = useSetAtom(addSkippedClusterSlotsAtom);
const deleteSkippedClusterSlot = useSetAtom(deleteSkippedClusterSlotAtom);
Expand Down Expand Up @@ -383,6 +385,10 @@ export function useSetAtomWsData() {
addRepairSlots(value.repair);
break;
}
case "server_time_nanos": {
setServerTimeNanos(value);
break;
}
case "root_slot":
case "optimistically_confirmed_slot":
case "estimated_slot":
Expand Down
9 changes: 8 additions & 1 deletion src/atoms.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { atom } from "jotai";
import { slotsPerLeader } from "./consts";
import { nsPerMs, slotsPerLeader } from "./consts";
import { atomWithImmer } from "jotai-immer";
import {
bootProgressAtom,
estimatedSlotDurationAtom,
identityKeyAtom,
serverTimeNanosAtom,
skippedSlotsAtom,
startupProgressAtom,
} from "./api/atoms";
Expand Down Expand Up @@ -695,3 +696,9 @@ export const [
}),
];
})();

export const serverTimeMsAtom = atom((get) => {
const serverTimeNanos = get(serverTimeNanosAtom);
if (serverTimeNanos == null) return undefined;
return Math.round(serverTimeNanos / nsPerMs);
});
4 changes: 2 additions & 2 deletions src/features/Overview/ShredsProgression/atoms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { delayMs, xRangeMs } from "./const";
import { nsPerMs, slotsPerLeader } from "../../../consts";
import { getSlotGroupLeader } from "../../../utils";
import { startupFinalTurbineHeadAtom } from "../../StartupProgress/atoms";
import { serverTimeMsAtom } from "../../../atoms";

type ShredEventTsDeltaMs = number | undefined;
/**
Expand Down Expand Up @@ -169,11 +170,10 @@ export function createLiveShredsAtoms() {

set(_liveShredsAtom, (prev) => {
const slotRange = get(_slotRangeAtom);
const now = get(serverTimeMsAtom) ?? Date.now();

if (!prev || !slotRange) return prev;

const now = Date.now();

if (isStartup) {
// During startup, we only show event dots, not spans. Delete slots without events in chart view
for (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import {
shredReplayStartedColor,
shredSkippedColor,
} from "../../../colors";
import { skippedClusterSlotsAtom } from "../../../atoms";
import { serverTimeMsAtom, skippedClusterSlotsAtom } from "../../../atoms";
import { clamp } from "lodash";
import { ShredEvent } from "../../../api/entities";
import { getSlotGroupLabelId, getSlotLabelId } from "./utils";
Expand Down Expand Up @@ -55,10 +55,16 @@ export function shredsProgressionPlugin(
const minCompletedSlot = store.get(atoms.minCompletedSlot);
const skippedSlotsCluster = store.get(skippedClusterSlotsAtom);
const rangeAfterStartup = store.get(atoms.rangeAfterStartup);
const serverTimeMs = store.get(serverTimeMsAtom);

const maxX = u.scales[shredsXScaleKey].max;

if (!liveShreds || !slotRange || maxX == null) {
if (
!liveShreds ||
!slotRange ||
maxX == null ||
serverTimeMs == null
) {
return;
}

Expand All @@ -74,7 +80,7 @@ export function shredsProgressionPlugin(
}

// Offset to convert shred event delta to chart x value
const delayedNow = Date.now() - delayMs;
const delayedNow = serverTimeMs - delayMs;

const tsXValueOffset = delayedNow - liveShreds.referenceTs;

Expand Down