assert monotonic order for migration

pull/1/head
Michael Kirk 7 years ago
parent 9d5753bd81
commit 45e572e82f

@ -46,8 +46,27 @@ class OWS110SortIdMigration: OWSDatabaseMigration {
let totalCount: UInt = legacySorting.numberOfItemsInAllGroups()
var completedCount: UInt = 0
var seenGroups: Set<String> = Set()
legacySorting.enumerateGroups { group, _ in
autoreleasepool {
// Sanity Check #1
// Make sure our enumeration is monotonically increasing.
// Note: sortIds increase monotonically WRT timestampForLegacySorting, but only WRT the interaction's thread.
//
// e.g. When we migrate the **next** thread, we start with that thread's oldest interaction. So it's possible and expected
// that thread2's oldest interaction will have a smaller timestampForLegacySorting, but a greater sortId then an interaction
// in thread1. That's OK because we only sort messages with respect to the thread they belong in. We don't have any sort of
// "global sort" of messages across all threads.
var previousTimestampForLegacySorting: UInt64 = 0
// Sanity Check #2
// Ensure we only process a DB View's group (i.e. threadId) once.
guard !seenGroups.contains(group) else {
owsFail("unexpectedly seeing a repeated group: \(group)")
}
seenGroups.insert(group)
legacySorting.enumerateKeysAndObjects(inGroup: group) { (_, _, object, _, _) in
autoreleasepool {
guard let interaction = object as? TSInteraction else {
@ -55,10 +74,14 @@ class OWS110SortIdMigration: OWSDatabaseMigration {
return
}
guard interaction.timestampForLegacySorting() >= previousTimestampForLegacySorting else {
owsFail("unexpected object ordering previousTimestampForLegacySorting: \(previousTimestampForLegacySorting) interaction.timestampForLegacySorting: \(interaction.timestampForLegacySorting)")
}
previousTimestampForLegacySorting = interaction.timestampForLegacySorting()
interaction.saveNextSortId(transaction: transaction)
completedCount += 1
if completedCount % 100 == 0 {
// Legit usage of legacy sorting for migration to new sorting
Logger.info("thread: \(interaction.uniqueThreadId), timestampForLegacySorting:\(interaction.timestampForLegacySorting()), sortId: \(interaction.sortId) totalCount: \(totalCount), completedcount: \(completedCount)")

Loading…
Cancel
Save