]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: small improvements for TaskFinisher
authorMykola Golub <mgolub@suse.com>
Thu, 9 Apr 2020 16:43:21 +0000 (17:43 +0100)
committerMykola Golub <mgolub@suse.com>
Mon, 4 May 2020 12:42:12 +0000 (13:42 +0100)
1) cancel: make return success status
2) queue: allow to pass return value
3) add method to reschedule event

Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/TaskFinisher.h

index 76d41e6e5102be8b579bac102a5bd9ef0320bc61..a791e786ff157afd8dc2d7dd50315916e901c8b5 100644 (file)
@@ -51,14 +51,17 @@ public:
     m_finisher = singleton.m_finisher;
   }
 
-  void cancel(const Task& task) {
+  bool cancel(const Task& task) {
     std::lock_guard l{*m_lock};
     typename TaskContexts::iterator it = m_task_contexts.find(task);
-    if (it != m_task_contexts.end()) {
-      delete it->second.first;
-      m_safe_timer->cancel_event(it->second.second);
-      m_task_contexts.erase(it);
+    if (it == m_task_contexts.end()) {
+      return false;
     }
+    delete it->second.first;
+    bool canceled = m_safe_timer->cancel_event(it->second.second);
+    ceph_assert(canceled);
+    m_task_contexts.erase(it);
+    return true;
   }
 
   void cancel_all(Context *comp) {
@@ -88,8 +91,22 @@ public:
     return true;
   }
 
-  void queue(Context *ctx) {
-    m_finisher->queue(ctx);
+  bool reschedule_event_after(const Task& task, double seconds) {
+    std::lock_guard l{*m_lock};
+    auto it = m_task_contexts.find(task);
+    if (it == m_task_contexts.end()) {
+      return false;
+    }
+    bool canceled = m_safe_timer->cancel_event(it->second.second);
+    ceph_assert(canceled);
+    auto timer_ctx = new C_Task(this, task);
+    it->second.second = timer_ctx;
+    m_safe_timer->add_event_after(seconds, timer_ctx);
+    return true;
+  }
+
+  void queue(Context *ctx, int r = 0) {
+    m_finisher->queue(ctx, r);
   }
 
   bool queue(const Task& task, Context *ctx) {