MgmtSrvr.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:20k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef MgmtSrvr_H
  14. #define MgmtSrvr_H
  15. #include <kernel_types.h>
  16. #include "Config.hpp"
  17. #include <NdbCondition.h>
  18. #include <mgmapi.h>
  19. #include <NdbTCP.h>
  20. #include <ConfigRetriever.hpp>
  21. #include <Vector.hpp>
  22. #include <NodeBitmask.hpp>
  23. #include <signaldata/ManagementServer.hpp>
  24. #include <ndb_version.h>
  25. #include <EventLogger.hpp>
  26. #include <signaldata/EventSubscribeReq.hpp>
  27. #include <SignalSender.hpp>
  28. /**
  29.  * @desc Block number for Management server.
  30.  * @todo This should probably be somewhere else. I don't know where atm.
  31.  */
  32. #define MGMSRV 1
  33. class ConfigInfoServer;
  34. class NdbApiSignal;
  35. class Config;
  36. class SetLogLevelOrd;
  37. class SocketServer;
  38. class Ndb_mgmd_event_service : public EventLoggerBase 
  39. {
  40.   friend class MgmtSrvr;
  41. public:
  42.   struct Event_listener : public EventLoggerBase {
  43.     NDB_SOCKET_TYPE m_socket;
  44.   };
  45.   
  46. private:  
  47.   class MgmtSrvr * m_mgmsrv;
  48.   MutexVector<Event_listener> m_clients;
  49. public:
  50.   Ndb_mgmd_event_service(class MgmtSrvr * m) : m_clients(5) {
  51.     m_mgmsrv = m;
  52.   }
  53.   
  54.   void add_listener(const Event_listener&);
  55.   void check_listeners();
  56.   void update_max_log_level(const LogLevel&);
  57.   void update_log_level(const LogLevel&);
  58.   
  59.   void log(int eventType, const Uint32* theData, NodeId nodeId);
  60.   
  61.   void stop_sessions();
  62.   Event_listener& operator[](unsigned i) { return m_clients[i]; }
  63.   const Event_listener& operator[](unsigned i) const { return m_clients[i]; }
  64.   void lock() { m_clients.lock(); }
  65.   void unlock(){ m_clients.unlock(); }
  66. };
  67. /**
  68.  * @class MgmtSrvr
  69.  * @brief Main class for the management server. 
  70.  *
  71.  * It has one interface to be used by a local client. 
  72.  * With the methods it's possible to send different kind of commands to 
  73.  * DB processes, as log level, set trace number etc. 
  74.  *
  75.  * A MgmtSrvr creates a ConfigInfoServer which serves request on TCP sockets. 
  76.  * The requests come typical from DB and API processes which want
  77.  * to fetch its configuration parameters. The MgmtSrvr knows about the
  78.  * configuration by reading a configuration file.
  79.  *
  80.  * The MgmtSrvr class corresponds in some ways to the Ndb class in API. 
  81.  * It creates a TransporterFacade, receives signals and defines signals
  82.  * to send and receive.
  83.  */
  84. class MgmtSrvr {
  85.   
  86. public:
  87.   // some compilers need all of this
  88.   class Allocated_resources;
  89.   friend class Allocated_resources;
  90.   class Allocated_resources {
  91.   public:
  92.     Allocated_resources(class MgmtSrvr &m);
  93.     ~Allocated_resources();
  94.     // methods to reserve/allocate resources which
  95.     // will be freed when running destructor
  96.     void reserve_node(NodeId id);
  97.     bool is_reserved(NodeId nodeId) { return m_reserved_nodes.get(nodeId); }
  98.     bool is_reserved(NodeBitmask mask) { return !mask.bitAND(m_reserved_nodes).isclear(); }
  99.     bool isclear() { return m_reserved_nodes.isclear(); }
  100.     NodeId get_nodeid() const;
  101.   private:
  102.     MgmtSrvr &m_mgmsrv;
  103.     NodeBitmask m_reserved_nodes;
  104.   };
  105.   NdbMutex *m_node_id_mutex;
  106.   /**
  107.    * Start/initate the event log.
  108.    */
  109.   void startEventLog();
  110.   /**
  111.    * Stop the event log.
  112.    */
  113.   void stopEventLog();
  114.   /**
  115.    * Enable/disable eventlog log levels/severities.
  116.    *
  117.    * @param serverity the log level/serverity.
  118.    * @return true if the severity was enabled.
  119.    */
  120.   bool setEventLogFilter(int severity, int enable);
  121.   /**
  122.    * Returns true if the log level/severity is enabled.
  123.    *
  124.    * @param severity the severity level.
  125.    */
  126.   bool isEventLogFilterEnabled(int severity);
  127.   STATIC_CONST( NO_CONTACT_WITH_PROCESS = 5000 );
  128.   STATIC_CONST( PROCESS_NOT_CONFIGURED = 5001 );
  129.   STATIC_CONST( WRONG_PROCESS_TYPE = 5002 );
  130.   STATIC_CONST( COULD_NOT_ALLOCATE_MEMORY = 5003 );
  131.   STATIC_CONST( SEND_OR_RECEIVE_FAILED = 5005 );
  132.   STATIC_CONST( INVALID_LEVEL = 5006 );
  133.   STATIC_CONST( INVALID_ERROR_NUMBER = 5007 );
  134.   STATIC_CONST( INVALID_TRACE_NUMBER = 5008 );
  135.   STATIC_CONST( NOT_IMPLEMENTED = 5009 );
  136.   STATIC_CONST( INVALID_BLOCK_NAME = 5010 );
  137.   STATIC_CONST( CONFIG_PARAM_NOT_EXIST = 5011 );
  138.   STATIC_CONST( CONFIG_PARAM_NOT_UPDATEABLE = 5012 );
  139.   STATIC_CONST( VALUE_WRONG_FORMAT_INT_EXPECTED = 5013 );
  140.   STATIC_CONST( VALUE_TOO_LOW = 5014 );
  141.   STATIC_CONST( VALUE_TOO_HIGH = 5015 );
  142.   STATIC_CONST( VALUE_WRONG_FORMAT_BOOL_EXPECTED = 5016 );
  143.   STATIC_CONST( CONFIG_FILE_OPEN_WRITE_ERROR = 5017 );
  144.   STATIC_CONST( CONFIG_FILE_OPEN_READ_ERROR = 5018 );
  145.   STATIC_CONST( CONFIG_FILE_WRITE_ERROR = 5019 );
  146.   STATIC_CONST( CONFIG_FILE_READ_ERROR = 5020 );
  147.   STATIC_CONST( CONFIG_FILE_CLOSE_ERROR = 5021 );
  148.   STATIC_CONST( CONFIG_CHANGE_REFUSED_BY_RECEIVER = 5022 );
  149.   STATIC_CONST( COULD_NOT_SYNC_CONFIG_CHANGE_AGAINST_PHYSICAL_MEDIUM = 5023 );
  150.   STATIC_CONST( CONFIG_FILE_CHECKSUM_ERROR = 5024 );
  151.   STATIC_CONST( NOT_POSSIBLE_TO_SEND_CONFIG_UPDATE_TO_PROCESS_TYPE = 5025 );
  152.   STATIC_CONST( NODE_SHUTDOWN_IN_PROGESS = 5026 );
  153.   STATIC_CONST( SYSTEM_SHUTDOWN_IN_PROGRESS = 5027 );
  154.   STATIC_CONST( NODE_SHUTDOWN_WOULD_CAUSE_SYSTEM_CRASH = 5028 );
  155.   STATIC_CONST( NO_CONTACT_WITH_CLUSTER = 6666 );
  156.   STATIC_CONST( OPERATION_IN_PROGRESS = 6667 );
  157.   
  158.   STATIC_CONST( NO_CONTACT_WITH_DB_NODES = 5030 );
  159.   /**
  160.    *   This enum specifies the different signal loggig modes possible to set 
  161.    *   with the setSignalLoggingMode method.
  162.    */
  163.   enum LogMode {In, Out, InOut, Off};
  164.   /* Constructor */
  165.   MgmtSrvr(SocketServer *socket_server,
  166.    const char *config_filename,      /* Where to save config */
  167.    const char *connect_string); 
  168.   int init();
  169.   NodeId getOwnNodeId() const {return _ownNodeId;};
  170.   /**
  171.    *   Read (initial) config file, create TransporterFacade, 
  172.    *   define signals, create ConfigInfoServer.
  173.    *   @return true if succeeded, otherwise false
  174.    */
  175.   bool check_start(); // may be run before start to check that some things are ok
  176.   bool start(BaseString &error_string);
  177.   ~MgmtSrvr();
  178.   /**
  179.    * Get status on a node.
  180.    * address may point to a common area (e.g. from inet_addr)
  181.    * There is no gaurentee that it is preserved across calls.
  182.    * Copy the string if you are not going to use it immediately.
  183.    */
  184.   int status(int nodeId,
  185.      ndb_mgm_node_status * status,
  186.      Uint32 * version,
  187.      Uint32 * phase,
  188.      bool * systemShutdown,
  189.      Uint32 * dynamicId,
  190.      Uint32 * nodeGroup,
  191.      Uint32 * connectCount,
  192.      const char **address);
  193.   
  194.   // All the functions below may return any of this error codes:
  195.   // NO_CONTACT_WITH_PROCESS, PROCESS_NOT_CONFIGURED, WRONG_PROCESS_TYPE,
  196.   // COULD_NOT_ALLOCATE_MEMORY, SEND_OR_RECEIVE_FAILED
  197.   /**
  198.    * Save a configuration to permanent storage
  199.    */
  200.   int saveConfig(const Config *);
  201.   /**
  202.    * Save the running configuration
  203.    */
  204.   int saveConfig() {
  205.     return saveConfig(_config);
  206.   };
  207.   /**
  208.    * Read configuration from file, or from another MGM server
  209.    */
  210.   Config *readConfig();
  211.   /**
  212.    * Fetch configuration from another MGM server
  213.    */
  214.   Config *fetchConfig();
  215.   /**
  216.    *   Stop a node
  217.    * 
  218.    *   @param   processId: Id of the DB process to stop
  219.    *   @return  0 if succeeded, otherwise: as stated above, plus:
  220.    */
  221.   int stopNode(int nodeId, bool abort = false);
  222.   /**
  223.    *   Stop the system
  224.    */
  225.   int stop(int * cnt = 0, bool abort = false);
  226.   /**
  227.    *   print version info about a node
  228.    * 
  229.    *   @param   processId: Id of the DB process to stop
  230.    *   @return  0 if succeeded, otherwise: as stated above, plus:
  231.    */
  232.   int versionNode(int nodeId, Uint32 &version, const char **address);
  233.   /**
  234.    *   Maintenance on the system
  235.    */
  236.   int enterSingleUser(int * cnt = 0, Uint32 singleuserNodeId = 0);
  237.   /**
  238.    *   Resume from maintenance on the system
  239.    */
  240.   int exitSingleUser(int * cnt = 0, bool abort = false);
  241.   /**
  242.    *   Start DB process.
  243.    *   @param   processId: Id of the DB process to start
  244.    *   @return 0 if succeeded, otherwise: as stated above, plus:
  245.    */
  246.  int start(int processId);
  247.   /**
  248.    *   Restart a node
  249.    *   @param processId: Id of the DB process to start
  250.    */
  251.   int restartNode(int processId, bool nostart, bool initialStart, 
  252.   bool abort = false);
  253.   
  254.   /**
  255.    *   Restart the system
  256.    */
  257.   int restart(bool nostart, bool initialStart, 
  258.       bool abort = false,
  259.       int * stopCount = 0);
  260.   
  261.   struct BackupEvent {
  262.     enum Event {
  263.       BackupStarted = 1,
  264.       BackupFailedToStart = 2,
  265.       BackupCompleted = 3,
  266.       BackupAborted = 4
  267.     } Event;
  268.     
  269.     NdbNodeBitmask Nodes;
  270.     union {
  271.       struct {
  272. Uint32 BackupId;
  273.       } Started ;
  274.       struct {
  275. Uint32 ErrorCode;
  276.       } FailedToStart ;
  277.       struct {
  278. Uint32 BackupId;
  279. Uint32 NoOfBytes;
  280. Uint32 NoOfRecords;
  281. Uint32 NoOfLogBytes;
  282. Uint32 NoOfLogRecords;
  283. Uint32 startGCP;
  284. Uint32 stopGCP;
  285.       } Completed ;
  286.       struct {
  287. Uint32 BackupId;
  288. Uint32 Reason;
  289. Uint32 ErrorCode;
  290.       } Aborted ;
  291.     };
  292.   };
  293.   
  294.   /**
  295.    * Backup functionallity
  296.    */
  297.   int startBackup(Uint32& backupId, int waitCompleted= 2);
  298.   int abortBackup(Uint32 backupId);
  299.   int performBackup(Uint32* backupId);
  300.   /**
  301.    * Global Replication
  302.    */
  303.   int repCommand(Uint32* repReqId, Uint32 request, bool waitCompleted = false);
  304.   
  305.   //**************************************************************************
  306.   // Description: Set event report level for a DB process
  307.   // Parameters:
  308.   //  processId: Id of the DB process
  309.   //  level: Event report level
  310.   //  isResend: Flag to indicate for resending log levels during node restart
  311.   // Returns: 0 if succeeded, otherwise: as stated above, plus:
  312.   //  INVALID_LEVEL
  313.   //**************************************************************************
  314.   int setEventReportingLevelImpl(int processId, const EventSubscribeReq& ll);
  315.   int setNodeLogLevelImpl(int processId, const SetLogLevelOrd & ll);
  316.   /**
  317.    *   Insert an error in a DB process.
  318.    *   @param   processId: Id of the DB process
  319.    *   @param   errorNo: The error number. > 0.
  320.    *   @return  0 if succeeded, otherwise: as stated above, plus:
  321.    *            INVALID_ERROR_NUMBER
  322.    */
  323.   int insertError(int processId, int errorNo);
  324.   int setTraceNo(int processId, int traceNo);
  325.   //**************************************************************************
  326.   // Description: Set trace number in a DB process.
  327.   // Parameters:
  328.   //  processId: Id of the DB process
  329.   //  trace: Trace number
  330.   // Returns: 0 if succeeded, otherwise: as stated above, plus:
  331.   //  INVALID_TRACE_NUMBER
  332.   //**************************************************************************
  333.   int setSignalLoggingMode(int processId, LogMode mode, 
  334.    const Vector<BaseString> &blocks);
  335.   int setSignalLoggingMode(int processId, LogMode mode,
  336.    BaseString &block) {
  337.     Vector<BaseString> v;
  338.     v.push_back(block);
  339.     return setSignalLoggingMode(processId, mode, v);
  340.   }
  341.   //**************************************************************************
  342.   // Description: Set signal logging mode for blocks in a DB process.
  343.   // Parameters:
  344.   //  processId: Id of the DB process
  345.   //  mode: The log mode
  346.   //  blocks: Which blocks to be affected (container of strings)
  347.   // Returns: 0 if succeeded, otherwise: as stated above, plus:
  348.   //  INVALID_BLOCK_NAME
  349.   //**************************************************************************
  350.   int startSignalTracing(int processId);
  351.   //**************************************************************************
  352.   // Description: Start signal tracing for a DB process.
  353.   // Parameters:
  354.   //  processId: Id of the DB process
  355.   // Returns: 0 if succeeded, otherwise: as stated above.
  356.   //**************************************************************************
  357.   int stopSignalTracing(int processId);
  358.   //**************************************************************************
  359.   // Description: Stop signal tracing for a DB process.
  360.   // Parameters:
  361.   //  processId: Id of the DB process
  362.   // Returns: 0 if succeeded, otherwise: as stated above.
  363.   //**************************************************************************
  364.   /**
  365.    *   Dump State 
  366.    */
  367.   int dumpState(int processId, const Uint32 args[], Uint32 argNo);
  368.   int dumpState(int processId, const char* args);
  369.   /**
  370.    * Get next node id (node id gt that _nodeId)
  371.    *  of specified type and save it in _nodeId
  372.    *
  373.    *   @return false if none found
  374.    */
  375.   bool getNextNodeId(NodeId * _nodeId, enum ndb_mgm_node_type type) const ;
  376.   bool alloc_node_id(NodeId * _nodeId, enum ndb_mgm_node_type type,
  377.      struct sockaddr *client_addr, SOCKET_SIZE_TYPE *client_addr_len,
  378.      BaseString &error_string);
  379.   
  380.   /**
  381.    *
  382.    */
  383.   enum ndb_mgm_node_type getNodeType(NodeId) const;
  384.   /**
  385.    *   Get error text
  386.    * 
  387.    *   @param   errorCode: Error code to get a match error text for.
  388.    *   @return  The error text.
  389.    */
  390.   const char* getErrorText(int errorCode, char *buf, int buf_sz);
  391.   /**
  392.    *   Get configuration
  393.    */
  394.   const Config * getConfig() const;
  395.   /**
  396.    * Returns the node count for the specified node type.
  397.    *
  398.    *  @param type The node type.
  399.    *  @return The number of nodes of the specified type.
  400.    */
  401.   int getNodeCount(enum ndb_mgm_node_type type) const;
  402.   /**
  403.    * Returns the port number.
  404.    * @return port number.
  405.    */
  406.   int getPort() const;
  407.   int setDbParameter(int node, int parameter, const char * value, BaseString&);
  408.   
  409.   const char *get_connect_address(Uint32 node_id);
  410.   void get_connected_nodes(NodeBitmask &connected_nodes) const;
  411.   SocketServer *get_socket_server() { return m_socket_server; }
  412.   //**************************************************************************
  413. private:
  414.   //**************************************************************************
  415.   int send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type);
  416.   int sendSTOP_REQ(NodeId nodeId,
  417.    NodeBitmask &stoppedNodes,
  418.    Uint32 singleUserNodeId,
  419.    bool abort,
  420.    bool stop,
  421.    bool restart,
  422.    bool nostart,
  423.    bool initialStart);
  424.  
  425.   /**
  426.    *   Check if it is possible to send a signal to a (DB) process
  427.    *
  428.    *   @param   processId: Id of the process to send to
  429.    *   @return  0 OK, 1 process dead, 2 API or MGMT process, 3 not configured
  430.    */
  431.   int okToSendTo(NodeId nodeId, bool unCond = false);
  432.   /**
  433.    *   Get block number for a block
  434.    *
  435.    *   @param   blockName: Block to get number for
  436.    *   @return  -1 if block not found, otherwise block number
  437.    */
  438.   int getBlockNumber(const BaseString &blockName);
  439.   
  440.   //**************************************************************************
  441.   
  442.   int _blockNumber;
  443.   NodeId _ownNodeId;
  444.   SocketServer *m_socket_server;
  445.   BlockReference _ownReference; 
  446.   NdbMutex *m_configMutex;
  447.   const Config * _config;
  448.   Config * m_newConfig;
  449.   BaseString m_configFilename;
  450.   Uint32 m_nextConfigGenerationNumber;
  451.   
  452.   NodeBitmask m_reserved_nodes;
  453.   struct in_addr m_connect_address[MAX_NODES];
  454.   //**************************************************************************
  455.   // Specific signal handling methods
  456.   //**************************************************************************
  457.   static void defineSignals(int blockNumber);
  458.   //**************************************************************************
  459.   // Description: Define all signals to be sent or received for a block
  460.   // Parameters:
  461.   //  blockNumber: The block number send/receive
  462.   // Returns: -
  463.   //**************************************************************************
  464.   void handleReceivedSignal(NdbApiSignal* signal);
  465.   //**************************************************************************
  466.   // Description: This method is called from "another" thread when a signal
  467.   //  is received. If expect the received signal and succeed to handle it
  468.   //  we signal with a condition variable to the waiting
  469.   //  thread (receiveOptimisedResponse) that the signal has arrived.
  470.   // Parameters:
  471.   //  signal: The recieved signal
  472.   // Returns: -
  473.   //**************************************************************************
  474.   void handleStatus(NodeId nodeId, bool alive, bool nfComplete);
  475.   //**************************************************************************
  476.   // Description: Handle the death of a process
  477.   // Parameters:
  478.   //  processId: Id of the dead process.
  479.   // Returns: -
  480.   //**************************************************************************
  481.   //**************************************************************************
  482.   // Specific signal handling data
  483.   //**************************************************************************
  484.   //**************************************************************************
  485.   //**************************************************************************
  486.   // General signal handling methods
  487.   // This functions are more or less copied from the Ndb class.
  488.   
  489.   /**
  490.    * WaitSignalType defines states where each state define a set of signals
  491.    * we accept to receive. 
  492.    * The state is set after we have sent a signal.
  493.    * When a signal arrives we first check current state (handleReceivedSignal)
  494.    * to verify that we expect the arrived signal. 
  495.    * It's only then we are in state accepting the arrived signal 
  496.    * we handle the signal.
  497.    */
  498.   enum WaitSignalType { 
  499.     NO_WAIT, // We don't expect to receive any signal
  500.     WAIT_SET_VAR, // Accept SET_VAR_CONF and SET_VAR_REF
  501.     WAIT_SUBSCRIBE_CONF  // Accept event subscription confirmation
  502.   };
  503.   
  504.   /**
  505.    *   This function is called from "outside" of MgmtSrvr
  506.    *   when a signal is sent to MgmtSrvr.
  507.    *   @param  mgmtSrvr: The MgmtSrvr object which shall recieve the signal.
  508.    *   @param  signal: The received signal.
  509.    */
  510.   static void signalReceivedNotification(void* mgmtSrvr, 
  511.  NdbApiSignal* signal, 
  512.  struct LinearSectionPtr ptr[3]);
  513.   /**
  514.    *   Called from "outside" of MgmtSrvr when a DB process has died.
  515.    *   @param  mgmtSrvr:   The MgmtSrvr object wreceiveOptimisedResponsehich 
  516.    *                       shall receive the notification.
  517.    *   @param  processId:  Id of the dead process.
  518.    */
  519.   static void nodeStatusNotification(void* mgmSrv, Uint32 nodeId, 
  520.      bool alive, bool nfCompleted);
  521.   
  522.   /**
  523.    * An event from <i>nodeId</i> has arrived
  524.    */
  525.   void eventReport(NodeId nodeId, const Uint32 * theData);
  526.  
  527.   //**************************************************************************
  528.   //**************************************************************************
  529.   // General signal handling data
  530.   STATIC_CONST( WAIT_FOR_RESPONSE_TIMEOUT = 300000 ); // Milliseconds
  531.   // Max time to wait for a signal to arrive
  532.   NdbApiSignal* theSignalIdleList;
  533.   // List of unused signals
  534.   
  535.   Uint32 theWaitNode;
  536.   WaitSignalType theWaitState;
  537.   // State denoting a set of signals we accept to recieve.
  538.   NdbCondition* theMgmtWaitForResponseCondPtr; 
  539.   // Condition variable used when we wait for a signal to arrive/a 
  540.   // signal arrives.
  541.   // We wait in receiveOptimisedResponse and signal in handleReceivedSignal.
  542.   class TransporterFacade * theFacade;
  543.   int  sendVersionReq( int processId, Uint32 &version, const char **address);
  544.   int translateStopRef(Uint32 errCode);
  545.   
  546.   bool _isStopThread;
  547.   int _logLevelThreadSleep;
  548.   MutexVector<NodeId> m_started_nodes;
  549.   MutexVector<EventSubscribeReq> m_log_level_requests;
  550.   LogLevel m_nodeLogLevel[MAX_NODES];
  551.   enum ndb_mgm_node_type nodeTypes[MAX_NODES];
  552.   friend class MgmApiSession;
  553.   friend class Ndb_mgmd_event_service;
  554.   Ndb_mgmd_event_service m_event_listner;
  555.   
  556.   /**
  557.    * Handles the thread wich upon a 'Node is started' event will
  558.    * set the node's previous loglevel settings.
  559.    */
  560.   struct NdbThread* _logLevelThread;
  561.   static void *logLevelThread_C(void *);
  562.   void logLevelThreadRun();
  563.   
  564.   Config *_props;
  565.   ConfigRetriever *m_config_retriever;
  566. };
  567. inline
  568. const Config *
  569. MgmtSrvr::getConfig() const {
  570.   return _config;
  571. }
  572. #endif // MgmtSrvr_H