RMStateStore FENCED state doesn’t work due to updateFencedState called by stateMachine.doTransition. The reason is
stateMachine.doTransition called from updateFencedState is embedded in stateMachine.doTransition called from public API(removeRMDelegationToken...) or ForwardingEventHandler#handle. So right after the internal state transition from updateFencedState changes the state to FENCED state, the external state transition changes the state back to ACTIVE state. The end result is that RMStateStore is still in ACTIVE state even after notifyStoreOperationFailed is called. The only working case for FENCED state is notifyStoreOperationFailed called from ZKRMStateStore#VerifyActiveStatusThread.
For example: removeRMDelegationToken => handleStoreEvent => enter external stateMachine.doTransition => RemoveRMDTTransition => notifyStoreOperationFailed =>updateFencedState=>handleStoreEvent=> enter internal stateMachine.doTransition => exit internal stateMachine.doTransition change state to FENCED => exit external stateMachine.doTransition change state to ACTIVE.