On Feb 7, 2008, at 10:46 AM, Walter B. Ligon III wrote:

Sam,

I've been looking more closely at the state machine stuff in prep for the stuff we're working on and I have some questions about the mods you made wrt the the quicklist. I just want to be sure I understand things right.

In the original implementation there was both a stack point and a base point for the frame stack - that doesn't seem to be there any more. Thus, whenever someone retrieves frame(0) they get the top of stack - is that right? This is a bit of a problem, because when we finish the child state machines we want to get to the original frame during cleanup. Originally I envisioned this being usable both for parallel state machines and nested state machines - but I'm not sure we need that.

So one thing I could do is provide a pointer to the "Base" frame in the SMCB, with a distinct function to retrieve that, or we could modify the existing function to get frame(-1) - moving backwards on the list (and assume the other end of the list is always the base) or I could reimplement a more complex base pointer scheme.

I'm generally loath to increase the complexity if we don't need it. The only reason to have a complete base pointer scheme would be to have multiple nested instances where you need to get at a base frame. This isn't needed for parallel state machines, because each new state machine gets a new SMCB, but if we wanted to use this for nested SMs, we'd need it.

Let me give an example. Suppose on the server I get a request, and I want to implement that request with server-to-server methods. Suppose then, in order to implement that function I want to run a CLIENT state machine. In such a case I could push a client frame, and then jump to s a client state machine (in theory). The trick is, when I return I need to return to my original frame. This can be done with the current system, if I know that the original frame is directly above the previous. On the other hand, if I want to create N parallel state machines, where N is determined by information in a request (access from the current frame) when I return from the state machines I don't know how many frames to pop to get back to the original. I could create a specific pointer in the SMCB, but this would mess up the nested case - because I can't have a general nested case with a distinct pointer.

I didn't add a base pointer because I assumed that the machine pushing all the nested state machines onto the frame stack would know how many it pushed, and so therefore know how many to pop off. If you don't want to keep track of that, you technically don't need a base pointer -- its trivial to get the last entry out of the quicklist using the prev pointer.

In the previous implementation, the stack frame was a static array of 8 frames. The reason I changed the frame stack from an array to a list was to allow for more than 8 frames to be pushed -- I was using the parallel state machine concept to push one nested machine for each request to each server, so all I needed was more than 8 servers to run into problems.



One way out is never do this with nested machines, but just create a single "parallel" machine when I want to change frames.

I think the new code isn't all that much different from the way you had it. I changed it because of the need for an unlimited number of nested parallel state machines to be run, but expected its intended use to be the same as before.



I hope this makes some sense.

The second problem is when we go to start the child frames, it appears we start a new state machine for every frame in the list, but at least one of those frames is the original frame, not a child frame, so again, there is an issue. In original implementation we only started SMs for frames above the base frame.

There's a specific check in the PINT_sm_start_child_frames code that prevents this, and I'm using the pjmp to start nested state machines a bunch without the parent being started as you describe. Can you send me your code?



So, I think there are several ways to patch this up, but first I want to be sure I'm not missing something - and second see if you have any thoughts about whether certain scenarios are significant such that we might need a more general nesting solution, versus a simpler one.

I'm happy with the way things are at the moment, but maybe I'm the one that's missing something. A good set of example state machines with pjmps in place would probably help flush out all the potential different uses that we both have.

-sam



Walt
--
Dr. Walter B. Ligon III
Associate Professor
ECE Department
Clemson University


_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers

Reply via email to