bdev/lvol: retry lvol open if it fails due to insufficient resources

Fixes: #2910
Change-Id: Id28b5c4e7e002fe81fea774d989d1507d933133e
Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16875
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Artur Paszkiewicz 2023-02-21 16:30:17 +01:00 committed by Jim Harris
parent 0194aa5bd2
commit fd7641d575
3 changed files with 15 additions and 1 deletions

View File

@ -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];

View File

@ -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");

View File

@ -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);