From fd7641d5751e6dfa6057d7777456519eb920f8e7 Mon Sep 17 00:00:00 2001 From: Artur Paszkiewicz Date: Tue, 21 Feb 2023 16:30:17 +0100 Subject: [PATCH] bdev/lvol: retry lvol open if it fails due to insufficient resources Fixes: #2910 Change-Id: Id28b5c4e7e002fe81fea774d989d1507d933133e Signed-off-by: Artur Paszkiewicz Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16875 Tested-by: SPDK CI Jenkins Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris --- include/spdk_internal/lvolstore.h | 1 + lib/lvol/lvol.c | 2 ++ module/bdev/lvol/vbdev_lvol.c | 13 ++++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/include/spdk_internal/lvolstore.h b/include/spdk_internal/lvolstore.h index 37c0ce8b0..9db4b2c95 100644 --- a/include/spdk_internal/lvolstore.h +++ b/include/spdk_internal/lvolstore.h @@ -73,6 +73,7 @@ struct spdk_lvol_store { int lvols_opened; TAILQ_HEAD(, spdk_lvol) lvols; TAILQ_HEAD(, spdk_lvol) pending_lvols; + TAILQ_HEAD(, spdk_lvol) retry_open_lvols; bool on_list; TAILQ_ENTRY(spdk_lvol_store) link; char name[SPDK_LVS_NAME_MAX]; diff --git a/lib/lvol/lvol.c b/lib/lvol/lvol.c index aee5d1211..987be639d 100644 --- a/lib/lvol/lvol.c +++ b/lib/lvol/lvol.c @@ -351,6 +351,7 @@ lvs_load_cb(void *cb_arg, struct spdk_blob_store *bs, int lvolerrno) lvs->bs_dev = req->bs_dev; TAILQ_INIT(&lvs->lvols); TAILQ_INIT(&lvs->pending_lvols); + TAILQ_INIT(&lvs->retry_open_lvols); req->lvol_store = lvs; @@ -517,6 +518,7 @@ lvs_init_cb(void *cb_arg, struct spdk_blob_store *bs, int lvserrno) lvs->blobstore = bs; TAILQ_INIT(&lvs->lvols); TAILQ_INIT(&lvs->pending_lvols); + TAILQ_INIT(&lvs->retry_open_lvols); SPDK_INFOLOG(lvol, "Lvol store initialized\n"); diff --git a/module/bdev/lvol/vbdev_lvol.c b/module/bdev/lvol/vbdev_lvol.c index 02736015a..2a31179a8 100644 --- a/module/bdev/lvol/vbdev_lvol.c +++ b/module/bdev/lvol/vbdev_lvol.c @@ -1340,8 +1340,12 @@ _vbdev_lvs_examine_finish(void *cb_arg, struct spdk_lvol *lvol, int lvolerrno) struct spdk_lvol_store *lvs = req->lvol_store; if (lvolerrno != 0) { - SPDK_ERRLOG("Error opening lvol %s\n", lvol->unique_id); TAILQ_REMOVE(&lvs->lvols, lvol, link); + if (lvolerrno == -ENOMEM) { + TAILQ_INSERT_TAIL(&lvs->retry_open_lvols, lvol, link); + return; + } + SPDK_ERRLOG("Error opening lvol %s\n", lvol->unique_id); lvs->lvol_count--; free(lvol); goto end; @@ -1357,6 +1361,13 @@ _vbdev_lvs_examine_finish(void *cb_arg, struct spdk_lvol *lvol, int lvolerrno) SPDK_INFOLOG(vbdev_lvol, "Opening lvol %s succeeded\n", lvol->unique_id); end: + if (!TAILQ_EMPTY(&lvs->retry_open_lvols)) { + lvol = TAILQ_FIRST(&lvs->retry_open_lvols); + TAILQ_REMOVE(&lvs->retry_open_lvols, lvol, link); + TAILQ_INSERT_HEAD(&lvs->lvols, lvol, link); + spdk_lvol_open(lvol, _vbdev_lvs_examine_finish, req); + return; + } if (lvs->lvols_opened >= lvs->lvol_count) { SPDK_INFOLOG(vbdev_lvol, "Opening lvols finished\n"); _vbdev_lvs_examine_done(req, 0);