in table/metadata.go [529:594]
func (b *MetadataBuilder) SetSnapshotRef(
name string,
snapshotID int64,
refType RefType,
options ...setSnapshotRefOption,
) (*MetadataBuilder, error) {
ref := SnapshotRef{
SnapshotID: snapshotID,
SnapshotRefType: refType,
}
for _, opt := range options {
if err := opt(&ref); err != nil {
return nil, fmt.Errorf("invalid snapshot ref option: %w", err)
}
}
var maxRefAgeMs, maxSnapshotAgeMs int64
var minSnapshotsToKeep int
if ref.MaxRefAgeMs != nil {
maxRefAgeMs = *ref.MaxRefAgeMs
}
if ref.MaxSnapshotAgeMs != nil {
maxSnapshotAgeMs = *ref.MaxSnapshotAgeMs
}
if ref.MinSnapshotsToKeep != nil {
minSnapshotsToKeep = *ref.MinSnapshotsToKeep
}
if existingRef, ok := b.refs[name]; ok && existingRef.Equals(ref) {
return b, nil
}
snapshot, err := b.SnapshotByID(snapshotID)
if err != nil {
return nil, fmt.Errorf("can't set snapshot ref %s to unknown snapshot %d: %w", name, snapshotID, err)
}
isAddedSnapshot := slices.ContainsFunc(b.updates, func(u Update) bool {
return u.Action() == UpdateAddSnapshot && u.(*addSnapshotUpdate).Snapshot.SnapshotID == snapshotID
})
if isAddedSnapshot {
b.lastUpdatedMS = snapshot.TimestampMs
}
if name == MainBranch {
b.updates = append(b.updates, NewSetSnapshotRefUpdate(name, snapshotID, refType, maxRefAgeMs, maxSnapshotAgeMs, minSnapshotsToKeep))
b.currentSnapshotID = &snapshotID
if !isAddedSnapshot {
b.lastUpdatedMS = time.Now().Local().UnixMilli()
}
b.snapshotLog = append(b.snapshotLog, SnapshotLogEntry{
SnapshotID: snapshotID,
TimestampMs: b.lastUpdatedMS,
})
}
if slices.ContainsFunc(b.updates, func(u Update) bool {
return u.Action() == UpdateAddSnapshot && u.(*addSnapshotUpdate).Snapshot.SnapshotID == snapshotID
}) {
b.lastUpdatedMS = snapshot.TimestampMs
}
b.refs[name] = ref
return b, nil
}