Skip to content

Commit e73fadc

Browse files
emmaling27Convex, Inc.
authored andcommitted
Make hard_delete_tablet_document idempotent (#44009)
We can receive tablet ids to cleanup that have already been deleted. This can happen if the retention worker loop encounters an error after the tablet has been sent and retries. GitOrigin-RevId: 9add1b2552f6f5d3288517dfebc76a42aec7b5fe
1 parent 6e86f50 commit e73fadc

File tree

1 file changed

+13
-8
lines changed
  • crates/database/src/bootstrap_model

1 file changed

+13
-8
lines changed

crates/database/src/bootstrap_model/table.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -266,14 +266,16 @@ impl<'a, RT: Runtime> TableModel<'a, RT> {
266266
/// This method should only be called after all documents in the tablet have
267267
/// been deleted by retention
268268
pub async fn hard_delete_tablet_document(&mut self, tablet_id: TabletId) -> anyhow::Result<()> {
269-
let doc = self.get_table_metadata(tablet_id).await?;
270-
anyhow::ensure!(
271-
doc.state == TableState::Deleting,
272-
"Cannot delete a tablet that is not in deleting state"
273-
);
274-
SystemMetadataModel::new(self.tx, TableNamespace::Global)
275-
.delete(doc.id())
276-
.await?;
269+
if self.tx.table_mapping().tablet_id_exists(tablet_id) {
270+
let doc = self.get_table_metadata(tablet_id).await?;
271+
anyhow::ensure!(
272+
doc.state == TableState::Deleting,
273+
"Cannot delete a tablet that is not in deleting state"
274+
);
275+
SystemMetadataModel::new(self.tx, TableNamespace::Global)
276+
.delete(doc.id())
277+
.await?;
278+
}
277279
Ok(())
278280
}
279281

@@ -869,6 +871,9 @@ mod tests {
869871
.delete_active_table(TableNamespace::Global, table_name)
870872
.await?;
871873
model.hard_delete_tablet_document(id.tablet_id).await?;
874+
875+
// Test idempotency
876+
model.hard_delete_tablet_document(id.tablet_id).await?;
872877
Ok(())
873878
}
874879

0 commit comments

Comments
 (0)