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:
parent
0194aa5bd2
commit
fd7641d575
@ -73,6 +73,7 @@ struct spdk_lvol_store {
|
|||||||
int lvols_opened;
|
int lvols_opened;
|
||||||
TAILQ_HEAD(, spdk_lvol) lvols;
|
TAILQ_HEAD(, spdk_lvol) lvols;
|
||||||
TAILQ_HEAD(, spdk_lvol) pending_lvols;
|
TAILQ_HEAD(, spdk_lvol) pending_lvols;
|
||||||
|
TAILQ_HEAD(, spdk_lvol) retry_open_lvols;
|
||||||
bool on_list;
|
bool on_list;
|
||||||
TAILQ_ENTRY(spdk_lvol_store) link;
|
TAILQ_ENTRY(spdk_lvol_store) link;
|
||||||
char name[SPDK_LVS_NAME_MAX];
|
char name[SPDK_LVS_NAME_MAX];
|
||||||
|
@ -351,6 +351,7 @@ lvs_load_cb(void *cb_arg, struct spdk_blob_store *bs, int lvolerrno)
|
|||||||
lvs->bs_dev = req->bs_dev;
|
lvs->bs_dev = req->bs_dev;
|
||||||
TAILQ_INIT(&lvs->lvols);
|
TAILQ_INIT(&lvs->lvols);
|
||||||
TAILQ_INIT(&lvs->pending_lvols);
|
TAILQ_INIT(&lvs->pending_lvols);
|
||||||
|
TAILQ_INIT(&lvs->retry_open_lvols);
|
||||||
|
|
||||||
req->lvol_store = lvs;
|
req->lvol_store = lvs;
|
||||||
|
|
||||||
@ -517,6 +518,7 @@ lvs_init_cb(void *cb_arg, struct spdk_blob_store *bs, int lvserrno)
|
|||||||
lvs->blobstore = bs;
|
lvs->blobstore = bs;
|
||||||
TAILQ_INIT(&lvs->lvols);
|
TAILQ_INIT(&lvs->lvols);
|
||||||
TAILQ_INIT(&lvs->pending_lvols);
|
TAILQ_INIT(&lvs->pending_lvols);
|
||||||
|
TAILQ_INIT(&lvs->retry_open_lvols);
|
||||||
|
|
||||||
SPDK_INFOLOG(lvol, "Lvol store initialized\n");
|
SPDK_INFOLOG(lvol, "Lvol store initialized\n");
|
||||||
|
|
||||||
|
@ -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;
|
struct spdk_lvol_store *lvs = req->lvol_store;
|
||||||
|
|
||||||
if (lvolerrno != 0) {
|
if (lvolerrno != 0) {
|
||||||
SPDK_ERRLOG("Error opening lvol %s\n", lvol->unique_id);
|
|
||||||
TAILQ_REMOVE(&lvs->lvols, lvol, link);
|
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--;
|
lvs->lvol_count--;
|
||||||
free(lvol);
|
free(lvol);
|
||||||
goto end;
|
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);
|
SPDK_INFOLOG(vbdev_lvol, "Opening lvol %s succeeded\n", lvol->unique_id);
|
||||||
|
|
||||||
end:
|
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) {
|
if (lvs->lvols_opened >= lvs->lvol_count) {
|
||||||
SPDK_INFOLOG(vbdev_lvol, "Opening lvols finished\n");
|
SPDK_INFOLOG(vbdev_lvol, "Opening lvols finished\n");
|
||||||
_vbdev_lvs_examine_done(req, 0);
|
_vbdev_lvs_examine_done(req, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user