When there are many stale objects, farm_end_recover() could issue a
lot of I/Os to move the objects from the working directory to the
backend store.  We should call the function in the worker thread to
avoid sleeping long time in the main thread.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 sheep/recovery.c |   28 +++++++++++++++++++++++-----
 1 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/sheep/recovery.c b/sheep/recovery.c
index 5164aa7..c839b2b 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -337,20 +337,38 @@ 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)
+static void finish_recovery_work(struct work *work)
 {
-       recovering_work = NULL;
-       sys->recovered_epoch = rw->epoch;
-
+       struct recovery_work *rw = container_of(work, struct recovery_work,
+                                               work);
        if (sd_store->end_recover)
                sd_store->end_recover(sys->epoch - 1, rw->old_vinfo);
+}
 
-       free_recovery_work(rw);
+static void finish_recovery_main(struct work *work)
+{
+       struct recovery_work *rw = container_of(work, struct recovery_work,
+                                               work);
+       recovering_work = NULL;
+
+       sys->recovered_epoch = rw->epoch;
+
+       if (next_rw)
+               run_next_rw(rw);
+       else
+               free_recovery_work(rw);
 
        dprintf("recovery complete: new epoch %"PRIu32"\n",
                sys->recovered_epoch);
 }
 
+static void finish_recovery(struct recovery_work *rw)
+{
+       rw->work.fn = finish_recovery_work;
+       rw->work.done = finish_recovery_main;;
+       queue_work(sys->recovery_wqueue, &rw->work);
+}
+
 static inline bool oid_in_prio_oids(struct recovery_work *rw, uint64_t oid)
 {
        int i;
-- 
1.7.2.5

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

Reply via email to