StandaloneClient::StandaloneClient(Messenger *m, MonClient *mc,
boost::asio::io_context& ictx)
- : Client(m, mc, new Objecter(m->cct, m, mc, ictx, 0, 0))
+ : Client(m, mc, new Objecter(m->cct, m, mc, ictx))
{
monclient->set_messenger(m);
objecter->set_client_incarnation(0);
OPTION(fio_dir, OPT_STR) // fio data directory for fio-objectstore
-OPTION(rados_mon_op_timeout, OPT_DOUBLE) // how many seconds to wait for a response from the monitor before returning an error from a rados operation. 0 means no limit.
-OPTION(rados_osd_op_timeout, OPT_DOUBLE) // how many seconds to wait for a response from osds before returning an error from a rados operation. 0 means no limit.
OPTION(rados_tracing, OPT_BOOL) // true if LTTng-UST tracepoints should be enabled
.set_default("/tmp/fio")
.set_description(""),
- Option("rados_mon_op_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ Option("rados_mon_op_timeout", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
.set_default(0)
- .set_description(""),
+ .set_description("timeout for operations handled by monitors such as statfs (0 is unlimited)")
+ .set_flag(Option::FLAG_RUNTIME)
+ .set_min(0),
- Option("rados_osd_op_timeout", Option::TYPE_FLOAT, Option::LEVEL_ADVANCED)
+ Option("rados_osd_op_timeout", Option::TYPE_SECS, Option::LEVEL_ADVANCED)
.set_default(0)
- .set_description(""),
+ .set_description("timeout for operations handled by osds such as write (0 is unlimited)")
+ .set_flag(Option::FLAG_RUNTIME)
+ .set_min(0),
Option("rados_tracing", Option::TYPE_BOOL, Option::LEVEL_ADVANCED)
.set_default(false)
ldout(cct, 1) << "starting objecter" << dendl;
- objecter = new (std::nothrow) Objecter(cct, messenger, &monclient,
- poolctx,
- cct->_conf->rados_mon_op_timeout,
- cct->_conf->rados_osd_op_timeout);
+ objecter = new (std::nothrow) Objecter(cct, messenger, &monclient, poolctx);
if (!objecter)
goto out;
objecter->set_balanced_budget();
if (need_map) {
std::unique_lock l(lock);
- ceph::timespan timeout{0};
- if (cct->_conf->rados_mon_op_timeout > 0) {
- timeout = ceph::make_timespan(cct->_conf->rados_mon_op_timeout);
- }
-
+ ceph::timespan timeout = rados_mon_op_timeout;
if (objecter->with_osdmap(std::mem_fn(&OSDMap::get_epoch)) == 0) {
ldout(cct, 10) << __func__ << " waiting" << dendl;
while (objecter->with_osdmap(std::mem_fn(&OSDMap::get_epoch)) == 0) {
return r;
lock.unlock();
- if (conf->rados_mon_op_timeout) {
- r = cond.wait_for(conf->rados_mon_op_timeout);
+ if (rados_mon_op_timeout.count() > 0) {
+ r = cond.wait_for(rados_mon_op_timeout);
} else {
r = cond.wait();
}
return r;
lock.unlock();
- if (conf->rados_mon_op_timeout) {
- r = cond.wait_for(conf->rados_mon_op_timeout);
+ if (rados_mon_op_timeout.count() > 0) {
+ r = cond.wait_for(rados_mon_op_timeout);
} else {
r = cond.wait();
}
return 0;
}
-namespace {
-const char *config_keys[] = {
- "librados_thread_count",
- NULL
-};
-}
-
const char** librados::RadosClient::get_tracked_conf_keys() const
{
+ static const char *config_keys[] = {
+ "librados_thread_count",
+ "rados_mon_op_timeout",
+ nullptr
+ };
return config_keys;
}
poolctx.stop();
poolctx.start(conf.get_val<std::uint64_t>("librados_thread_count"));
}
+ if (changed.count("rados_mon_op_timeout")) {
+ rados_mon_op_timeout = conf.get_val<std::chrono::seconds>("rados_mon_op_timeout");
+ }
}
bool service_daemon = false;
string daemon_name, service_name;
map<string,string> daemon_metadata;
+ ceph::timespan rados_mon_op_timeout{};
int wait_for_osdmap();
boost::asio::io_context& ioc) :
cct(msgr->cct), mds_lock(mds_lock_), clog(clog_),
timer(timer_), mdsmap(mdsmap_),
- objecter(new Objecter(g_ceph_context, msgr, monc_, ioc, 0, 0)),
+ objecter(new Objecter(g_ceph_context, msgr, monc_, ioc)),
damage_table(whoami_), sessionmap(this),
op_tracker(g_ceph_context, g_conf()->mds_enable_op_tracker,
g_conf()->osd_num_op_tracker_shard),
entity_name_t::MGR(),
"mgr",
Messenger::get_pid_nonce())),
- objecter{g_ceph_context, client_messenger.get(), &monc, poolctx, 0, 0},
+ objecter{g_ceph_context, client_messenger.get(), &monc, poolctx},
client{client_messenger.get(), &monc, &objecter},
mgrc(g_ceph_context, client_messenger.get(), &monc.monmap),
log_client(g_ceph_context, client_messenger.get(), &monc.monmap, LogClient::NO_FLAGS),
MonCommand(MonClient& monc, uint64_t t, std::unique_ptr<CommandCompletion> onfinish)
: tid(t), onfinish(std::move(onfinish)) {
- auto timeout = ceph::maybe_timespan(monc.cct->_conf->rados_mon_op_timeout);
- if (timeout) {
- cancel_timer.emplace(monc.service, *timeout);
+ auto timeout =
+ monc.cct->_conf.get_val<std::chrono::seconds>("rados_mon_op_timeout");
+ if (timeout.count() > 0) {
+ cancel_timer.emplace(monc.service, timeout);
cancel_timer->async_wait(
[this, &monc](boost::system::error_code ec) {
if (ec)
messenger->set_default_policy(
Messenger::Policy::lossy_client(CEPH_FEATURE_OSDREPLYMUX));
- objecter.reset(new Objecter(cct.get(), messenger.get(), &monclient,
- ioctx,
- cct->_conf->rados_mon_op_timeout,
- cct->_conf->rados_osd_op_timeout));
+ objecter = std::make_unique<Objecter>(cct.get(), messenger.get(), &monclient, ioctx);
objecter->set_balanced_budget();
monclient.set_messenger(messenger.get());
poolctx(poolctx),
objecter(make_unique<Objecter>(osd->client_messenger->cct,
osd->objecter_messenger,
- osd->monc, poolctx, 0, 0)),
+ osd->monc, poolctx)),
m_objecter_finishers(cct->_conf->osd_objecter_finishers),
watch_timer(osd->client_messenger->cct, watch_lock),
next_notif_id(0),
// config obs ----------------------------
-static const char *config_keys[] = {
- "crush_location",
- NULL
-};
-
class Objecter::RequestStateHook : public AdminSocketHook {
Objecter *m_objecter;
public:
const char** Objecter::get_tracked_conf_keys() const
{
+ static const char *config_keys[] = {
+ "crush_location",
+ "rados_mon_op_timeout",
+ "rados_osd_op_timeout",
+ NULL
+ };
return config_keys;
}
if (changed.count("crush_location")) {
update_crush_location();
}
+ if (changed.count("rados_mon_op_timeout")) {
+ mon_timeout = conf.get_val<std::chrono::seconds>("rados_mon_op_timeout");
+ }
+ if (changed.count("rados_osd_op_timeout")) {
+ osd_timeout = conf.get_val<std::chrono::seconds>("rados_osd_op_timeout");
+ }
}
void Objecter::update_crush_location()
Objecter::Objecter(CephContext *cct,
Messenger *m, MonClient *mc,
- boost::asio::io_context& service,
- double mon_timeout,
- double osd_timeout) :
- Dispatcher(cct), messenger(m), monc(mc), service(service),
- mon_timeout(ceph::make_timespan(mon_timeout)),
- osd_timeout(ceph::make_timespan(osd_timeout))
-{}
+ boost::asio::io_context& service) :
+ Dispatcher(cct), messenger(m), monc(mc), service(service)
+{
+ mon_timeout = cct->_conf.get_val<std::chrono::seconds>("rados_mon_op_timeout");
+ osd_timeout = cct->_conf.get_val<std::chrono::seconds>("rados_osd_op_timeout");
+}
Objecter::~Objecter()
{
cct->_conf->objecter_inflight_ops)};
public:
Objecter(CephContext *cct, Messenger *m, MonClient *mc,
- boost::asio::io_context& service,
- double mon_timeout,
- double osd_timeout);
+ boost::asio::io_context& service);
~Objecter() override;
void init();
ASSERT_EQ(0, rados_create(&cluster, "admin"));
ASSERT_EQ(0, rados_conf_read_file(cluster, NULL));
ASSERT_EQ(0, rados_conf_parse_env(cluster, NULL));
- ASSERT_EQ(0, rados_conf_set(cluster, "rados_osd_op_timeout", "0.00001")); // use any small value that will result in a timeout
+ ASSERT_EQ(0, rados_conf_set(cluster, "rados_osd_op_timeout", "1")); // use any small value that will result in a timeout
+ ASSERT_EQ(0, rados_conf_set(cluster, "ms_inject_internal_delays", "2")); // create a 2 second delay
ASSERT_EQ(0, rados_connect(cluster));
ASSERT_EQ(0, rados_ioctx_create(cluster, pool_name.c_str(), &ioctx));
rados_ioctx_set_namespace(ioctx, nspace.c_str());
dout(10) << "ClientStub::" << __func__ << " starting messenger at "
<< messenger->get_myaddrs() << dendl;
- objecter.reset(new Objecter(cct, messenger.get(), &monc, poolctx, 0, 0));
+ objecter.reset(new Objecter(cct, messenger.get(), &monc, poolctx));
ceph_assert(objecter.get() != NULL);
objecter->set_balanced_budget();
monc = new MonClient(g_ceph_context, poolctx);
messenger = Messenger::create_client_messenger(g_ceph_context, "mds");
fsmap = new FSMap();
- objecter = new Objecter(g_ceph_context, messenger, monc, poolctx, 0, 0);
+ objecter = new Objecter(g_ceph_context, messenger, monc, poolctx);
}