1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #include <sys/types.h>
18 #include <boost/scoped_ptr.hpp>
23 #include "auth/KeyRing.h"
25 #include "os/ObjectStore.h"
26 #include "mon/MonClient.h"
27 #include "include/ceph_features.h"
28 #include "common/config.h"
30 #include "mon/MonMap.h"
32 #include "msg/Messenger.h"
34 #include "common/Throttle.h"
35 #include "common/Timer.h"
36 #include "common/TracepointProvider.h"
37 #include "common/ceph_argparse.h"
38 #include "common/numa.h"
40 #include "global/global_init.h"
41 #include "global/signal_handler.h"
43 #include "include/color.h"
44 #include "common/errno.h"
45 #include "common/pick_address.h"
47 #include "perfglue/heap_profiler.h"
49 #include "include/ceph_assert.h"
51 #include "common/Preforker.h"
53 #define dout_context g_ceph_context
54 #define dout_subsys ceph_subsys_osd
59 using std::ostringstream
;
63 using ceph::bufferlist
;
67 TracepointProvider::Traits
osd_tracepoint_traits("libosd_tp.so",
69 TracepointProvider::Traits
os_tracepoint_traits("libos_tp.so",
70 "osd_objectstore_tracing");
71 TracepointProvider::Traits
bluestore_tracepoint_traits("libbluestore_tp.so",
73 #ifdef WITH_OSD_INSTRUMENT_FUNCTIONS
74 TracepointProvider::Traits
cyg_profile_traits("libcyg_profile_tp.so",
75 "osd_function_tracing");
78 } // anonymous namespace
80 OSD
*osdptr
= nullptr;
82 void handle_osd_signal(int signum
)
85 osdptr
->handle_signal(signum
);
90 cout
<< "usage: ceph-osd -i <ID> [flags]\n"
91 << " --osd-data PATH data directory\n"
92 << " --osd-journal PATH\n"
93 << " journal file or block device\n"
94 << " --mkfs create a [new] data directory\n"
95 << " --mkkey generate a new secret key. This is normally used in combination with --mkfs\n"
96 << " --monmap specify the path to the monitor map. This is normally used in combination with --mkfs\n"
97 << " --osd-uuid specify the OSD's fsid. This is normally used in combination with --mkfs\n"
98 << " --keyring specify a path to the osd keyring. This is normally used in combination with --mkfs\n"
99 << " --convert-filestore\n"
100 << " run any pending upgrade operations\n"
101 << " --flush-journal flush all data out of journal\n"
102 << " --osdspec-affinity\n"
103 << " set affinity to an osdspec\n"
104 << " --dump-journal dump all data of journal\n"
105 << " --mkjournal initialize a new journal\n"
106 << " --check-wants-journal\n"
107 << " check whether a journal is desired\n"
108 << " --check-allows-journal\n"
109 << " check whether a journal is allowed\n"
110 << " --check-needs-journal\n"
111 << " check whether a journal is required\n"
112 << " --debug_osd <N> set debug level (e.g. 10)\n"
113 << " --get-device-fsid PATH\n"
114 << " get OSD fsid for the given block device\n"
116 generic_server_usage();
119 int main(int argc
, const char **argv
)
121 auto args
= argv_to_vec(argc
, argv
);
123 cerr
<< argv
[0] << ": -h or --help for usage" << std::endl
;
126 if (ceph_argparse_need_usage(args
)) {
131 map
<string
,string
> defaults
= {
132 // We want to enable leveldb's log, while allowing users to override this
133 // option, therefore we will pass it as a default argument to global_init().
134 { "leveldb_log", "" }
136 auto cct
= global_init(
138 args
, CEPH_ENTITY_TYPE_OSD
,
139 CODE_ENVIRONMENT_DAEMON
, 0);
140 ceph_heap_profiler_init();
146 bool mkjournal
= false;
147 bool check_wants_journal
= false;
148 bool check_allows_journal
= false;
149 bool check_needs_journal
= false;
151 bool flushjournal
= false;
152 bool dump_journal
= false;
153 bool convertfilestore
= false;
154 bool get_osd_fsid
= false;
155 bool get_cluster_fsid
= false;
156 bool get_journal_fsid
= false;
157 bool get_device_fsid
= false;
159 std::string dump_pg_log
;
160 std::string osdspec_affinity
;
163 for (std::vector
<const char*>::iterator i
= args
.begin(); i
!= args
.end(); ) {
164 if (ceph_argparse_double_dash(args
, i
)) {
166 } else if (ceph_argparse_flag(args
, i
, "--mkfs", (char*)NULL
)) {
168 } else if (ceph_argparse_witharg(args
, i
, &val
, "--osdspec-affinity", (char*)NULL
)) {
169 osdspec_affinity
= val
;
170 } else if (ceph_argparse_flag(args
, i
, "--mkjournal", (char*)NULL
)) {
172 } else if (ceph_argparse_flag(args
, i
, "--check-allows-journal", (char*)NULL
)) {
173 check_allows_journal
= true;
174 } else if (ceph_argparse_flag(args
, i
, "--check-wants-journal", (char*)NULL
)) {
175 check_wants_journal
= true;
176 } else if (ceph_argparse_flag(args
, i
, "--check-needs-journal", (char*)NULL
)) {
177 check_needs_journal
= true;
178 } else if (ceph_argparse_flag(args
, i
, "--mkkey", (char*)NULL
)) {
180 } else if (ceph_argparse_flag(args
, i
, "--flush-journal", (char*)NULL
)) {
182 } else if (ceph_argparse_flag(args
, i
, "--convert-filestore", (char*)NULL
)) {
183 convertfilestore
= true;
184 } else if (ceph_argparse_witharg(args
, i
, &val
, "--dump-pg-log", (char*)NULL
)) {
186 } else if (ceph_argparse_flag(args
, i
, "--dump-journal", (char*)NULL
)) {
188 } else if (ceph_argparse_flag(args
, i
, "--get-cluster-fsid", (char*)NULL
)) {
189 get_cluster_fsid
= true;
190 } else if (ceph_argparse_flag(args
, i
, "--get-osd-fsid", "--get-osd-uuid", (char*)NULL
)) {
192 } else if (ceph_argparse_flag(args
, i
, "--get-journal-fsid", "--get-journal-uuid", (char*)NULL
)) {
193 get_journal_fsid
= true;
194 } else if (ceph_argparse_witharg(args
, i
, &device_path
,
195 "--get-device-fsid", (char*)NULL
)) {
196 get_device_fsid
= true;
202 cerr
<< "unrecognized arg " << args
[0] << std::endl
;
206 if (global_init_prefork(g_ceph_context
) >= 0) {
208 int r
= forker
.prefork(err
);
210 cerr
<< err
<< std::endl
;
213 if (forker
.is_parent()) {
214 g_ceph_context
->_log
->start();
215 if (forker
.parent_wait(err
) != 0) {
221 global_init_postfork_start(g_ceph_context
);
223 common_init_finish(g_ceph_context
);
224 global_init_chdir(g_ceph_context
);
226 if (get_journal_fsid
) {
227 device_path
= g_conf().get_val
<std::string
>("osd_journal");
228 get_device_fsid
= true;
230 if (get_device_fsid
) {
232 int r
= ObjectStore::probe_block_device_fsid(g_ceph_context
, device_path
,
235 cerr
<< "failed to get device fsid for " << device_path
236 << ": " << cpp_strerror(r
) << std::endl
;
239 cout
<< uuid
<< std::endl
;
243 if (!dump_pg_log
.empty()) {
244 common_init_finish(g_ceph_context
);
248 if (bl
.read_file(dump_pg_log
.c_str(), &error
) >= 0) {
250 auto p
= bl
.cbegin();
252 uint64_t pos
= p
.get_off();
256 catch (const ceph::buffer::error
&e
) {
257 derr
<< "failed to decode LogEntry at offset " << pos
<< dendl
;
260 derr
<< pos
<< ":\t" << e
<< dendl
;
263 derr
<< "unable to open " << dump_pg_log
<< ": " << error
<< dendl
;
270 const char *id
= g_conf()->name
.get_id().c_str();
271 int whoami
= strtol(id
, &end
, 10);
272 std::string data_path
= g_conf().get_val
<std::string
>("osd_data");
273 if (*end
|| end
== id
|| whoami
< 0) {
274 derr
<< "must specify '-i #' where # is the osd number" << dendl
;
278 if (data_path
.empty()) {
279 derr
<< "must specify '--osd-data=foo' data path" << dendl
;
284 std::string store_type
;
287 snprintf(fn
, sizeof(fn
), "%s/type", data_path
.c_str());
288 int fd
= ::open(fn
, O_RDONLY
|O_CLOEXEC
);
293 store_type
= string(bl
.c_str(), bl
.length() - 1); // drop \n
294 dout(5) << "object store type is " << store_type
<< dendl
;
298 store_type
= g_conf().get_val
<std::string
>("osd_objectstore");
300 // hrm, infer the type
301 snprintf(fn
, sizeof(fn
), "%s/current", data_path
.c_str());
303 if (::stat(fn
, &st
) == 0 &&
304 S_ISDIR(st
.st_mode
)) {
305 derr
<< "missing 'type' file, inferring filestore from current/ dir"
307 store_type
= "filestore";
309 snprintf(fn
, sizeof(fn
), "%s/block", data_path
.c_str());
310 if (::stat(fn
, &st
) == 0 &&
311 S_ISLNK(st
.st_mode
)) {
312 derr
<< "missing 'type' file, inferring bluestore from block symlink"
314 store_type
= "bluestore";
316 derr
<< "missing 'type' file and unable to infer osd type" << dendl
;
323 std::string journal_path
= g_conf().get_val
<std::string
>("osd_journal");
324 uint32_t flags
= g_conf().get_val
<uint64_t>("osd_os_flags");
325 std::unique_ptr
<ObjectStore
> store
= ObjectStore::create(g_ceph_context
,
331 derr
<< "unable to create object store" << dendl
;
332 forker
.exit(-ENODEV
);
337 common_init_finish(g_ceph_context
);
340 EntityName ename
{g_conf()->name
};
343 std::string keyring_path
= g_conf().get_val
<std::string
>("keyring");
344 int ret
= keyring
.load(g_ceph_context
, keyring_path
);
346 keyring
.get_auth(ename
, eauth
)) {
347 derr
<< "already have key in keyring " << keyring_path
<< dendl
;
349 eauth
.key
.create(g_ceph_context
, CEPH_CRYPTO_AES
);
350 keyring
.add(ename
, eauth
);
352 keyring
.encode_plaintext(bl
);
353 int r
= bl
.write_file(keyring_path
.c_str(), 0600);
355 derr
<< TEXT_RED
<< " ** ERROR: writing new keyring to "
356 << keyring_path
<< ": " << cpp_strerror(r
) << TEXT_NORMAL
359 derr
<< "created new key in keyring " << keyring_path
<< dendl
;
364 common_init_finish(g_ceph_context
);
366 if (g_conf().get_val
<uuid_d
>("fsid").is_zero()) {
367 derr
<< "must specify cluster fsid" << dendl
;
368 forker
.exit(-EINVAL
);
371 int err
= OSD::mkfs(g_ceph_context
, std::move(store
), g_conf().get_val
<uuid_d
>("fsid"),
372 whoami
, osdspec_affinity
);
374 derr
<< TEXT_RED
<< " ** ERROR: error creating empty object store in "
375 << data_path
<< ": " << cpp_strerror(-err
) << TEXT_NORMAL
<< dendl
;
378 dout(0) << "created object store " << data_path
379 << " for osd." << whoami
380 << " fsid " << g_conf().get_val
<uuid_d
>("fsid")
387 common_init_finish(g_ceph_context
);
388 int err
= store
->mkjournal();
390 derr
<< TEXT_RED
<< " ** ERROR: error creating fresh journal "
391 << journal_path
<< " for object store " << data_path
<< ": "
392 << cpp_strerror(-err
) << TEXT_NORMAL
<< dendl
;
395 derr
<< "created new journal " << journal_path
396 << " for object store " << data_path
<< dendl
;
399 if (check_wants_journal
) {
400 if (store
->wants_journal()) {
401 cout
<< "wants journal: yes" << std::endl
;
404 cout
<< "wants journal: no" << std::endl
;
408 if (check_allows_journal
) {
409 if (store
->allows_journal()) {
410 cout
<< "allows journal: yes" << std::endl
;
413 cout
<< "allows journal: no" << std::endl
;
417 if (check_needs_journal
) {
418 if (store
->needs_journal()) {
419 cout
<< "needs journal: yes" << std::endl
;
422 cout
<< "needs journal: no" << std::endl
;
427 common_init_finish(g_ceph_context
);
428 int err
= store
->mount();
430 derr
<< TEXT_RED
<< " ** ERROR: error flushing journal " << journal_path
431 << " for object store " << data_path
432 << ": " << cpp_strerror(-err
) << TEXT_NORMAL
<< dendl
;
433 goto flushjournal_out
;
436 derr
<< "flushed journal " << journal_path
437 << " for object store " << data_path
441 forker
.exit(err
< 0 ? 1 : 0);
444 common_init_finish(g_ceph_context
);
445 int err
= store
->dump_journal(cout
);
447 derr
<< TEXT_RED
<< " ** ERROR: error dumping journal " << journal_path
448 << " for object store " << data_path
449 << ": " << cpp_strerror(-err
) << TEXT_NORMAL
<< dendl
;
452 derr
<< "dumped journal " << journal_path
453 << " for object store " << data_path
458 if (convertfilestore
) {
459 int err
= store
->mount();
461 derr
<< TEXT_RED
<< " ** ERROR: error mounting store " << data_path
462 << ": " << cpp_strerror(-err
) << TEXT_NORMAL
<< dendl
;
465 err
= store
->upgrade();
468 derr
<< TEXT_RED
<< " ** ERROR: error converting store " << data_path
469 << ": " << cpp_strerror(-err
) << TEXT_NORMAL
<< dendl
;
476 uuid_d cluster_fsid
, osd_fsid
;
477 ceph_release_t require_osd_release
= ceph_release_t::unknown
;
479 int r
= OSD::peek_meta(store
.get(), &magic
, &cluster_fsid
, &osd_fsid
, &w
,
480 &require_osd_release
);
482 derr
<< TEXT_RED
<< " ** ERROR: unable to open OSD superblock on "
483 << data_path
<< ": " << cpp_strerror(-r
)
484 << TEXT_NORMAL
<< dendl
;
486 derr
<< TEXT_RED
<< " ** please verify that underlying storage "
487 << "supports xattrs" << TEXT_NORMAL
<< dendl
;
492 derr
<< "OSD id " << w
<< " != my id " << whoami
<< dendl
;
495 if (strcmp(magic
.c_str(), CEPH_OSD_ONDISK_MAGIC
)) {
496 derr
<< "OSD magic " << magic
<< " != my " << CEPH_OSD_ONDISK_MAGIC
501 if (get_cluster_fsid
) {
502 cout
<< cluster_fsid
<< std::endl
;
506 cout
<< osd_fsid
<< std::endl
;
512 if (!can_upgrade_from(require_osd_release
, "require_osd_release", err
)) {
513 derr
<< err
.str() << dendl
;
518 // consider objectstore numa node
519 int os_numa_node
= -1;
520 r
= store
->get_numa_node(&os_numa_node
, nullptr, nullptr);
521 if (r
>= 0 && os_numa_node
>= 0) {
522 dout(1) << " objectstore numa_node " << os_numa_node
<< dendl
;
524 int iface_preferred_numa_node
= -1;
525 if (g_conf().get_val
<bool>("osd_numa_prefer_iface")) {
526 iface_preferred_numa_node
= os_numa_node
;
530 std::string msg_type
= g_conf().get_val
<std::string
>("ms_type");
531 std::string public_msg_type
=
532 g_conf().get_val
<std::string
>("ms_public_type");
533 std::string cluster_msg_type
=
534 g_conf().get_val
<std::string
>("ms_cluster_type");
536 public_msg_type
= public_msg_type
.empty() ? msg_type
: public_msg_type
;
537 cluster_msg_type
= cluster_msg_type
.empty() ? msg_type
: cluster_msg_type
;
538 uint64_t nonce
= Messenger::get_pid_nonce();
539 Messenger
*ms_public
= Messenger::create(g_ceph_context
, public_msg_type
,
540 entity_name_t::OSD(whoami
), "client", nonce
);
541 Messenger
*ms_cluster
= Messenger::create(g_ceph_context
, cluster_msg_type
,
542 entity_name_t::OSD(whoami
), "cluster", nonce
);
543 Messenger
*ms_hb_back_client
= Messenger::create(g_ceph_context
, cluster_msg_type
,
544 entity_name_t::OSD(whoami
), "hb_back_client", nonce
);
545 Messenger
*ms_hb_front_client
= Messenger::create(g_ceph_context
, public_msg_type
,
546 entity_name_t::OSD(whoami
), "hb_front_client", nonce
);
547 Messenger
*ms_hb_back_server
= Messenger::create(g_ceph_context
, cluster_msg_type
,
548 entity_name_t::OSD(whoami
), "hb_back_server", nonce
);
549 Messenger
*ms_hb_front_server
= Messenger::create(g_ceph_context
, public_msg_type
,
550 entity_name_t::OSD(whoami
), "hb_front_server", nonce
);
551 Messenger
*ms_objecter
= Messenger::create(g_ceph_context
, public_msg_type
,
552 entity_name_t::OSD(whoami
), "ms_objecter", nonce
);
553 if (!ms_public
|| !ms_cluster
|| !ms_hb_front_client
|| !ms_hb_back_client
|| !ms_hb_back_server
|| !ms_hb_front_server
|| !ms_objecter
)
555 ms_cluster
->set_cluster_protocol(CEPH_OSD_PROTOCOL
);
556 ms_hb_front_client
->set_cluster_protocol(CEPH_OSD_PROTOCOL
);
557 ms_hb_back_client
->set_cluster_protocol(CEPH_OSD_PROTOCOL
);
558 ms_hb_back_server
->set_cluster_protocol(CEPH_OSD_PROTOCOL
);
559 ms_hb_front_server
->set_cluster_protocol(CEPH_OSD_PROTOCOL
);
561 dout(0) << "starting osd." << whoami
562 << " osd_data " << data_path
563 << " " << ((journal_path
.empty()) ?
564 "(no journal)" : journal_path
)
567 uint64_t message_size
=
568 g_conf().get_val
<Option::size_t>("osd_client_message_size_cap");
569 boost::scoped_ptr
<Throttle
> client_byte_throttler(
570 new Throttle(g_ceph_context
, "osd_client_bytes", message_size
));
571 uint64_t message_cap
= g_conf().get_val
<uint64_t>("osd_client_message_cap");
572 boost::scoped_ptr
<Throttle
> client_msg_throttler(
573 new Throttle(g_ceph_context
, "osd_client_messages", message_cap
));
575 // All feature bits 0 - 34 should be present from dumpling v0.67 forward
576 uint64_t osd_required
=
578 CEPH_FEATURE_PGID64
|
581 ms_public
->set_default_policy(Messenger::Policy::stateless_registered_server(0));
582 ms_public
->set_policy_throttlers(entity_name_t::TYPE_CLIENT
,
583 client_byte_throttler
.get(),
584 client_msg_throttler
.get());
585 ms_public
->set_policy(entity_name_t::TYPE_MON
,
586 Messenger::Policy::lossy_client(osd_required
));
587 ms_public
->set_policy(entity_name_t::TYPE_MGR
,
588 Messenger::Policy::lossy_client(osd_required
));
590 ms_cluster
->set_default_policy(Messenger::Policy::stateless_server(0));
591 ms_cluster
->set_policy(entity_name_t::TYPE_MON
, Messenger::Policy::lossy_client(0));
592 ms_cluster
->set_policy(entity_name_t::TYPE_OSD
,
593 Messenger::Policy::lossless_peer(osd_required
));
594 ms_cluster
->set_policy(entity_name_t::TYPE_CLIENT
,
595 Messenger::Policy::stateless_server(0));
597 ms_hb_front_client
->set_policy(entity_name_t::TYPE_OSD
,
598 Messenger::Policy::lossy_client(0));
599 ms_hb_back_client
->set_policy(entity_name_t::TYPE_OSD
,
600 Messenger::Policy::lossy_client(0));
601 ms_hb_back_server
->set_policy(entity_name_t::TYPE_OSD
,
602 Messenger::Policy::stateless_server(0));
603 ms_hb_front_server
->set_policy(entity_name_t::TYPE_OSD
,
604 Messenger::Policy::stateless_server(0));
606 ms_objecter
->set_default_policy(Messenger::Policy::lossy_client(CEPH_FEATURE_OSDREPLYMUX
));
608 entity_addrvec_t public_addrs
, cluster_addrs
;
609 r
= pick_addresses(g_ceph_context
, CEPH_PICK_ADDRESS_PUBLIC
, &public_addrs
,
610 iface_preferred_numa_node
);
612 derr
<< "Failed to pick public address." << dendl
;
615 r
= pick_addresses(g_ceph_context
, CEPH_PICK_ADDRESS_CLUSTER
, &cluster_addrs
,
616 iface_preferred_numa_node
);
618 derr
<< "Failed to pick cluster address." << dendl
;
622 if (ms_public
->bindv(public_addrs
) < 0)
625 if (ms_cluster
->bindv(cluster_addrs
) < 0)
628 bool is_delay
= g_conf().get_val
<bool>("osd_heartbeat_use_min_delay_socket");
630 ms_hb_front_client
->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY
);
631 ms_hb_back_client
->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY
);
632 ms_hb_back_server
->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY
);
633 ms_hb_front_server
->set_socket_priority(SOCKET_PRIORITY_MIN_DELAY
);
636 entity_addrvec_t hb_front_addrs
= public_addrs
;
637 for (auto& a
: hb_front_addrs
.v
) {
640 if (ms_hb_front_server
->bindv(hb_front_addrs
) < 0)
642 if (ms_hb_front_client
->client_bind(hb_front_addrs
.front()) < 0)
645 entity_addrvec_t hb_back_addrs
= cluster_addrs
;
646 for (auto& a
: hb_back_addrs
.v
) {
649 if (ms_hb_back_server
->bindv(hb_back_addrs
) < 0)
651 if (ms_hb_back_client
->client_bind(hb_back_addrs
.front()) < 0)
654 // install signal handlers
655 init_async_signal_handler();
656 register_async_signal_handler(SIGHUP
, sighup_handler
);
658 TracepointProvider::initialize
<osd_tracepoint_traits
>(g_ceph_context
);
659 TracepointProvider::initialize
<os_tracepoint_traits
>(g_ceph_context
);
660 TracepointProvider::initialize
<bluestore_tracepoint_traits
>(g_ceph_context
);
661 #ifdef WITH_OSD_INSTRUMENT_FUNCTIONS
662 TracepointProvider::initialize
<cyg_profile_traits
>(g_ceph_context
);
665 srand(time(NULL
) + getpid());
667 ceph::async::io_context_pool
poolctx(
668 cct
->_conf
.get_val
<std::uint64_t>("osd_asio_thread_count"));
670 MonClient
mc(g_ceph_context
, poolctx
);
671 if (mc
.build_initial_monmap() < 0)
673 global_init_chdir(g_ceph_context
);
675 if (global_init_preload_erasure_code(g_ceph_context
) < 0) {
679 osdptr
= new OSD(g_ceph_context
,
694 int err
= osdptr
->pre_init();
696 derr
<< TEXT_RED
<< " ** ERROR: osd pre_init failed: " << cpp_strerror(-err
)
697 << TEXT_NORMAL
<< dendl
;
702 ms_hb_front_client
->start();
703 ms_hb_back_client
->start();
704 ms_hb_front_server
->start();
705 ms_hb_back_server
->start();
707 ms_objecter
->start();
710 err
= osdptr
->init();
712 derr
<< TEXT_RED
<< " ** ERROR: osd init failed: " << cpp_strerror(-err
)
713 << TEXT_NORMAL
<< dendl
;
719 if (g_conf()->daemonize
) {
720 global_init_postfork_finish(g_ceph_context
);
725 register_async_signal_handler_oneshot(SIGINT
, handle_osd_signal
);
726 register_async_signal_handler_oneshot(SIGTERM
, handle_osd_signal
);
728 osdptr
->final_init();
730 if (g_conf().get_val
<bool>("inject_early_sigterm"))
731 kill(getpid(), SIGTERM
);
734 ms_hb_front_client
->wait();
735 ms_hb_back_client
->wait();
736 ms_hb_front_server
->wait();
737 ms_hb_back_server
->wait();
741 unregister_async_signal_handler(SIGHUP
, sighup_handler
);
742 unregister_async_signal_handler(SIGINT
, handle_osd_signal
);
743 unregister_async_signal_handler(SIGTERM
, handle_osd_signal
);
744 shutdown_async_signal_handler();
750 delete ms_hb_front_client
;
751 delete ms_hb_back_client
;
752 delete ms_hb_front_server
;
753 delete ms_hb_back_server
;
757 client_byte_throttler
.reset();
758 client_msg_throttler
.reset();
760 // cd on exit, so that gmon.out (if any) goes into a separate directory for each node.
762 snprintf(s
, sizeof(s
), "gmon/%d", getpid());
763 if ((mkdir(s
, 0755) == 0) && (chdir(s
) == 0)) {
764 dout(0) << "ceph-osd: gmon.out should be in " << s
<< dendl
;