Skip to content

Commit f855c11

Browse files
committed
fix: some snapshots not restoring correctly due to id generation order
1 parent 023c6f9 commit f855c11

File tree

1 file changed

+40
-25
lines changed

1 file changed

+40
-25
lines changed

packages/job-worker/src/playout/snapshot.ts

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,22 @@ import { DBRundownPlaylist } from '@sofie-automation/corelib/dist/dataModel/Rund
3232
import { RundownOrphanedReason } from '@sofie-automation/corelib/dist/dataModel/Rundown'
3333
import { SofieIngestDataCacheObj } from '@sofie-automation/corelib/dist/dataModel/SofieIngestDataCache'
3434

35+
class IdMapWithGenerator<V extends ProtectedString<any>> extends Map<V, V> {
36+
getOrGenerate(key: V): V {
37+
return this.getOrGenerateAndWarn(key, '')
38+
}
39+
40+
getOrGenerateAndWarn(key: V, name: string): V {
41+
const existing = this.get(key)
42+
if (existing) return existing
43+
44+
const newValue = getRandomId<V>()
45+
this.set(key, newValue)
46+
if (name) logger.warn(`Couldn't find "${name}" when restoring snapshot`)
47+
return newValue
48+
}
49+
}
50+
3551
/**
3652
* Generate the Playlist owned portions of a Playlist snapshot
3753
*/
@@ -244,7 +260,7 @@ export async function handleRestorePlaylistSnapshot(
244260
rd._id = getRandomId()
245261
rundownIdMap.set(oldId, rd._id)
246262
}
247-
const partIdMap = new Map<PartId, PartId>()
263+
const partIdMap = new IdMapWithGenerator<PartId>()
248264
for (const part of snapshot.parts) {
249265
const oldId = part._id
250266
part._id = part.externalId ? getPartId(getNewRundownId(part.rundownId), part.externalId) : getRandomId()
@@ -253,35 +269,37 @@ export async function handleRestorePlaylistSnapshot(
253269
}
254270

255271
const partInstanceOldRundownIdMap = new Map<PartInstanceId, RundownId>()
256-
const partInstanceIdMap = new Map<PartInstanceId, PartInstanceId>()
272+
const partInstanceIdMap = new IdMapWithGenerator<PartInstanceId>()
257273
for (const partInstance of snapshot.partInstances) {
258274
const oldId = partInstance._id
259275
partInstance._id = getRandomId()
260276
partInstanceIdMap.set(oldId, partInstance._id)
261277

262-
partInstance.part._id = partIdMap.get(partInstance.part._id) || getRandomId()
278+
partInstance.part._id = partIdMap.getOrGenerate(partInstance.part._id)
263279
partInstanceOldRundownIdMap.set(oldId, partInstance.rundownId)
264280
}
265-
const segmentIdMap = new Map<SegmentId, SegmentId>()
281+
const segmentIdMap = new IdMapWithGenerator<SegmentId>()
266282
for (const segment of snapshot.segments) {
267283
const oldId = segment._id
268284
segment._id = getSegmentId(getNewRundownId(segment.rundownId), segment.externalId)
269285
segmentIdMap.set(oldId, segment._id)
270286
}
271287
type AnyPieceId = PieceId | AdLibActionId | RundownBaselineAdLibActionId
272-
const pieceIdMap = new Map<AnyPieceId, AnyPieceId>()
288+
const pieceIdMap = new IdMapWithGenerator<AnyPieceId>()
273289
for (const piece of snapshot.pieces) {
274290
const oldId = piece._id
275291
piece.startRundownId = getNewRundownId(piece.startRundownId)
276292
if (piece.startPartId) {
277-
piece.startPartId =
278-
partIdMap.get(piece.startPartId) ||
279-
getRandomIdAndWarn(`piece.startPartId=${piece.startPartId} of piece=${piece._id}`)
293+
piece.startPartId = partIdMap.getOrGenerateAndWarn(
294+
piece.startPartId,
295+
`piece.startPartId=${piece.startPartId} of piece=${piece._id}`
296+
)
280297
}
281298
if (piece.startSegmentId) {
282-
piece.startSegmentId =
283-
segmentIdMap.get(piece.startSegmentId) ||
284-
getRandomIdAndWarn(`piece.startSegmentId=${piece.startSegmentId} of piece=${piece._id}`)
299+
piece.startSegmentId = segmentIdMap.getOrGenerateAndWarn(
300+
piece.startSegmentId,
301+
`piece.startSegmentId=${piece.startSegmentId} of piece=${piece._id}`
302+
)
285303
}
286304
piece._id = getRandomId()
287305
pieceIdMap.set(oldId, piece._id)
@@ -301,10 +319,11 @@ export async function handleRestorePlaylistSnapshot(
301319
for (const pieceInstance of snapshot.pieceInstances) {
302320
pieceInstance._id = getRandomId()
303321

304-
pieceInstance.piece._id = (pieceIdMap.get(pieceInstance.piece._id) || getRandomId()) as PieceId // Note: don't warn if not found, as the piece may have been deleted
322+
pieceInstance.piece._id = pieceIdMap.getOrGenerate(pieceInstance.piece._id) as PieceId // Note: don't warn if not found, as the piece may have been deleted
305323
if (pieceInstance.infinite) {
306-
pieceInstance.infinite.infinitePieceId =
307-
(pieceIdMap.get(pieceInstance.infinite.infinitePieceId) as PieceId) || getRandomId() // Note: don't warn if not found, as the piece may have been deleted
324+
pieceInstance.infinite.infinitePieceId = pieceIdMap.getOrGenerate(
325+
pieceInstance.infinite.infinitePieceId
326+
) as PieceId // Note: don't warn if not found, as the piece may have been deleted
308327
}
309328
}
310329

@@ -335,9 +354,10 @@ export async function handleRestorePlaylistSnapshot(
335354
case ExpectedPackageDBType.BASELINE_ADLIB_PIECE:
336355
case ExpectedPackageDBType.BASELINE_ADLIB_ACTION:
337356
case ExpectedPackageDBType.BASELINE_PIECE: {
338-
expectedPackage.pieceId =
339-
pieceIdMap.get(expectedPackage.pieceId) ||
340-
getRandomIdAndWarn(`expectedPackage.pieceId=${expectedPackage.pieceId}`)
357+
expectedPackage.pieceId = pieceIdMap.getOrGenerateAndWarn(
358+
expectedPackage.pieceId,
359+
`expectedPackage.pieceId=${expectedPackage.pieceId}`
360+
)
341361

342362
expectedPackage._id = getExpectedPackageId(expectedPackage.pieceId, expectedPackage.blueprintPackageId)
343363

@@ -388,13 +408,13 @@ export async function handleRestorePlaylistSnapshot(
388408
}
389409

390410
if (obj.partId) {
391-
obj.partId = partIdMap.get(obj.partId) || getRandomId()
411+
obj.partId = partIdMap.getOrGenerate(obj.partId)
392412
}
393413
if (obj.segmentId) {
394-
obj.segmentId = segmentIdMap.get(obj.segmentId) || getRandomId()
414+
obj.segmentId = segmentIdMap.getOrGenerate(obj.segmentId)
395415
}
396416
if (obj.partInstanceId) {
397-
obj.partInstanceId = partInstanceIdMap.get(obj.partInstanceId) || getRandomId()
417+
obj.partInstanceId = partInstanceIdMap.getOrGenerate(obj.partInstanceId)
398418
}
399419

400420
if (updateOwnId) {
@@ -521,11 +541,6 @@ export async function handleRestorePlaylistSnapshot(
521541
}
522542
}
523543

524-
function getRandomIdAndWarn<T extends ProtectedString<any>>(name: string): T {
525-
logger.warn(`Couldn't find "${name}" when restoring snapshot`)
526-
return getRandomId<T>()
527-
}
528-
529544
function fixupImportedSelectedPartInstanceIds(
530545
snapshot: CoreRundownPlaylistSnapshot,
531546
rundownIdMap: Map<RundownId, RundownId>,

0 commit comments

Comments
 (0)