We cannot call get_vnode_info() in epoch_log_read_remote() (in the
worker thread).  We already have the current vnode info, so let's use
it.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 sheep/group.c      | 10 ++++------
 sheep/ops.c        | 14 ++++++++++----
 sheep/recovery.c   |  2 +-
 sheep/sheep_priv.h |  5 +++--
 4 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/sheep/group.c b/sheep/group.c
index c4c1969..60e2860 100644
--- a/sheep/group.c
+++ b/sheep/group.c
@@ -186,7 +186,8 @@ static struct vnode_info *alloc_vnode_info(const struct 
sd_node *nodes,
        return vnode_info;
 }
 
-struct vnode_info *get_vnode_info_epoch(uint32_t epoch)
+struct vnode_info *get_vnode_info_epoch(uint32_t epoch,
+                                       struct vnode_info *cur_vinfo)
 {
        struct sd_node nodes[SD_MAX_NODES];
        int nr_nodes;
@@ -194,7 +195,7 @@ struct vnode_info *get_vnode_info_epoch(uint32_t epoch)
        nr_nodes = epoch_log_read(epoch, nodes, sizeof(nodes));
        if (nr_nodes < 0) {
                nr_nodes = epoch_log_read_remote(epoch, nodes, sizeof(nodes),
-                                               NULL);
+                                                NULL, cur_vinfo);
                if (nr_nodes == 0)
                        return NULL;
        }
@@ -457,10 +458,9 @@ static void clear_exceptional_node_lists(void)
 }
 
 int epoch_log_read_remote(uint32_t epoch, struct sd_node *nodes, int len,
-                       time_t *timestamp)
+                         time_t *timestamp, struct vnode_info *vinfo)
 {
        int i, nr, ret;
-       struct vnode_info *vinfo = get_vnode_info();
        char buf[SD_MAX_NODES * sizeof(struct sd_node) + sizeof(time_t)];
 
        nr = vinfo->nr_nodes;
@@ -490,7 +490,6 @@ int epoch_log_read_remote(uint32_t epoch, struct sd_node 
*nodes, int len,
                if (timestamp)
                        memcpy(timestamp, buf + nodes_len, sizeof(timestamp));
 
-               put_vnode_info(vinfo);
                return nodes_len / sizeof(struct sd_node);
        }
 
@@ -498,7 +497,6 @@ int epoch_log_read_remote(uint32_t epoch, struct sd_node 
*nodes, int len,
         * If no node has targeted epoch log, return 0 here to at least
         * allow reading older epoch logs.
         */
-       put_vnode_info(vinfo);
        return 0;
 }
 
diff --git a/sheep/ops.c b/sheep/ops.c
index bf565fb..a6494b7 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -406,6 +406,11 @@ static int local_stat_cluster(struct request *req)
        int i, max_logs;
        uint32_t epoch;
 
+       if (req->vinfo == NULL) {
+               sd_dprintf("cluster is not started up");
+               goto out;
+       }
+
        max_logs = req->rq.data_length / sizeof(*log);
        epoch = get_latest_epoch();
        for (i = 0; i < max_logs; i++) {
@@ -422,14 +427,15 @@ static int local_stat_cluster(struct request *req)
                if (log->nr_nodes == -1)
                        log->nr_nodes = epoch_log_read_remote(epoch, log->nodes,
                                                        sizeof(log->nodes),
-                                                       (time_t *)&log->time);
+                                                       (time_t *)&log->time,
+                                                       req->vinfo);
 
                log->nr_copies = sys->nr_copies;
 
                rsp->data_length += sizeof(*log);
                epoch--;
        }
-
+out:
        switch (sys->status) {
        case SD_STATUS_OK:
                return SD_RES_SUCCESS;
@@ -505,7 +511,8 @@ static int cluster_force_recover(const struct sd_req *req, 
struct sd_rsp *rsp,
        sys->nr_copies = c;
        sys->flags = f;
 
-       old_vnode_info = get_vnode_info_epoch(sys->epoch);
+       vnode_info = get_vnode_info();
+       old_vnode_info = get_vnode_info_epoch(sys->epoch, vnode_info);
        if (!old_vnode_info) {
                sd_printf(SDOG_EMERG, "cannot get vnode info for epoch %d",
                          sys->epoch);
@@ -524,7 +531,6 @@ static int cluster_force_recover(const struct sd_req *req, 
struct sd_rsp *rsp,
        else
                sys->status = SD_STATUS_HALT;
 
-       vnode_info = get_vnode_info();
        start_recovery(vnode_info, old_vnode_info);
        put_vnode_info(vnode_info);
        put_vnode_info(old_vnode_info);
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 57ea38a..23babe0 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -180,7 +180,7 @@ rollback:
                        goto err;
                }
 
-               new_old = get_vnode_info_epoch(tgt_epoch);
+               new_old = get_vnode_info_epoch(tgt_epoch, rw->cur_vinfo);
                if (!new_old)
                        /* We rollback in case we don't get a valid epoch */
                        goto rollback;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 155f584..7722473 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -274,7 +274,8 @@ bool have_enough_zones(void);
 struct vnode_info *grab_vnode_info(struct vnode_info *vnode_info);
 struct vnode_info *get_vnode_info(void);
 void put_vnode_info(struct vnode_info *vinfo);
-struct vnode_info *get_vnode_info_epoch(uint32_t epoch);
+struct vnode_info *get_vnode_info_epoch(uint32_t epoch,
+                                       struct vnode_info *cur_vinfo);
 void wait_get_vdis_done(void);
 
 int get_nr_copies(struct vnode_info *vnode_info);
@@ -310,7 +311,7 @@ int epoch_log_read(uint32_t epoch, struct sd_node *nodes, 
int len);
 int epoch_log_read_with_timestamp(uint32_t epoch, struct sd_node *nodes,
                                int len, time_t *timestamp);
 int epoch_log_read_remote(uint32_t epoch, struct sd_node *nodes, int len,
-                       time_t *timestamp);
+                         time_t *timestamp, struct vnode_info *vinfo);
 uint32_t get_latest_epoch(void);
 void init_config_path(const char *base_path);
 int init_config_file(void);
-- 
1.8.1.3.566.gaa39828

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

Reply via email to