From 24d8a09b747327ba3a109b9de5a4e9b461b7e7b5 Mon Sep 17 00:00:00 2001 From: Matthew Ahrens Date: Wed, 1 Dec 2021 10:29:45 -0800 Subject: [PATCH] fix panic in object deleter (#31) In the delete_task(), tx.send() may find that the receiver has already been dropped because the ObjectDeleter has been dropped. This is not a bug, we can ignore it and return from the deletion task. --- cmd/zfs_object_agent/zettaobject/src/object_deleter.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cmd/zfs_object_agent/zettaobject/src/object_deleter.rs b/cmd/zfs_object_agent/zettaobject/src/object_deleter.rs index 41cf37ddf267..7f32cb0ccfa1 100644 --- a/cmd/zfs_object_agent/zettaobject/src/object_deleter.rs +++ b/cmd/zfs_object_agent/zettaobject/src/object_deleter.rs @@ -29,7 +29,7 @@ impl ObjectDeleter { Self::open(object_access, guid, Default::default()) } - async fn deleter( + async fn delete_task( object_access: Arc, guid: PoolGuid, mut rx: mpsc::UnboundedReceiver>, @@ -46,7 +46,10 @@ impl ObjectDeleter { vec.into_iter().map(|o| DataObject::key(guid, o)), )) .await; - tx.send(chunk.len()).unwrap(); + if tx.send(chunk.len()).is_err() { + // ObjectDeleter has been dropped + return; + } } info!( "reclaim: deleted {} objects in {}ms", @@ -72,7 +75,7 @@ impl ObjectDeleter { }; if !object_access.readonly() { - tokio::spawn(Self::deleter( + tokio::spawn(Self::delete_task( object_access, guid, initiation_rx,