]>
git.proxmox.com Git - ceph.git/blob - ceph/src/neorados/RADOSImpl.cc
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-2012 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.
16 #include <boost/system/system_error.hpp>
18 #include "common/common_init.h"
20 #include "global/global_init.h"
22 #include "RADOSImpl.h"
27 RADOS::RADOS(boost::asio::io_context
& ioctx
,
28 boost::intrusive_ptr
<CephContext
> cct
)
29 : Dispatcher(cct
.get()),
32 monclient(cct
.get(), ioctx
),
33 mgrclient(cct
.get(), nullptr, &monclient
.monmap
) {
34 auto err
= monclient
.build_initial_monmap();
36 throw std::system_error(ceph::to_error_code(err
));
38 messenger
.reset(Messenger::create_client_messenger(cct
.get(), "radosclient"));
40 throw std::bad_alloc();
42 // Require OSDREPLYMUX feature. This means we will fail to talk to
43 // old servers. This is necessary because otherwise we won't know
44 // how to decompose the reply data into its constituent pieces.
45 messenger
->set_default_policy(
46 Messenger::Policy::lossy_client(CEPH_FEATURE_OSDREPLYMUX
));
48 objecter
= std::make_unique
<Objecter
>(cct
.get(), messenger
.get(), &monclient
, ioctx
);
50 objecter
->set_balanced_budget();
51 monclient
.set_messenger(messenger
.get());
52 mgrclient
.set_messenger(messenger
.get());
54 messenger
->add_dispatcher_head(&mgrclient
);
55 messenger
->add_dispatcher_tail(objecter
.get());
57 monclient
.set_want_keys(CEPH_ENTITY_TYPE_MON
| CEPH_ENTITY_TYPE_OSD
| CEPH_ENTITY_TYPE_MGR
);
58 err
= monclient
.init();
60 throw boost::system::system_error(ceph::to_error_code(err
));
62 err
= monclient
.authenticate(cct
->_conf
->client_mount_timeout
);
64 throw boost::system::system_error(ceph::to_error_code(err
));
66 messenger
->set_myname(entity_name_t::CLIENT(monclient
.get_global_id()));
67 // Detect older cluster, put mgrclient into compatible mode
68 mgrclient
.set_mgr_optional(
69 !get_required_monitor_features().contains_all(
70 ceph::features::mon::FEATURE_LUMINOUS
));
72 // MgrClient needs this (it doesn't have MonClient reference itself)
73 monclient
.sub_want("mgrmap", 0, 0);
74 monclient
.renew_subs();
77 objecter
->set_client_incarnation(0);
80 messenger
->add_dispatcher_tail(this);
82 std::unique_lock
l(lock
);
83 instance_id
= monclient
.get_global_id();
87 if (objecter
&& objecter
->initialized
) {
95 messenger
->shutdown();
100 bool RADOS::ms_dispatch(Message
*m
)
102 switch (m
->get_type()) {
104 case CEPH_MSG_OSD_MAP
:
111 void RADOS::ms_handle_connect(Connection
*con
) {}
112 bool RADOS::ms_handle_reset(Connection
*con
) {
115 void RADOS::ms_handle_remote_reset(Connection
*con
) {}
116 bool RADOS::ms_handle_refused(Connection
*con
) {
120 } // namespace detail
121 } // namespace neorados