#include "common/safe_io.h"
#include "common/HeartbeatMap.h"
+#include "global/signal_handler.h"
+#include "global/pidfile.h"
+
#include "include/color.h"
#include "perfglue/cpu_profiler.h"
#include "perfglue/heap_profiler.h"
void OSD::handle_signal(int signum)
{
assert(signum == SIGINT || signum == SIGTERM);
- derr << "*** got signal " << sys_siglist[signum] << " ***" << dendl;
-
- // FIXME!
- exit(1);
+ derr << "*** Got signal " << sys_siglist[signum] << " ***" << dendl;
+ suicide(128 + signum);
}
int OSD::pre_init()
g_ceph_context->get_perfcounters_collection()->add(logger);
}
+void OSD::suicide(int exitcode)
+{
+ derr << " pausing thread pools" << dendl;
+ op_tp.pause();
+ disk_tp.pause();
+ recovery_tp.pause();
+ command_tp.pause();
+
+ derr << " flushing io" << dendl;
+ store->sync_and_flush();
+
+ derr << " removing pid file" << dendl;
+ pidfile_remove();
+
+ derr << " exit" << dendl;
+ exit(exitcode);
+}
+
int OSD::shutdown()
{
g_ceph_context->_conf->set_val("debug_osd", "100");
g_ceph_context->_conf->set_val("debug_ms", "100");
g_ceph_context->_conf->apply_changes(NULL);
- derr << "OSD::shutdown" << dendl;
+ derr << "shutdown" << dendl;
state = STATE_STOPPING;
delete watch;
clear_map_cache();
+
return r;
}