namespace rbd {
namespace mirror {
-Mirror::Mirror(CephContext *cct) :
+Mirror::Mirror(CephContext *cct, const std::vector<const char*> &args) :
m_cct(cct),
+ m_args(args),
m_lock("rbd::mirror::Mirror"),
m_local(new librados::Rados())
{
const peer_t &peer = kv.first;
if (m_replayers.find(peer) == m_replayers.end()) {
dout(20) << "starting replayer for " << peer << dendl;
- unique_ptr<Replayer> replayer(new Replayer(m_threads, m_local, peer));
+ unique_ptr<Replayer> replayer(new Replayer(m_threads, m_local, peer,
+ m_args));
// TODO: make async, and retry connecting within replayer
int r = replayer->init();
if (r < 0) {
*/
class Mirror {
public:
- Mirror(CephContext *cct);
+ Mirror(CephContext *cct, const std::vector<const char*> &args);
Mirror(const Mirror&) = delete;
Mirror& operator=(const Mirror&) = delete;
void update_replayers(const map<peer_t, set<int64_t> > &peer_configs);
CephContext *m_cct;
+ std::vector<const char*> m_args;
Threads *m_threads = nullptr;
Mutex m_lock;
Cond m_cond;
namespace mirror {
Replayer::Replayer(Threads *threads, RadosRef local_cluster,
- const peer_t &peer) :
+ const peer_t &peer, const std::vector<const char*> &args) :
m_threads(threads),
m_lock(stringify("rbd::mirror::Replayer ") + stringify(peer)),
m_peer(peer),
+ m_args(args),
m_local(local_cluster),
m_remote(new librados::Rados),
m_replayer_thread(this)
return r;
}
+ r = m_remote->conf_parse_env(nullptr);
+ if (r < 0) {
+ derr << "could not parse environment for " << m_peer
+ << " : " << cpp_strerror(r) << dendl;
+ return r;
+ }
+
+ if (!m_args.empty()) {
+ r = m_remote->conf_parse_argv(m_args.size(), &m_args[0]);
+ if (r < 0) {
+ derr << "could not parse command line args for " << m_peer
+ << " : " << cpp_strerror(r) << dendl;
+ return r;
+ }
+ }
+
r = m_remote->connect();
if (r < 0) {
derr << "error connecting to remote cluster " << m_peer
*/
class Replayer {
public:
- Replayer(Threads *threads, RadosRef local_cluster, const peer_t &peer);
+ Replayer(Threads *threads, RadosRef local_cluster, const peer_t &peer,
+ const std::vector<const char*> &args);
~Replayer();
Replayer(const Replayer&) = delete;
Replayer& operator=(const Replayer&) = delete;
atomic_t m_stopping;
peer_t m_peer;
+ std::vector<const char*> m_args;
std::string m_client_id;
RadosRef m_local, m_remote;
std::unique_ptr<PoolWatcher> m_pool_watcher;
register_async_signal_handler_oneshot(SIGINT, handle_signal);
register_async_signal_handler_oneshot(SIGTERM, handle_signal);
- mirror = new rbd::mirror::Mirror(g_ceph_context);
+ std::vector<const char*> cmd_args;
+ argv_to_vec(argc, argv, cmd_args);
+
+ mirror = new rbd::mirror::Mirror(g_ceph_context, cmd_args);
int r = mirror->init();
if (r < 0) {
std::cerr << "failed to initialize: " << cpp_strerror(r) << std::endl;