[sheepdog] [PATCH 2/4] sheep: fix finish_object_list()
Liu Yuan
namei.unix at gmail.com
Sat Jun 2 22:25:20 CEST 2012
From: Liu Yuan <tailai.ly at taobao.com>
if it jumps out of prepare_object_list() with next_rw set, we should really
run_next_rw() instead of starting recovery phase.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/recovery.c | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/sheep/recovery.c b/sheep/recovery.c
index eefcf3e..a2999f5 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -337,18 +337,23 @@ static void free_recovery_work(struct recovery_work *rw)
free(rw);
}
+static inline void run_next_rw(struct recovery_work *rw)
+{
+ free_recovery_work(rw);
+ rw = next_rw;
+ next_rw = NULL;
+ recovering_work = rw;
+ flush_wait_obj_requests();
+ queue_work(sys->recovery_wqueue, &rw->work);
+ dprintf("recovery work is superseded\n");
+}
+
static void recover_object_main(struct work *work)
{
struct recovery_work *rw = container_of(work, struct recovery_work,
work);
if (next_rw) {
- free_recovery_work(rw);
- rw = next_rw;
- next_rw = NULL;
- recovering_work = rw;
- flush_wait_obj_requests();
- queue_work(sys->recovery_wqueue, &rw->work);
- dprintf("recovery work is superseded\n");
+ run_next_rw(rw);
return;
}
@@ -390,6 +395,10 @@ static void finish_object_list(struct work *work)
struct recovery_work *rw = container_of(work, struct recovery_work,
work);
rw->state = RW_RUN;
+ if (next_rw) {
+ run_next_rw(rw);
+ return;
+ }
/*
* We have got the object list to be recovered locally, most of
* objects are actually already being there, so let's resume
--
1.7.10.2
More information about the sheepdog
mailing list