From ac9d697b1cdb93b4c7e532727b482cece3674155 Mon Sep 17 00:00:00 2001 From: Venky Shankar Date: Tue, 14 Jan 2020 04:13:16 -0500 Subject: [PATCH] mgr/volumes: introduce 'canceled' state in clone op state machine When fetching the next execution state, -EINTR jumps to 'canceled' state signifying a canceled (interrupted) operation. Also include a helper routine to check if a given state machine is in initial state. Signed-off-by: Venky Shankar --- src/pybind/mgr/volumes/fs/operations/op_sm.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/pybind/mgr/volumes/fs/operations/op_sm.py b/src/pybind/mgr/volumes/fs/operations/op_sm.py index 459d904617d..a5f44f4d00d 100644 --- a/src/pybind/mgr/volumes/fs/operations/op_sm.py +++ b/src/pybind/mgr/volumes/fs/operations/op_sm.py @@ -9,6 +9,7 @@ class OpSm(object): FAILED_STATE = 'failed' FINAL_STATE = 'complete' + CANCEL_STATE = 'canceled' OP_SM_SUBVOLUME = { INIT_STATE_KEY : FINAL_STATE, @@ -16,8 +17,8 @@ class OpSm(object): OP_SM_CLONE = { INIT_STATE_KEY : 'pending', - 'pending' : ('in-progress', FAILED_STATE), - 'in-progress' : (FINAL_STATE, FAILED_STATE), + 'pending' : ('in-progress', (FAILED_STATE, CANCEL_STATE)), + 'in-progress' : (FINAL_STATE, (FAILED_STATE, CANCEL_STATE)), } # type: Dict STATE_MACHINES_TYPES = { @@ -31,7 +32,15 @@ class OpSm(object): @staticmethod def is_failed_state(state): - return state == OpSm.FAILED_STATE + return state == OpSm.FAILED_STATE or state == OpSm.CANCEL_STATE + + @staticmethod + def is_init_state(stm_type, state): + stm = OpSm.STATE_MACHINES_TYPES.get(stm_type, None) + if not stm: + raise OpSmException(-errno.ENOENT, "state machine type '{0}' not found".format(stm_type)) + init_state = stm.get(OpSm.INIT_STATE_KEY, None) + return init_state == state @staticmethod def get_init_state(stm_type): @@ -51,4 +60,9 @@ class OpSm(object): next_state = stm.get(current_state, None) if not next_state: raise OpSmException(-errno.EINVAL, "invalid current state '{0}'".format(current_state)) - return next_state[0] if ret == 0 else next_state[1] + if ret == 0: + return next_state[0] + elif ret == -errno.EINTR: + return next_state[1][1] + else: + return next_state[1][0] -- 2.39.5