Probably reaching for straws but could you print "path", just to confirm it's what you know it is?

Patrick

On 04/12/2010 02:53 PM, Kevin Webb wrote:
On Mon, 12 Apr 2010 14:33:44 -0700
Mahadev Konar<maha...@yahoo-inc.com>  wrote:

Hi Kevin,

  Thanks for the info. Could you cut and paste the code you are using
that prints the view info?
That would help. We can then create a jira and follow up on that.

Also, a zookeeper client can never go back in time (even if its gets
disconnected and connected back to another server).

Thanks
mahadev

Ah, sorry, I meant to include that last time.

This is the function I use to read the cversion:

static int32_t read_path_cversion(zhandle_t *zkhandle, const char
*path) {
     struct Stat stat;
     int zoo_result;

     memset(&stat, 0, sizeof(struct Stat));

     zoo_result = zoo_exists(zkhandle, path, 0,&stat);

     if (zoo_result != ZOK) {
         return -1;
     }

     return stat.cversion;
}

It gets called by this function, which is called whenever the client
(re)connects to the server or when the watch on the group node gets
triggered:

static int process_membership_change(zhandle_t *zkhandle, zk_comm_t
*context, const char *path) {
     struct String_vector children;
     int32_t view_before = 0;
     int32_t view_after = view_before + 1;
     int zoo_result = 0;
     int i;

     while (view_before != view_after) {
         view_before = read_path_cversion(zkhandle, path);

         zoo_result = zoo_get_children(zkhandle, path, 1,&children);
         if (zoo_result != ZOK) {
             return zoo_result;
         }

         view_after = read_path_cversion(zkhandle, path);
     }

     printlog(LOG_CRITICAL, "ZK(%" PRIu32 "): %u Beginning new view #%"
PRId32 ".  Unsetting panic...\n", context->comm->id, time(NULL),
view_after);

     (call application function to restart with group #view_after)

     ...
     More application logic
     ...
}

Let me know if any other details would be helpful.

-Kevin

Reply via email to