diff --git a/pageserver/src/deletion_queue/list_writer.rs b/pageserver/src/deletion_queue/list_writer.rs index 618a59f8fe..6e5f2a66d3 100644 --- a/pageserver/src/deletion_queue/list_writer.rs +++ b/pageserver/src/deletion_queue/list_writer.rs @@ -243,11 +243,7 @@ impl ListWriter { let file_name = dentry.file_name(); let dentry_str = file_name.to_string_lossy(); - if Some(file_name.as_os_str()) == header_path.file_name() { - // Don't try and parse the header's name like a list - continue; - } - + // Temporary files might be left behind from `crashsafe_overwrite` if dentry_str.ends_with(TEMP_SUFFIX) { info!("Cleaning up temporary file {dentry_str}"); let absolute_path = deletion_directory.join(dentry.file_name()); @@ -263,6 +259,11 @@ impl ListWriter { continue; } + if Some(file_name.as_os_str()) == header_path.file_name() { + // Don't try and parse the header's name like a list + continue; + } + let file_name = dentry.file_name().to_owned(); let basename = file_name.to_string_lossy(); let seq_part = if let Some(m) = list_name_pattern.captures(&basename) { diff --git a/pageserver/src/deletion_queue/validator.rs b/pageserver/src/deletion_queue/validator.rs index 64603045d2..a6a8dd7bd6 100644 --- a/pageserver/src/deletion_queue/validator.rs +++ b/pageserver/src/deletion_queue/validator.rs @@ -116,6 +116,11 @@ where /// Valid LSN updates propagate back to Timelines immediately, valid DeletionLists /// go into the queue of ready-to-execute lists. async fn validate(&mut self) -> Result<(), DeletionQueueError> { + // Figure out for each tenant which generation number to validate. + // + // It is sufficient to validate the max generation number of each tenant because only the + // highest generation number can possibly be valid. Hence this map will collect the + // highest generation pending validation for each tenant. let mut tenant_generations = HashMap::new(); for list in &self.pending_lists { for (tenant_id, tenant_list) in &list.tenants { @@ -246,6 +251,11 @@ where } } + // Assert monotonicity of the list sequence numbers we are processing + if let Some(validated) = validated_sequence { + assert!(list.sequence >= validated) + } + validated_sequence = Some(list.sequence); }