[Interest] serialization of QStateMachine for recovery mode

Wegner iwegner at gmx.de
Fri Oct 11 21:51:32 CEST 2013


Hi Mandeep and K.Frank!
...
>> Let's take a over-simplified SM.
>>
>> A->B->C->D
>>
>> now if the app crashed while it was state C, on restarting the app, I don't
>> see a legal way of directly taking the SM to C, other than replaying the
>> events that caused transitions to it.
>>
>> Or is there some other trick to it?
>
> First, I won't speak to the details of the Qt state-machine
> implementation (because I don't really know them).

Ok, sure we can implement it on our own but still the question is if QSM 
can assist here. But lets keep it general for now.

> I wouldn't call it a trick.
> It's reasonable to imagine that your state-machine framework
> can do something (or can be modified to do something) like
> this:
>
>     myStateMachine.state = stateC;

In general such a call would be against any finite state machine 
structure, right? For safety I would set this method as a very rare used 
friend method in order to prevent misuse.


> So, schematically, your code might look something like this:
>
>     if (normalMode) {
>        startEventLoop();
>     }
>     else if (recoveryMode) {
>        myStateMachine.state = stateC;
>        startEventLoop();
>     }
>
> If your state-machine framework won't let you do this, or if you
> prefer to live within the formal approach of events and transitions,
> then you could add some helper events and transitions to your
> state machine.  Let's say that your state machine gets initialized
> to startState.  Then you could add:
>
>        event      transition
>
>        goToA:   startState --> stateA
>        goToB:   startState --> stateB
>        goToC:   startState --> stateC
>        goToD:   startState --> stateD
>
> Then at startup, if you're in recovery mode, you would do
> something like;
>
>     myStateMachine.postEvent (goToC);
>
> (But I would probably consider this overkill, and just
> implement making "myStateMachine.state = stateC;"
> work.)

Well, in general I would consider working with this approach and 
automatically adding those transitions between the start state and all 
other states. QTransition could be derived to QRecoveryTransition that 
throws only if a QRecoveryEvent is posted.
But then we would need to keep some kind of a reference to the current 
state within the state machine. And I saw no opportunity to address the 
current state in QSM. Automatically adding a unique ID might help here...

But as my intention is to use this approach in a work flow driven 
application that takes care of building up a set of data I also will 
have to take care of keeping data and state machine consistent.
If some data would be lost but the state machine is recovered to a later 
state then we would end up in an inconsistent state! So recovering any 
state without check of data is critical.

So my current approach is to recover the data and set up a special 
QRecoveryState/-Transition connection with guards on data elements that 
once an QRecoveryEvent is posted automatically goes all the way to the 
right state.

Would that be a considerable approach?

Great discussion!

Best Regards,
Ingmar




More information about the Interest mailing list