Skip to content

Commit 2059b53

Browse files
authored
Update cardToPinnedCopyCache when resolving unresolved pins. (#5837)
Googlers, see b/240338417 "Clicking the refresh UI button unpins pinned graphs". When a user loads a TensorBoard with pinned cards in the URL then clicks on the TensorBoard reload button, the pinned cards disappear! Explanation: * Soon after page load, when handing tag metadata, unresolved pins are resolved into actual pinned cards. Unfortunately, the cardToPinnedCopyCache property is not provided with the information: * https://cs.opensource.google/tensorflow/tensorboard/+/master:tensorboard/webapp/metrics/store/metrics_reducers.ts;l=565;drc=2f5661647c264a3cd5758a04a7de0beb0c604747 * When user then presses the TensorBoard reload button and then tag metadata is reloaded, the cache is considered empty and the actual set of pinned cards is also cleared: * https://cs.opensource.google/tensorflow/tensorboard/+/master:tensorboard/webapp/metrics/store/metrics_reducers.ts;l=550;drc=2f5661647c264a3cd5758a04a7de0beb0c604747 The solution is to ensure that cardToPinnedCopyCache is also populated when resolving unresolved pins.
1 parent 39d1f53 commit 2059b53

File tree

4 files changed

+40
-3
lines changed

4 files changed

+40
-3
lines changed

tensorboard/webapp/metrics/store/metrics_reducers.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ const reducer = createReducer(
372372
state.cardList,
373373
state.cardMetadataMap,
374374
state.cardToPinnedCopy,
375+
state.cardToPinnedCopyCache,
375376
state.pinnedCardToOriginal,
376377
state.cardStepIndex
377378
);
@@ -396,7 +397,6 @@ const reducer = createReducer(
396397
const newState = {
397398
...state,
398399
...resolvedResult,
399-
cardToPinnedCopyCache: resolvedResult.cardToPinnedCopy,
400400
settingOverrides: newSettings,
401401
};
402402

@@ -567,6 +567,7 @@ const reducer = createReducer(
567567
nextCardList,
568568
nextCardMetadataMap,
569569
nextCardToPinnedCopy,
570+
state.cardToPinnedCopyCache,
570571
nextPinnedCardToOriginal,
571572
nextCardStepIndex
572573
);
@@ -922,12 +923,13 @@ const reducer = createReducer(
922923
const resolvedResult = buildOrReturnStateWithPinnedCopy(
923924
cardId,
924925
nextCardToPinnedCopy,
926+
nextCardToPinnedCopyCache,
925927
nextPinnedCardToOriginal,
926928
nextCardStepIndexMap,
927929
nextCardMetadataMap
928930
);
929931
nextCardToPinnedCopy = resolvedResult.cardToPinnedCopy;
930-
nextCardToPinnedCopyCache = resolvedResult.cardToPinnedCopy;
932+
nextCardToPinnedCopyCache = resolvedResult.cardToPinnedCopyCache;
931933
nextPinnedCardToOriginal = resolvedResult.pinnedCardToOriginal;
932934
nextCardMetadataMap = resolvedResult.cardMetadataMap;
933935
nextCardStepIndexMap = resolvedResult.cardStepIndex;

tensorboard/webapp/metrics/store/metrics_reducers_test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,7 @@ describe('metrics reducers', () => {
715715
cardList,
716716
cardStepIndex,
717717
cardToPinnedCopy,
718+
cardToPinnedCopyCache,
718719
pinnedCardToOriginal,
719720
unresolvedImportedPinnedCards,
720721
} = nextState;
@@ -723,6 +724,7 @@ describe('metrics reducers', () => {
723724
cardList,
724725
cardStepIndex,
725726
cardToPinnedCopy,
727+
cardToPinnedCopyCache,
726728
pinnedCardToOriginal,
727729
unresolvedImportedPinnedCards,
728730
}).toEqual({
@@ -738,6 +740,9 @@ describe('metrics reducers', () => {
738740
}),
739741
},
740742
cardToPinnedCopy: new Map([[expectedCardId, expectedPinnedCopyId]]),
743+
cardToPinnedCopyCache: new Map([
744+
[expectedCardId, expectedPinnedCopyId],
745+
]),
741746
pinnedCardToOriginal: new Map([[expectedPinnedCopyId, expectedCardId]]),
742747
unresolvedImportedPinnedCards: [
743748
{plugin: PluginType.SCALARS, tag: 'tagB'},

tensorboard/webapp/metrics/store/metrics_store_internal_utils.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type ResolvedPinPartialState = Pick<
4242
MetricsState,
4343
| 'cardMetadataMap'
4444
| 'cardToPinnedCopy'
45+
| 'cardToPinnedCopyCache'
4546
| 'pinnedCardToOriginal'
4647
| 'cardStepIndex'
4748
>;
@@ -203,6 +204,7 @@ export function buildOrReturnStateWithUnresolvedImportedPins(
203204
nonPinnedCards: NonPinnedCardId[],
204205
cardMetadataMap: CardMetadataMap,
205206
cardToPinnedCopy: CardToPinnedCard,
207+
cardToPinnedCopyCache: CardToPinnedCard,
206208
pinnedCardToOriginal: PinnedCardToCard,
207209
cardStepIndexMap: CardStepIndexMap
208210
): ResolvedPinPartialState & {unresolvedImportedPinnedCards: CardUniqueInfo[]} {
@@ -224,13 +226,15 @@ export function buildOrReturnStateWithUnresolvedImportedPins(
224226
unresolvedImportedPinnedCards,
225227
cardMetadataMap,
226228
cardToPinnedCopy,
229+
cardToPinnedCopyCache,
227230
pinnedCardToOriginal,
228231
cardStepIndex: cardStepIndexMap,
229232
};
230233
}
231234

232235
let stateWithResolvedPins = {
233236
cardToPinnedCopy,
237+
cardToPinnedCopyCache,
234238
pinnedCardToOriginal,
235239
cardStepIndex: cardStepIndexMap,
236240
cardMetadataMap,
@@ -239,6 +243,7 @@ export function buildOrReturnStateWithUnresolvedImportedPins(
239243
stateWithResolvedPins = buildOrReturnStateWithPinnedCopy(
240244
cardToPin,
241245
stateWithResolvedPins.cardToPinnedCopy,
246+
stateWithResolvedPins.cardToPinnedCopyCache,
242247
stateWithResolvedPins.pinnedCardToOriginal,
243248
stateWithResolvedPins.cardStepIndex,
244249
stateWithResolvedPins.cardMetadataMap
@@ -258,6 +263,7 @@ export function buildOrReturnStateWithUnresolvedImportedPins(
258263
export function buildOrReturnStateWithPinnedCopy(
259264
cardId: NonPinnedCardId,
260265
cardToPinnedCopy: CardToPinnedCard,
266+
cardToPinnedCopyCache: CardToPinnedCard,
261267
pinnedCardToOriginal: PinnedCardToCard,
262268
cardStepIndexMap: CardStepIndexMap,
263269
cardMetadataMap: CardMetadataMap
@@ -266,20 +272,23 @@ export function buildOrReturnStateWithPinnedCopy(
266272
if (cardToPinnedCopy.has(cardId)) {
267273
return {
268274
cardToPinnedCopy,
275+
cardToPinnedCopyCache,
269276
pinnedCardToOriginal,
270277
cardStepIndex: cardStepIndexMap,
271278
cardMetadataMap,
272279
};
273280
}
274281

275282
const nextCardToPinnedCopy = new Map(cardToPinnedCopy);
283+
const nextCardToPinnedCopyCache = new Map(cardToPinnedCopyCache);
276284
const nextPinnedCardToOriginal = new Map(pinnedCardToOriginal);
277285
const nextCardStepIndexMap = {...cardStepIndexMap};
278286
const nextCardMetadataMap = {...cardMetadataMap};
279287

280288
// Create a pinned copy. Copies step index from the original card.
281289
const pinnedCardId = getPinnedCardId(cardId);
282290
nextCardToPinnedCopy.set(cardId, pinnedCardId);
291+
nextCardToPinnedCopyCache.set(cardId, pinnedCardId);
283292
nextPinnedCardToOriginal.set(pinnedCardId, cardId);
284293
if (cardStepIndexMap.hasOwnProperty(cardId)) {
285294
nextCardStepIndexMap[pinnedCardId] = cardStepIndexMap[cardId];
@@ -293,6 +302,7 @@ export function buildOrReturnStateWithPinnedCopy(
293302

294303
return {
295304
cardToPinnedCopy: nextCardToPinnedCopy,
305+
cardToPinnedCopyCache: nextCardToPinnedCopyCache,
296306
pinnedCardToOriginal: nextPinnedCardToOriginal,
297307
cardStepIndex: nextCardStepIndexMap,
298308
cardMetadataMap: nextCardMetadataMap,

tensorboard/webapp/metrics/store/metrics_store_internal_utils_test.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ describe('metrics store utils', () => {
373373
{card1: {plugin: PluginType.SCALARS, tag: 'accuracy', runId: null}},
374374
new Map(),
375375
new Map(),
376+
new Map(),
376377
{card1: buildStepIndexMetadata({index: 2})}
377378
);
378379

@@ -381,6 +382,9 @@ describe('metrics store utils', () => {
381382
expect(result.cardToPinnedCopy).toEqual(
382383
new Map([['card1', pinnedCardId]])
383384
);
385+
expect(result.cardToPinnedCopyCache).toEqual(
386+
new Map([['card1', pinnedCardId]])
387+
);
384388
expect(result.pinnedCardToOriginal).toEqual(
385389
new Map([[pinnedCardId, 'card1']])
386390
);
@@ -391,19 +395,22 @@ describe('metrics store utils', () => {
391395
it('adds a pinned copy properly', () => {
392396
const {
393397
cardToPinnedCopy,
398+
cardToPinnedCopyCache,
394399
pinnedCardToOriginal,
395400
cardStepIndex,
396401
cardMetadataMap,
397402
} = buildOrReturnStateWithPinnedCopy(
398403
'card1',
399404
new Map(),
400405
new Map(),
406+
new Map(),
401407
{card1: buildStepIndexMetadata({index: 2})},
402408
{card1: createCardMetadata()}
403409
);
404410
const pinnedCardId = getPinnedCardId('card1');
405411

406412
expect(cardToPinnedCopy).toEqual(new Map([['card1', pinnedCardId]]));
413+
expect(cardToPinnedCopyCache).toEqual(new Map([['card1', pinnedCardId]]));
407414
expect(pinnedCardToOriginal).toEqual(new Map([[pinnedCardId, 'card1']]));
408415
expect(cardStepIndex).toEqual({
409416
card1: buildStepIndexMetadata({index: 2}),
@@ -417,17 +424,26 @@ describe('metrics store utils', () => {
417424

418425
it('throws if the original card does not have metadata', () => {
419426
expect(() => {
420-
buildOrReturnStateWithPinnedCopy('card1', new Map(), new Map(), {}, {});
427+
buildOrReturnStateWithPinnedCopy(
428+
'card1',
429+
new Map(),
430+
new Map(),
431+
new Map(),
432+
{},
433+
{}
434+
);
421435
}).toThrow();
422436
});
423437

424438
it('no-ops if the card already has a pinned copy', () => {
425439
const cardToPinnedCopy = new Map([['card1', 'card-pin1']]);
440+
const cardToPinnedCopyCache = new Map([['card1', 'card-pin1']]);
426441
const pinnedCardToOriginal = new Map([['card-pin1', 'card1']]);
427442
const cardStepIndexMap = {};
428443
const cardMetadataMap = {card1: createCardMetadata()};
429444
const originals = {
430445
cardToPinnedCopy: new Map(cardToPinnedCopy),
446+
cardToPinnedCopyCache: new Map(cardToPinnedCopyCache),
431447
pinnedCardToOriginal: new Map(pinnedCardToOriginal),
432448
cardStepIndexMap: {...cardStepIndexMap},
433449
cardMetadataMap: {...cardMetadataMap},
@@ -436,12 +452,16 @@ describe('metrics store utils', () => {
436452
const result = buildOrReturnStateWithPinnedCopy(
437453
'card1',
438454
cardToPinnedCopy,
455+
cardToPinnedCopyCache,
439456
pinnedCardToOriginal,
440457
cardStepIndexMap,
441458
cardMetadataMap
442459
);
443460

444461
expect(result.cardToPinnedCopy).toEqual(originals.cardToPinnedCopy);
462+
expect(result.cardToPinnedCopyCache).toEqual(
463+
originals.cardToPinnedCopyCache
464+
);
445465
expect(result.pinnedCardToOriginal).toEqual(
446466
originals.pinnedCardToOriginal
447467
);

0 commit comments

Comments
 (0)