Signed-off-by: Yunkai Zhang <[email protected]>
---
 sheep/cluster/zookeeper.c |   34 ++++++++++++++++++++++++++--------
 1 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/sheep/cluster/zookeeper.c b/sheep/cluster/zookeeper.c
index c2592d2..6f53ac4 100644
--- a/sheep/cluster/zookeeper.c
+++ b/sheep/cluster/zookeeper.c
@@ -268,23 +268,41 @@ static enum cluster_join_result (*zk_check_join_cb)(
 /* get node list from the last pushed data */
 static size_t get_nodes(zhandle_t *zh, struct sd_node *nodes)
 {
-       int rc, len;
+       int rc, len, pos;
        struct zk_event ev;
-       struct String_vector strs;
-       char path[256], max[256] = "";
+       char path[256];
 
-       FOR_EACH_ZNODE(zh, QUEUE_ZNODE, path, &strs) {
-               if (strcmp(max, path) < 0)
-                       strcpy(max, path);
+       zk_lock(zh);
+
+       if (queue_pos>0) 
+               pos = queue_pos -1;
+       else 
+               pos = 0;
+
+       for (;;) {
+               sprintf(path, QUEUE_ZNODE "/%010d", pos);
+               dprintf("feach path:%s\n", path);
+               rc = zoo_exists(zh, path, 0, NULL);
+
+               if (rc != ZOK){
+                       break;
+               }
+               pos++;
        }
 
-       if (max[0] == '\0')
+       /* nothing to be found */
+       if (pos == 0 || pos < queue_pos){
+               zk_unlock(zh);
                return 0;
+       }
 
        len = sizeof(ev);
-       rc = zoo_get(zh, max, 1, (char *)&ev, &len, NULL);
+       sprintf(path, QUEUE_ZNODE "/%010d", --pos);
+       rc = zoo_get(zh, path, 1, (char *)&ev, &len, NULL);
        assert(rc == ZOK);
 
+       zk_unlock(zh);
+
        memcpy(nodes, ev.nodes, sizeof(ev.nodes));
 
        return ev.nr_nodes;
-- 
1.7.7.6

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to