<div dir="ltr"><div>Epoch won't increase if there are only gateway nodes in the cluster.</div><div>In this way, when the cluster restarts, it will always recovery from a latest epoch version which has at least one non-gateway node in the cluster.</div><div>This patch fixes bug "data wipe bug in the recovery" described here:</div><div>        <a href="https://bugs.launchpad.net/sheepdog-project/+bug/1327037">https://bugs.launchpad.net/sheepdog-project/+bug/1327037</a></div><div><br></div><div>        modified:   sheep/store.c</div><div>Reported by:Xiaolong Xu <<a href="mailto:nxtxiaolong@gmail.com">nxtxiaolong@gmail.com</a>>; Yang Zhang <<a href="mailto:zhangyangdreamer@gmail.com">zhangyangdreamer@gmail.com</a>></div><div>---</div><div> sheep/store.c | 14 ++++++++++----</div><div> 1 file changed, 10 insertions(+), 4 deletions(-)</div><div><br></div><div>diff --git a/sheep/store.c b/sheep/store.c</div><div>index 8843fb8..ca16284 100644</div><div>--- a/sheep/store.c</div><div>+++ b/sheep/store.c</div><div>@@ -19,9 +19,10 @@ LIST_HEAD(store_drivers);</div><div><br></div><div> int update_epoch_log(uint32_t epoch, struct sd_node *nodes, size_t nr_nodes)</div><div> {</div><div>-       int ret, len, nodes_len;</div><div>+       int ret = 0, len, nodes_len;</div><div>        time_t t;</div><div>        char path[PATH_MAX], *buf;</div><div>+       bool all_gateway = true;</div><div><br></div><div>        sd_debug("update epoch: %d, %zu", epoch, nr_nodes);</div><div><br></div><div>@@ -37,14 +38,19 @@ int update_epoch_log(uint32_t epoch, struct sd_node *nodes, size_t nr_nodes)</div><div>         * rb field is unused in epoch file, zero-filling it</div><div>         * is good for epoch file recovery because it is unified</div><div>         */</div><div>-       for (int i = 0; i < nr_nodes; i++)</div><div>+       for (int i = 0; i < nr_nodes; i++){</div><div>+               if((nodes + i)->nr_vnodes){</div><div>+                       all_gateway = false;</div><div>+               }</div><div>                memset(buf + i * sizeof(struct sd_node)</div><div>                                + offsetof(struct sd_node, rb),</div><div>                                0, sizeof(struct rb_node));</div><div>+       }</div><div><br></div><div>        snprintf(path, sizeof(path), "%s%08u", epoch_path, epoch);</div><div>-</div><div>-       ret = atomic_create_and_write(path, buf, len, true);</div><div>+       if(!all_gateway){</div><div>+               ret = atomic_create_and_write(path, buf, len, true);</div><div>+       }</div><div><br></div><div>        free(buf);</div><div>        return ret;</div><div>-- </div><div>1.9.1</div></div>