]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cephtool: send keepalive to tell target
authorSage Weil <sage@inktank.com>
Tue, 31 Jul 2012 22:02:55 +0000 (15:02 -0700)
committerSage Weil <sage@inktank.com>
Mon, 13 Aug 2012 15:46:14 +0000 (08:46 -0700)
If we 'ceph tell <foo> ...' to a non-monitor, we need to send keepalives to
ensure we detect a tcp drop.  (Not so for monitors; monclient already does
its own keepalive thing.)

Signed-off-by: Sage Weil <sage@inktank.com>
src/tools/common.cc

index 4c671c7cd83eaa54ee9e61f1ed30df248a1e5ee7..e29a674e75ea45ec5e3baeb19aa60076879c455e 100644 (file)
@@ -71,11 +71,12 @@ string reply_rs;
 int reply_rc;
 bufferlist reply_bl;
 entity_inst_t reply_from;
-Context *resend_event = 0;
 
 OSDMap *osdmap = 0;
 
 Connection *command_con = NULL;
+Context *tick_event = 0;
+float tick_interval = 3.0;
 
 // observe (push)
 #include "mon/PGMap.h"
@@ -92,6 +93,19 @@ Connection *command_con = NULL;
 
 static set<int> registered, seen;
 
+struct C_Tick : public Context {
+  CephToolCtx *ctx;
+  C_Tick(CephToolCtx *c) : ctx(c) {}
+  void finish(int r) {
+    if (command_con)
+      messenger->send_keepalive(command_con);
+
+    assert(tick_event == this);
+    tick_event = new C_Tick(ctx);
+    ctx->timer.add_event_after(tick_interval, tick_event);
+  }
+};
+
 static void send_command(CephToolCtx *ctx)
 {
   if (!pending_tell && !pending_tell_pgid) {
@@ -162,6 +176,11 @@ static void send_command(CephToolCtx *ctx)
 
       command_con = messenger->get_connection(osdmap->get_inst(n));
       messenger->send_message(m, command_con);
+
+      if (tick_event)
+       ctx->timer.cancel_event(tick_event);
+      tick_event = new C_Tick(ctx);
+      ctx->timer.add_event_after(tick_interval, tick_event);
     }
     return;
   }
@@ -193,10 +212,6 @@ static void handle_ack(CephToolCtx *ctx, MMonCommandAck *ack)
   reply_rc = ack->r;
   reply_bl = ack->get_data();
   cmd_cond.Signal();
-  if (resend_event) {
-    ctx->timer.cancel_event(resend_event);
-    resend_event = 0;
-  }
   ctx->lock.Unlock();
   ack->put();
 }
@@ -211,9 +226,9 @@ static void handle_ack(CephToolCtx *ctx, MCommandReply *ack)
     reply_rc = ack->r;
     reply_bl = ack->get_data();
     cmd_cond.Signal();
-    if (resend_event) {
-      ctx->timer.cancel_event(resend_event);
-      resend_event = 0;
+    if (tick_event) {
+      ctx->timer.cancel_event(tick_event);
+      tick_event = 0;
     }
   }
   ctx->lock.Unlock();