diff --git a/cmd/zfs_object_agent/zettaobject/src/object_access/blob.rs b/cmd/zfs_object_agent/zettaobject/src/object_access/blob.rs index 9b6ff94bd318..86a4eb6bd67b 100644 --- a/cmd/zfs_object_agent/zettaobject/src/object_access/blob.rs +++ b/cmd/zfs_object_agent/zettaobject/src/object_access/blob.rs @@ -550,6 +550,13 @@ impl ObjectAccessTrait for BlobObjectAccess { } async fn delete_objects(&self, stream: &mut (dyn Stream + Send + Unpin)) { + // azure-sdk-for-rust does not yet support batched deletion of objects. So we issue + // object deletion requests in parallel. This means we open many TCP connections in + // parallel. Experimentally, we see that we get good performance with about half the + // default batch size that we use with S3 which is 1000. This also avoids running out + // of file desciptors when the ulimit is low. + let batch_size = *OBJECT_DELETION_BATCH_SIZE / 2; + stream .map(|key| async move { let op = self.access_stats.begin(ObjectAccessOpType::ObjectDelete); @@ -584,7 +591,7 @@ impl ObjectAccessTrait for BlobObjectAccess { .unwrap(); op.end(0); }) - .buffered(*OBJECT_DELETION_BATCH_SIZE) + .buffered(batch_size) .count() .await; } diff --git a/etc/systemd/system/zfs-object-agent.service.in b/etc/systemd/system/zfs-object-agent.service.in index d01786aabc1a..adfd758b46d2 100644 --- a/etc/systemd/system/zfs-object-agent.service.in +++ b/etc/systemd/system/zfs-object-agent.service.in @@ -16,6 +16,7 @@ Environment="AWS_ACCESS_KEY_ID=" EnvironmentFile=-/etc/zfs/zoa.conf ExecStart=/usr/bin/start_zoa Restart=always +LimitNOFILE=infinity [Install] WantedBy=zfs-import.target