mirror of
https://github.com/ceph/ceph
synced 2024-12-24 12:24:19 +00:00
e0a7ef57e0
mgr: request daemon's metadata when receiving a report from an unknown server Reviewed-by: John Spray <john.spray@redhat.com>
138 lines
3.0 KiB
C++
138 lines
3.0 KiB
C++
// -*- 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) 2014 John Spray <john.spray@inktank.com>
|
|
*
|
|
* 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_MGR_H_
|
|
#define CEPH_MGR_H_
|
|
|
|
// Python.h comes first because otherwise it clobbers ceph's assert
|
|
#include "Python.h"
|
|
// Python's pyconfig-64.h conflicts with ceph's acconfig.h
|
|
#undef HAVE_SYS_WAIT_H
|
|
#undef HAVE_UNISTD_H
|
|
#undef HAVE_UTIME_H
|
|
#undef _POSIX_C_SOURCE
|
|
#undef _XOPEN_SOURCE
|
|
|
|
#include "mds/FSMap.h"
|
|
#include "messages/MFSMap.h"
|
|
#include "msg/Messenger.h"
|
|
#include "auth/Auth.h"
|
|
#include "common/Finisher.h"
|
|
#include "common/Timer.h"
|
|
#include "mon/MgrMap.h"
|
|
|
|
#include "DaemonServer.h"
|
|
#include "PyModuleRegistry.h"
|
|
|
|
#include "DaemonState.h"
|
|
#include "ClusterState.h"
|
|
|
|
class MCommand;
|
|
class MMgrDigest;
|
|
class MLog;
|
|
class MServiceMap;
|
|
class Objecter;
|
|
class Client;
|
|
|
|
class Mgr {
|
|
protected:
|
|
MonClient *monc;
|
|
Objecter *objecter;
|
|
Client *client;
|
|
Messenger *client_messenger;
|
|
|
|
mutable Mutex lock;
|
|
SafeTimer timer;
|
|
Finisher finisher;
|
|
|
|
// Track receipt of initial data during startup
|
|
Cond fs_map_cond;
|
|
bool digest_received;
|
|
Cond digest_cond;
|
|
|
|
PyModuleRegistry *py_module_registry;
|
|
DaemonStateIndex daemon_state;
|
|
ClusterState cluster_state;
|
|
|
|
DaemonServer server;
|
|
|
|
LogChannelRef clog;
|
|
LogChannelRef audit_clog;
|
|
|
|
PyModuleConfig load_config();
|
|
void load_all_metadata();
|
|
void init();
|
|
|
|
bool initialized;
|
|
bool initializing;
|
|
|
|
public:
|
|
Mgr(MonClient *monc_, const MgrMap& mgrmap,
|
|
PyModuleRegistry *py_module_registry_,
|
|
Messenger *clientm_, Objecter *objecter_,
|
|
Client *client_, LogChannelRef clog_, LogChannelRef audit_clog_);
|
|
~Mgr();
|
|
|
|
bool is_initialized() const {return initialized;}
|
|
entity_addr_t get_server_addr() const { return server.get_myaddr(); }
|
|
|
|
void handle_mgr_digest(MMgrDigest* m);
|
|
void handle_fs_map(MFSMap* m);
|
|
void handle_osd_map();
|
|
void handle_log(MLog *m);
|
|
void handle_service_map(MServiceMap *m);
|
|
|
|
bool got_mgr_map(const MgrMap& m);
|
|
|
|
bool ms_dispatch(Message *m);
|
|
|
|
void tick();
|
|
|
|
void background_init(Context *completion);
|
|
void shutdown();
|
|
|
|
std::vector<MonCommand> get_command_set() const;
|
|
std::map<std::string, std::string> get_services() const;
|
|
};
|
|
|
|
/**
|
|
* Context for completion of metadata mon commands: take
|
|
* the result and stash it in DaemonStateIndex
|
|
*/
|
|
class MetadataUpdate : public Context
|
|
{
|
|
|
|
private:
|
|
DaemonStateIndex &daemon_state;
|
|
DaemonKey key;
|
|
|
|
std::map<std::string, std::string> defaults;
|
|
|
|
public:
|
|
bufferlist outbl;
|
|
std::string outs;
|
|
|
|
MetadataUpdate(DaemonStateIndex &daemon_state_, const DaemonKey &key_)
|
|
: daemon_state(daemon_state_), key(key_) {}
|
|
|
|
void set_default(const std::string &k, const std::string &v)
|
|
{
|
|
defaults[k] = v;
|
|
}
|
|
|
|
void finish(int r) override;
|
|
};
|
|
|
|
|
|
#endif
|