Commit 9312b259 authored by Yalong Wang's avatar Yalong Wang Committed by Tomasz Zawadzki
Browse files

lib/blob: sort cluster mapping when clear_clusters



Sort cluster mapping by LBA in ascending order,
to make it more easy to merges contiguous ranges
before issuing unmap requests.
This reduces the number of I/O operations,
speed up process of delete lvol and
mitigates resource exhaustion.

Change-Id: I9a1b111c67a3be33515a21b12f1c4dc746526ffc
Signed-off-by: default avatarYalong Wang <yalong9@staff.sina.com.cn>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26386


Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz@tzawadzki.com>
parent 94d22300
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -2022,6 +2022,21 @@ blob_persist_clear_clusters_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserr
	blob_persist_clear_extents(seq, ctx);
}

static int
lba_cmp(const void *a, const void *b)
{
	uint64_t ua = *(const uint64_t *)a;
	uint64_t ub = *(const uint64_t *)b;

	if (ua < ub) {
		return -1;
	}
	if (ua > ub) {
		return 1;
	}
	return 0;
}

static void
blob_persist_clear_clusters(spdk_bs_sequence_t *seq, struct spdk_blob_persist_ctx *ctx)
{
@@ -2041,6 +2056,11 @@ blob_persist_clear_clusters(spdk_bs_sequence_t *seq, struct spdk_blob_persist_ct
	/* Clear all clusters that were truncated */
	lba = 0;
	lba_count = 0;

	if (blob->active.cluster_array_size > blob->active.num_clusters) {
		qsort(&blob->active.clusters[blob->active.num_clusters],
		      blob->active.cluster_array_size - blob->active.num_clusters, sizeof(uint64_t), lba_cmp);
	}
	for (i = blob->active.num_clusters; i < blob->active.cluster_array_size; i++) {
		uint64_t next_lba = blob->active.clusters[i];
		uint64_t next_lba_count = bs_cluster_to_lba(bs, 1);