-
Notifications
You must be signed in to change notification settings - Fork 5.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
common: introduce md_config_cacher_t #20320
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. object lifetimes are going to get tricky here, especially if we're declaring these as static one option is to require md_config_cacher_t to hold a reference to CephContext. another is to skip this call to There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'd prefer to be pedantic about lifecycle, because in many case we want ot ensure the cct gets destroy (e.g., library code) and using static would prevent that from ever happening. It shouldn't be hard to attach instances of this to a class that gets cleaned up before cct (i.e., something that owns a ref to the cct). |
||
} | ||
|
||
operator ValueT() const { | ||
return value_cache.load(); | ||
} | ||
}; | ||
|
||
#endif // CEPH_CONFIG_CACHER_H | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
a bit surprising, if nothing constrains the type of ValueT
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks there is a
static_assert
-capable way.