Actually, that logic would stay pretty much the same - all it really does is change the op code and reset the current_state for the proper state machine based on the request - which is exactly what is needed.

I'm not entirely sure what changes I want to make yet, but yeah, that's one idea. Right now I'm trying to consolidate and clean up the SM as much as I can, with eye towards making opaque to the rest of the code and ass much as I can do within the server and client with as little interface, the better. I want those codes to have a little to do with actually making the SM run as possible, so the more I can make things work with fewer exceptions, the better.

It looks to me like I can make what we have there work just fine with considerably less gunk. I have yet to dig into the client to see if I can pull it into line too.

Thanks!

Walt

Phil Carns wrote:
I _think_ that would work- you would just need to take out the special logic after the job_testcontext() call in pvfs2-server.c that currently prevents unexpected jobs from getting to the point that they trigger state transitions. Chances are there are some other little details, but I wouldn't expect any show stoppers. The unexpected messages behave like any other job at that level.

Are you thinking of doing something where you start some generic state machines that branch off later according to the request type that was received?

-Phil

Walt Ligon wrote:

Phil, in the server, what would you think about creating a SM with one state that just calls job_bmi_unexpected and mapping an unexpected recv to that SM?

Any reason that would mess things up?

Walt

Walt Ligon wrote:

Uh, I'm confused ... "name of the state or eror code" ... do you mean in the jump table, record the name of the state you are jumping to and the state action return code that indicated it?

Yeah, I don't see why not. Ading something to the union is a no-brainer. Ading stuf to the state structure is more complicated. I think once its converted to a set of structures it should be easy enough, but right now it makes things uglier. Maybe we need a -g option on the statecomp (;->) so we can compile it in or out???

OK, I'l file this under todo after the concurent stuf, but don't let mee forget.

Walt

Sam Lang wrote:


Hi Walt,

I like the state machine debug mode that shows the status and error code. That makes debugging errors quite a bit easier. This might be feature creep, but I guess the next step is to print the name of the state or error code instead of the number. Is that easy to change in the statecomp code? I know all the status codes are defined in the .sm, but I'm not sure if the parser keeps track of them. It would be one more thing to add to the union as well :-).

-sam

Begin forwarded message:

From: CVS commit program <[EMAIL PROTECTED]>
Date: July 16, 2006 4:42:58 PM CDT
To: [EMAIL PROTECTED]
Subject: [Pvfs2-cvs] commit by walt in pvfs2-1/src/common/misc: module.mk.in msgpairarray.sm state-machine.h
Reply-To: [EMAIL PROTECTED]

Update of /projects/cvsroot/pvfs2-1/src/common/misc
In directory parlweb1:/tmp/cvs-serv4099/src/common/misc

Modified Files:
      Tag: WALT3
    module.mk.in msgpairarray.sm state-machine.h
Log Message:
Everything compiles.   Crap!  Now I have to see if it runs!!!


Index: module.mk.in
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/common/misc/module.mk.in,v
diff -p -u -r1.26.10.1 -r1.26.10.2
--- module.mk.in    12 Jul 2006 20:17:48 -0000    1.26.10.1
+++ module.mk.in    16 Jul 2006 21:42:57 -0000    1.26.10.2
@@ -11,8 +11,8 @@ LIBSRC += $(DIR)/server-config.c \
       $(DIR)/pint-perf-counter.c \
       $(DIR)/pint-event.c \
       $(DIR)/pint-cached-config.c \
-      $(DIR)/msgpairarray.c \
       $(DIR)/pint-util.c \
+      $(DIR)/msgpairarray.c \
       $(DIR)/realpath.c \
       $(DIR)/tcache.c \
       $(DIR)/state-machine-fns.c
@@ -26,7 +26,6 @@ SERVERSRC += $(DIR)/server-config.c \
          $(DIR)/pint-perf-counter.c \
          $(DIR)/pint-event.c \
          $(DIR)/pint-cached-config.c \
-         $(DIR)/msgpairarray.c \
          $(DIR)/pint-util.c \
          $(DIR)/tcache.c \
           $(DIR)/state-machine-fns.c

Index: msgpairarray.sm
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/common/misc/msgpairarray.sm,v
diff -p -u -r1.35 -r1.35.4.1
--- msgpairarray.sm    30 May 2006 22:34:06 -0000    1.35
+++ msgpairarray.sm    16 Jul 2006 21:42:57 -0000    1.35.4.1
@@ -51,16 +51,16 @@ enum
     MSGPAIRS_RETRY = 191
 };

-static int msgpairarray_init(
-    PARENT_SM *sm_p, job_status_s *js_p);
-static int msgpairarray_post(
-    PARENT_SM *sm_p, job_status_s *js_p);
-static int msgpairarray_post_retry(
-    PARENT_SM *sm_p, job_status_s *js_p);
-static int msgpairarray_complete(
-    PARENT_SM *sm_p, job_status_s *js_p);
-static int msgpairarray_completion_fn(
-    PARENT_SM *sm_p, job_status_s *js_p);
+static PINT_sm_action  msgpairarray_init(
+        struct PINT_smcb *smcp, job_status_s *js_p);
+static PINT_sm_action  msgpairarray_post(
+        struct PINT_smcb *smcp, job_status_s *js_p);
+static PINT_sm_action  msgpairarray_post_retry(
+        struct PINT_smcb *smcp, job_status_s *js_p);
+static PINT_sm_action  msgpairarray_complete(
+        struct PINT_smcb *smcp, job_status_s *js_p);
+static PINT_sm_action  msgpairarray_completion_fn(
+        struct PINT_smcb *smcp, job_status_s *js_p);

 %%

@@ -107,14 +107,15 @@ nested machine pvfs2_msgpairarray_sm(

 %%

-static int msgpairarray_init(PARENT_SM *sm_p,
-                             job_status_s *js_p)
+static PINT_sm_action msgpairarray_init(
+        struct PINT_smcb *smcb, job_status_s *js_p)
 {
+ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
     int i = 0;
     PINT_sm_msgpair_state *msg_p = NULL;

gossip_debug(GOSSIP_MSGPAIR_DEBUG, "(%p) msgpairarray state: init "
-                 "(%d msgpair(s))\n", sm_p, sm_p->msgarray_count);
+                 "(%d msgpair(s))\n", smcb, sm_p->msgarray_count);

     assert(sm_p->msgarray_count > 0);

@@ -135,7 +136,7 @@ static int msgpairarray_init(PARENT_SM *
         msg_p->retry_count = 0;
         msg_p->complete = 0;
     }
-    return 1;
+    return SM_ACTION_COMPLETE;
 }

 /* msgpairarray_post()
@@ -156,9 +157,10 @@ static int msgpairarray_init(PARENT_SM *
  * (7) stores job ids for later matching
  *
  */
-static int msgpairarray_post(PARENT_SM *sm_p,
-                             job_status_s *js_p)
+static PINT_sm_action msgpairarray_post(
+        struct PINT_smcb *smcb, job_status_s *js_p)
 {
+ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
     int ret = -PVFS_EINVAL, i = 0, tmp = 0;
     struct server_configuration_s *server_config = NULL;
     PVFS_msg_tag_t session_tag;
@@ -170,7 +172,7 @@ static int msgpairarray_post(PARENT_SM *

     gossip_debug(
         GOSSIP_MSGPAIR_DEBUG, "%s: sm %p "
-        "%d total message(s) with %d incomplete\n", __func__, sm_p,
+        "%d total message(s) with %d incomplete\n", __func__, smcb,
         sm_p->msgarray_count * 2, num_incomplete_msgpairs * 2);

     js_p->error_code = 0;
@@ -244,7 +246,7 @@ static int msgpairarray_post(PARENT_SM *
                 }
gossip_lerr("msgpairarray_post: PINT_encode failed\n");
                 js_p->error_code = ret;
-                return 1;
+                return SM_ACTION_COMPLETE;
             }

             /* calculate max response msg size and allocate space */
@@ -257,7 +259,7 @@ static int msgpairarray_post(PARENT_SM *
             if (msg_p->encoded_resp_p == NULL)
             {
                 js_p->error_code = -PVFS_ENOMEM;
-                return 1;
+                return SM_ACTION_COMPLETE;
             }
             local_enc_and_alloc = 1;
         }
@@ -265,7 +267,7 @@ static int msgpairarray_post(PARENT_SM *
         session_tag = PINT_util_get_next_tag();

         gossip_debug(GOSSIP_MSGPAIR_DEBUG, "%s: sm %p msgpair %d: "
-                     "posting recv\n", __func__, sm_p, i);
+                     "posting recv\n", __func__, smcb, i);

         /* post receive of response; job_id stored in recv_id */
         ret = job_bmi_recv(msg_p->svr_addr,
@@ -273,7 +275,7 @@ static int msgpairarray_post(PARENT_SM *
                            msg_p->max_resp_sz,
                            session_tag,
                            BMI_PRE_ALLOC,
-                           sm_p,
+                           smcb,
                            i,
                            &msg_p->recv_status,
                            &msg_p->recv_id,
@@ -334,7 +336,7 @@ static int msgpairarray_post(PARENT_SM *
         assert(ret == 0);

         gossip_debug(GOSSIP_MSGPAIR_DEBUG, "%s: sm %p msgpair %d: "
-                     "posting send\n", __func__, sm_p, i);
+                     "posting send\n", __func__, smcb, i);

         /* post send of request; job_id stored in send_id */
         ret = job_bmi_send_list(msg_p->encoded_req.dest,
@@ -345,7 +347,7 @@ static int msgpairarray_post(PARENT_SM *
                                 session_tag,
                                 msg_p->encoded_req.buffer_type,
                                 1,
-                                sm_p,
+                                smcb,
                                 sm_p->msgarray_count+i,
                                 &msg_p->send_status,
                                 &msg_p->send_id,
@@ -392,35 +394,37 @@ static int msgpairarray_post(PARENT_SM *
          * cases); jump straight to final completion function.
          */
          js_p->error_code = MSGPAIRS_COMPLETE;
-         return 1;
+         return SM_ACTION_COMPLETE;
     }

     /* we are still waiting on operations to complete, next state
      * transition will handle them
      */
-    return 0;
+    return SM_ACTION_DEFERED;
 }

-static int msgpairarray_post_retry(PARENT_SM *sm_p,
-                                   job_status_s *js_p)
+static PINT_sm_action msgpairarray_post_retry(
+        struct PINT_smcb *smcb, job_status_s *js_p)
 {
+ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
     job_id_t tmp_id;

     gossip_debug(GOSSIP_MSGPAIR_DEBUG, "%s: sm %p, wait %d ms\n",
-      __func__, sm_p, sm_p->msgarray_params.retry_delay);
+      __func__, smcb, sm_p->msgarray_params.retry_delay);

     return job_req_sched_post_timer(
         sm_p->msgarray_params.retry_delay,
-        sm_p, 0, js_p, &tmp_id,
+        smcb, 0, js_p, &tmp_id,
         sm_p->msgarray_params.job_context);
 }

-static int msgpairarray_complete(PARENT_SM *sm_p,
-                                 job_status_s *js_p)
+static PINT_sm_action msgpairarray_complete(
+        struct PINT_smcb *smcb, job_status_s *js_p)
 {
+ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
     gossip_debug(GOSSIP_MSGPAIR_DEBUG,
       "%s: sm %p status_user_tag %d msgarray_count %d\n",
- __func__, sm_p, (int) js_p->status_user_tag, sm_p->msgarray_count); + __func__, smcb, (int) js_p->status_user_tag, sm_p->msgarray_count);


     /* match operation with something in the msgpair array */
@@ -471,7 +475,7 @@ static int msgpairarray_complete(PARENT_
     /* decrement comp_ct until all operations have completed */
     if (--sm_p->msgarray_params.comp_ct > 0)
     {
-        return 0;
+        return SM_ACTION_DEFERED;
     }

     assert(sm_p->msgarray_params.comp_ct == 0);
@@ -479,12 +483,13 @@ static int msgpairarray_complete(PARENT_
                  "  msgpairarray: all operations complete\n");

     js_p->error_code = MSGPAIRS_COMPLETE;
-    return 1;
+    return SM_ACTION_COMPLETE;
 }

-static int msgpairarray_completion_fn(PARENT_SM *sm_p,
-                                      job_status_s *js_p)
+static PINT_sm_action msgpairarray_completion_fn(
+        struct PINT_smcb *smcb, job_status_s *js_p)
 {
+ struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
     int ret = -PVFS_EINVAL, i = 0;
     int need_retry = 0;
     struct PINT_decoded_msg decoded_resp;
@@ -498,7 +503,7 @@ static int msgpairarray_completion_fn(PA
     js_p->error_code = 0;

     gossip_debug(GOSSIP_MSGPAIR_DEBUG, "(%p) msgpairarray state: "
-                 "completion_fn\n", sm_p);
+                 "completion_fn\n", smcb);

     for (i = 0; i < sm_p->msgarray_count; i++)
     {
@@ -551,7 +556,7 @@ static int msgpairarray_completion_fn(PA
              * a per message pair basis.  Also store some non-zero
              * (failure) value in js_p->error_code if we see one.
              */
-            msg_p->op_status = msg_p->comp_fn(sm_p, resp_p, i);
+            msg_p->op_status = msg_p->comp_fn(smcb, resp_p, i);
             if (msg_p->op_status != 0)
             {
                 js_p->error_code = msg_p->op_status;
@@ -588,7 +593,7 @@ static int msgpairarray_completion_fn(PA
         {
PVFS_perror_gossip("Failed to free msgpair resources", ret);
             js_p->error_code = ret;
-            return 1;
+            return SM_ACTION_COMPLETE;
         }

         msg_p->encoded_resp_p = NULL;
@@ -601,7 +606,7 @@ static int msgpairarray_completion_fn(PA
         msg_p->complete = 1;

         gossip_debug(GOSSIP_MSGPAIR_DEBUG, "%s: sm %p msgpair %d "
-                     "marked complete\n", __func__, sm_p, i);
+                     "marked complete\n", __func__, smcb, i);
     }

     if (need_retry) {
@@ -665,7 +670,7 @@ static int msgpairarray_completion_fn(PA

         }
     }
-    return 1;
+    return SM_ACTION_COMPLETE;
 }

/*********************************************************************

Index: state-machine.h
===================================================================
RCS file: /projects/cvsroot/pvfs2-1/src/common/misc/state-machine.h,v
diff -p -u -r1.12.4.6 -r1.12.4.7
--- state-machine.h    15 Jul 2006 17:06:07 -0000    1.12.4.6
+++ state-machine.h    16 Jul 2006 21:42:57 -0000    1.12.4.7
@@ -9,6 +9,7 @@

 #include <state-machine-values.h>
 #include "job.h"
+#include "msgpairarray.h"

 /* STATE-MACHINE.H
  *

_______________________________________________
Pvfs2-cvs mailing list
[EMAIL PROTECTED]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-cvs


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

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

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

Reply via email to