blob: Add a bitmask for quickly checking which blobs are open

This can speed up the check for whether a blob is already open
significantly.

Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Change-Id: If32b0b1f168fcdb58e61df6281d7b7520725a195
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/2781
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
This commit is contained in:
Ben Walker 2020-06-04 11:44:02 -07:00 committed by Tomasz Zawadzki
parent 9de6d03ee4
commit 30ee8137cf
2 changed files with 32 additions and 2 deletions

View File

@ -2839,6 +2839,10 @@ blob_lookup(struct spdk_blob_store *bs, spdk_blob_id blobid)
{ {
struct spdk_blob *blob; struct spdk_blob *blob;
if (spdk_bit_array_get(bs->open_blobids, blobid) == 0) {
return NULL;
}
TAILQ_FOREACH(blob, &bs->blobs, link) { TAILQ_FOREACH(blob, &bs->blobs, link) {
if (blob->id == blobid) { if (blob->id == blobid) {
return blob; return blob;
@ -2947,11 +2951,13 @@ bs_dev_destroy(void *io_device)
TAILQ_FOREACH_SAFE(blob, &bs->blobs, link, blob_tmp) { TAILQ_FOREACH_SAFE(blob, &bs->blobs, link, blob_tmp) {
TAILQ_REMOVE(&bs->blobs, blob, link); TAILQ_REMOVE(&bs->blobs, blob, link);
spdk_bit_array_clear(bs->open_blobids, blob->id);
blob_free(blob); blob_free(blob);
} }
pthread_mutex_destroy(&bs->used_clusters_mutex); pthread_mutex_destroy(&bs->used_clusters_mutex);
spdk_bit_array_free(&bs->open_blobids);
spdk_bit_array_free(&bs->used_blobids); spdk_bit_array_free(&bs->used_blobids);
spdk_bit_array_free(&bs->used_md_pages); spdk_bit_array_free(&bs->used_md_pages);
spdk_bit_array_free(&bs->used_clusters); spdk_bit_array_free(&bs->used_clusters);
@ -3140,6 +3146,7 @@ bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_st
/* The metadata is assumed to be at least 1 page */ /* The metadata is assumed to be at least 1 page */
bs->used_md_pages = spdk_bit_array_create(1); bs->used_md_pages = spdk_bit_array_create(1);
bs->used_blobids = spdk_bit_array_create(0); bs->used_blobids = spdk_bit_array_create(0);
bs->open_blobids = spdk_bit_array_create(0);
pthread_mutex_init(&bs->used_clusters_mutex, NULL); pthread_mutex_init(&bs->used_clusters_mutex, NULL);
@ -3149,6 +3156,7 @@ bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_st
if (rc == -1) { if (rc == -1) {
spdk_io_device_unregister(bs, NULL); spdk_io_device_unregister(bs, NULL);
pthread_mutex_destroy(&bs->used_clusters_mutex); pthread_mutex_destroy(&bs->used_clusters_mutex);
spdk_bit_array_free(&bs->open_blobids);
spdk_bit_array_free(&bs->used_blobids); spdk_bit_array_free(&bs->used_blobids);
spdk_bit_array_free(&bs->used_md_pages); spdk_bit_array_free(&bs->used_md_pages);
spdk_bit_array_free(&bs->used_clusters); spdk_bit_array_free(&bs->used_clusters);
@ -4088,6 +4096,12 @@ bs_recover(struct spdk_bs_load_ctx *ctx)
return; return;
} }
rc = spdk_bit_array_resize(&ctx->bs->open_blobids, ctx->super->md_len);
if (rc < 0) {
bs_load_ctx_fail(ctx, -ENOMEM);
return;
}
ctx->bs->num_free_clusters = ctx->bs->total_clusters; ctx->bs->num_free_clusters = ctx->bs->total_clusters;
bs_load_replay_md(ctx); bs_load_replay_md(ctx);
} }
@ -4633,6 +4647,13 @@ spdk_bs_init(struct spdk_bs_dev *dev, struct spdk_bs_opts *o,
return; return;
} }
rc = spdk_bit_array_resize(&bs->open_blobids, bs->md_len);
if (rc < 0) {
bs_free(bs);
cb_fn(cb_arg, NULL, -ENOMEM);
return;
}
ctx = calloc(1, sizeof(*ctx)); ctx = calloc(1, sizeof(*ctx));
if (!ctx) { if (!ctx) {
bs_free(bs); bs_free(bs);
@ -6184,6 +6205,7 @@ delete_snapshot_cleanup_snapshot(void *cb_arg, int bserrno)
if (ctx->bserrno != 0) { if (ctx->bserrno != 0) {
assert(blob_lookup(ctx->snapshot->bs, ctx->snapshot->id) == NULL); assert(blob_lookup(ctx->snapshot->bs, ctx->snapshot->id) == NULL);
TAILQ_INSERT_HEAD(&ctx->snapshot->bs->blobs, ctx->snapshot, link); TAILQ_INSERT_HEAD(&ctx->snapshot->bs->blobs, ctx->snapshot, link);
spdk_bit_array_set(ctx->snapshot->bs->open_blobids, ctx->snapshot->id);
} }
ctx->snapshot->locked_operation_in_progress = false; ctx->snapshot->locked_operation_in_progress = false;
@ -6576,6 +6598,7 @@ bs_delete_open_cpl(void *cb_arg, struct spdk_blob *blob, int bserrno)
* Remove the blob from the blob_store list now, to ensure it does not * Remove the blob from the blob_store list now, to ensure it does not
* get returned after this point by blob_lookup(). * get returned after this point by blob_lookup().
*/ */
spdk_bit_array_clear(blob->bs->open_blobids, blob->id);
TAILQ_REMOVE(&blob->bs->blobs, blob, link); TAILQ_REMOVE(&blob->bs->blobs, blob, link);
if (update_clone) { if (update_clone) {
@ -6631,13 +6654,18 @@ bs_open_blob_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
blob->open_ref++; blob->open_ref++;
spdk_bit_array_set(blob->bs->open_blobids, blob->id);
TAILQ_INSERT_HEAD(&blob->bs->blobs, blob, link); TAILQ_INSERT_HEAD(&blob->bs->blobs, blob, link);
bs_sequence_finish(seq, bserrno); bs_sequence_finish(seq, bserrno);
} }
static void bs_open_blob(struct spdk_blob_store *bs, spdk_blob_id blobid, static void
struct spdk_blob_open_opts *opts, spdk_blob_op_with_handle_complete cb_fn, void *cb_arg) bs_open_blob(struct spdk_blob_store *bs,
spdk_blob_id blobid,
struct spdk_blob_open_opts *opts,
spdk_blob_op_with_handle_complete cb_fn,
void *cb_arg)
{ {
struct spdk_blob *blob; struct spdk_blob *blob;
struct spdk_bs_cpl cpl; struct spdk_bs_cpl cpl;
@ -6927,6 +6955,7 @@ blob_close_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
* remove them again. * remove them again.
*/ */
if (blob->active.num_pages > 0) { if (blob->active.num_pages > 0) {
spdk_bit_array_clear(blob->bs->open_blobids, blob->id);
TAILQ_REMOVE(&blob->bs->blobs, blob, link); TAILQ_REMOVE(&blob->bs->blobs, blob, link);
} }
blob_free(blob); blob_free(blob);

View File

@ -188,6 +188,7 @@ struct spdk_blob_store {
struct spdk_bit_array *used_md_pages; struct spdk_bit_array *used_md_pages;
struct spdk_bit_array *used_clusters; struct spdk_bit_array *used_clusters;
struct spdk_bit_array *used_blobids; struct spdk_bit_array *used_blobids;
struct spdk_bit_array *open_blobids;
pthread_mutex_t used_clusters_mutex; pthread_mutex_t used_clusters_mutex;