Skip to content

Commit

Permalink
Merge pull request #20320 from rzarzynski/wip-common-md_config_cacher_t
Browse files Browse the repository at this point in the history
common: introduce md_config_cacher_t

Reviewed-by: Sage Weil <sage@redhat.com>
  • Loading branch information
tchaikov committed Feb 12, 2018
2 parents d73b7f2 + 248750f commit cc2fa37
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 9 deletions.
59 changes: 59 additions & 0 deletions src/common/config_cacher.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
// vim: ts=8 sw=2 smarttab
/*
* Ceph - scalable distributed file system
*
* Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
*
* This is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software
* Foundation. See file COPYING.
*
*/

#ifndef CEPH_CONFIG_CACHER_H
#define CEPH_CONFIG_CACHER_H

#include "common/config_obs.h"
#include "common/config.h"

template <typename ValueT>
class md_config_cacher_t : public md_config_obs_t {
md_config_t& conf;
const char* const option_name;
std::atomic<ValueT> value_cache;

const char** get_tracked_conf_keys() const override {
const static char* keys[] = { option_name, nullptr };
return keys;
}

void handle_conf_change(const md_config_t* conf,
const std::set<std::string>& changed) override {
if (changed.count(option_name)) {
value_cache.store(conf->get_val<ValueT>(option_name));
}
}

public:
md_config_cacher_t(md_config_t& conf,
const char* const option_name)
: conf(conf),
option_name(option_name) {
conf.add_observer(this);
std::atomic_init(&value_cache,
conf.get_val<ValueT>(option_name));
}

~md_config_cacher_t() {
conf.remove_observer(this);
}

operator ValueT() const {
return value_cache.load();
}
};

#endif // CEPH_CONFIG_CACHER_H

2 changes: 2 additions & 0 deletions src/osd/OSD.cc
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,8 @@ OSDService::OSDService(OSD *osd) :
recovery_gen_wq("recovery_gen_wq", cct->_conf->osd_recovery_thread_timeout,
&osd->disk_tp),
class_handler(osd->class_handler),
osd_max_object_size(*cct->_conf, "osd_max_object_size"),
osd_skip_data_digest(*cct->_conf, "osd_skip_data_digest"),
pg_epoch_lock("OSDService::pg_epoch_lock"),
publish_lock("OSDService::publish_lock"),
pre_publish_lock("OSDService::pre_publish_lock"),
Expand Down
4 changes: 4 additions & 0 deletions src/osd/OSD.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "common/WorkQueue.h"
#include "common/AsyncReserver.h"
#include "common/ceph_context.h"
#include "common/config_cacher.h"
#include "common/zipkin_trace.h"

#include "mgr/MgrClient.h"
Expand Down Expand Up @@ -260,6 +261,9 @@ class OSDService {
GenContextWQ recovery_gen_wq;
ClassHandler *&class_handler;

md_config_cacher_t<uint64_t> osd_max_object_size;
md_config_cacher_t<bool> osd_skip_data_digest;

void enqueue_back(OpQueueItem&& qi);
void enqueue_front(OpQueueItem&& qi);

Expand Down
17 changes: 8 additions & 9 deletions src/osd/PrimaryLogPG.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5491,9 +5491,8 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
ObjectState& obs = ctx->new_obs;
object_info_t& oi = obs.oi;
const hobject_t& soid = oi.soid;
bool skip_data_digest = osd->store->has_builtin_csum() &&
cct->_conf->osd_skip_data_digest;
const uint64_t osd_max_object_size = cct->_conf->osd_max_object_size;
const bool skip_data_digest = osd->store->has_builtin_csum() &&
osd->osd_skip_data_digest;

PGTransaction* t = ctx->op_t.get();

Expand Down Expand Up @@ -5552,9 +5551,9 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
// munge ZERO -> TRUNCATE? (don't munge to DELETE or we risk hosing attributes)
if (op.op == CEPH_OSD_OP_ZERO &&
obs.exists &&
op.extent.offset < osd_max_object_size &&
op.extent.offset < osd->osd_max_object_size &&
op.extent.length >= 1 &&
op.extent.length <= osd_max_object_size &&
op.extent.length <= osd->osd_max_object_size &&
op.extent.offset + op.extent.length >= oi.size) {
if (op.extent.offset >= oi.size) {
// no-op
Expand Down Expand Up @@ -6254,7 +6253,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
}
}
result = check_offset_and_length(op.extent.offset, op.extent.length,
osd_max_object_size, get_dpp());
osd->osd_max_object_size, get_dpp());
if (result < 0)
break;

Expand Down Expand Up @@ -6300,7 +6299,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
break;
}
result = check_offset_and_length(0, op.extent.length,
osd_max_object_size, get_dpp());
osd->osd_max_object_size, get_dpp());
if (result < 0)
break;

Expand Down Expand Up @@ -6346,7 +6345,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
++ctx->num_write;
{ // zero
result = check_offset_and_length(op.extent.offset, op.extent.length,
osd_max_object_size, get_dpp());
osd->osd_max_object_size, get_dpp());
if (result < 0)
break;

Expand Down Expand Up @@ -6411,7 +6410,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
}

result = check_offset_and_length(op.extent.offset, op.extent.length,
osd_max_object_size, get_dpp());
osd->osd_max_object_size, get_dpp());
if (result < 0)
break;

Expand Down

0 comments on commit cc2fa37

Please sign in to comment.