From: Liu Yuan <[email protected]>

When prepare_object_list() gets an empty list, we should directly call
finish_recovery() or oid = 0 will be recovered. Though this does no harm
just wasting cpu cycles, we should avoid it completely.

Signed-off-by: Liu Yuan <[email protected]>
---
 sheep/recovery.c |   33 +++++++++++++++++++++------------
 1 file changed, 21 insertions(+), 12 deletions(-)

diff --git a/sheep/recovery.c b/sheep/recovery.c
index c3d1d4d..591c5d1 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -353,6 +353,21 @@ static inline void run_next_rw(struct recovery_work *rw)
        dprintf("recovery work is superseded\n");
 }
 
+static inline void finish_recovery(struct recovery_work *rw)
+{
+       recovering_work = NULL;
+       sys->recovered_epoch = rw->epoch;
+       free_recovery_work(rw);
+
+       if (sd_store->end_recover) {
+               struct siocb iocb = { 0 };
+               iocb.epoch = sys->epoch;
+               sd_store->end_recover(&iocb);
+       }
+       dprintf("recovery complete: new epoch %"PRIu32"\n",
+               sys->recovered_epoch);
+}
+
 static void recover_object_main(struct work *work)
 {
        struct recovery_work *rw = container_of(work, struct recovery_work,
@@ -378,22 +393,12 @@ static void recover_object_main(struct work *work)
        resume_wait_obj_requests(rw->oids[rw->done++]);
 
        if (rw->done < rw->count) {
-               /* Requeue the work */
+               /* Try recover next object */
                queue_work(sys->recovery_wqueue, &rw->work);
                return;
        }
 
-       recovering_work = NULL;
-       sys->recovered_epoch = rw->epoch;
-       free_recovery_work(rw);
-
-       if (sd_store->end_recover) {
-               struct siocb iocb = { 0 };
-               iocb.epoch = sys->epoch;
-               sd_store->end_recover(&iocb);
-       }
-       dprintf("recovery complete: new epoch %"PRIu32"\n",
-               sys->recovered_epoch);
+       finish_recovery(rw);
 }
 
 static void finish_object_list(struct work *work)
@@ -405,6 +410,10 @@ static void finish_object_list(struct work *work)
                run_next_rw(rw);
                return;
        }
+       if (!rw->count) {
+               finish_recovery(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

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

Reply via email to