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

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 REP_STATE_HPP
  14. #define REP_STATE_HPP
  15. #include <GrepError.hpp>
  16. #include <signaldata/GrepImpl.hpp>
  17. #include <rep/repapi/repapi.h>
  18. #include <rep/ExtSender.hpp>
  19. #include <rep/adapters/AppNDB.hpp>
  20. #include <Properties.hpp>
  21. #include "Channel.hpp"
  22. #include "Interval.hpp"
  23. #define REQUESTOR_EXECUTES_NEEDED_FOR_UNKNOWN_CONNECTION 5
  24. class NdbApiSignal;
  25. /**
  26.  * @class RepState
  27.  * @brief The main information about the replication
  28.  */
  29. class RepState
  30. {
  31. public:
  32.   RepState();
  33.   ~RepState();
  34.   void init(ExtSender * extSender) { m_extSender = extSender; }
  35.   /***************************************************************************
  36.    * Callback functions 
  37.    *
  38.    * These are used when RepState wants to do something
  39.    ***************************************************************************/
  40.   typedef void (FuncRequestCreateSubscriptionId) 
  41.     (void * cbObj, NdbApiSignal* signal);
  42.   
  43.   typedef void (FuncRequestCreateSubscription) 
  44.     (void * cbObj, NdbApiSignal* signal, Uint32 subId, 
  45.      Uint32 subKey , 
  46.      Vector <struct table *> * selectedTables);
  47.   
  48.   typedef void (FuncRequestRemoveSubscription) 
  49.     (void * cbObj, NdbApiSignal* signal, Uint32 subId, Uint32 subKey);
  50.     
  51.   typedef void (FuncRequestTransfer) 
  52.     (void * cbObj, NdbApiSignal* signal, 
  53.      Uint32 nodeGrp, Uint32 first, Uint32 last);
  54.   typedef void (FuncRequestApply)
  55.     (void * cbObj, NdbApiSignal* signal, 
  56.      Uint32 nodeGrp, Uint32 first, Uint32 last, Uint32 force); 
  57.   typedef void (FuncRequestDeleteSS)
  58.     (void * cbObj, NdbApiSignal* signal, 
  59.      Uint32 nodeGrp, Uint32 first, Uint32 last); 
  60.   typedef void (FuncRequestDeletePS)
  61.     (void * cbObj, NdbApiSignal* signal, 
  62.      Uint32 nodeGrp, Uint32 first, Uint32 last); 
  63.   typedef void (FuncRequestStartMetaLog)
  64.     (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey);
  65.   
  66.   typedef void (FuncRequestStartDataLog)
  67.     (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey);
  68.   typedef void (FuncRequestStartMetaScan)
  69.     (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey);    
  70.   typedef void (FuncRequestStartDataScan)
  71.     (void * cbObj, NdbApiSignal * signal, Uint32 subId, Uint32 subKey);
  72.   typedef void (FuncRequestEpochInfo)
  73.     (void * cbObj, NdbApiSignal * signal, Uint32 nodeGrp);
  74.   /***************************************************************************
  75.    *
  76.    ***************************************************************************/
  77.   void setSubscriptionRequests(FuncRequestCreateSubscriptionId f1,
  78.        FuncRequestCreateSubscription f2,
  79.        FuncRequestRemoveSubscription f3);
  80.   void setIntervalRequests(FuncRequestTransfer * f1, 
  81.    FuncRequestApply * f2,
  82.    FuncRequestDeleteSS * f3, 
  83.    FuncRequestDeletePS * f4);
  84.   void setStartRequests(FuncRequestStartMetaLog * f5,
  85. FuncRequestStartDataLog * f6,
  86. FuncRequestStartMetaScan * f7,
  87. FuncRequestStartDataScan * f8,
  88. FuncRequestEpochInfo * f9);
  89.   /***************************************************************************
  90.    * Enablings 
  91.    ***************************************************************************/
  92.   bool isEnabled()          { return m_channel.m_requestorEnabled; }
  93.   bool isTransferEnabled()  { return m_channel.m_transferEnabled; }
  94.   bool isApplyEnabled()     { return m_channel.m_applyEnabled; }
  95.   bool isDeleteEnabled()    { return m_channel.m_deleteEnabled; }
  96.   bool isAutoStartEnabled() { return m_channel.m_autoStartEnabled; }
  97.   void enable()             { m_channel.m_requestorEnabled = true; }
  98.   void enableTransfer()     { m_channel.m_transferEnabled = true; }
  99.   void enableApply()        { m_channel.m_applyEnabled = true; }
  100.   void enableDelete()       { m_channel.m_deleteEnabled = true; }
  101.   void enableAutoStart()    { m_channel.m_autoStartEnabled = true; }
  102.   void disable()            { m_channel.m_requestorEnabled = false; }
  103.   void disableTransfer()    { m_channel.m_transferEnabled = false; }
  104.   void disableApply()       { m_channel.m_applyEnabled = false;}
  105.   void disableDelete()      { m_channel.m_deleteEnabled = false; }
  106.   void disableAutoStart()   { m_channel.m_autoStartEnabled = false; }
  107.   /***************************************************************************
  108.    * Node groups
  109.    ***************************************************************************/
  110.   void   setNoOfNodeGroups(Uint32 n) { m_channel.setNoOfNodeGroups(n); }
  111.   Uint32 getNoOfNodeGroups()         { return m_channel.getNoOfNodeGroups(); }
  112.   /***************************************************************************
  113.    * Event reporting to RepState
  114.    *
  115.    * These are used to update the state of the Requestor when something
  116.    * has happend.
  117.    ***************************************************************************/
  118.   void request(GrepReq::Request request);
  119.   //GrepError::Code  createSubscription(Uint32 subId, Uint32 subKey);
  120.   GrepError::Code protectedExecute();
  121.   GrepError::Code protectedRequest(GrepReq::Request request, Uint32 arg);
  122.   GrepError::Code protectedRequest(GrepReq::Request request, 
  123.    Uint32 arg1, 
  124.    Uint32 arg2);
  125.   GrepError::Code protectedAddTable(const char * fullTableName);
  126.   GrepError::Code protectedRemoveTable(const char * fullTableName);
  127.   GrepError::Code add(Channel::Position s, Uint32 nodeGrp, const Interval i);
  128.   GrepError::Code clear(Channel::Position s, Uint32 nodeGrp, const Interval i);
  129.   
  130.   void eventSubscriptionDeleted(Uint32 subId, Uint32 subKey);
  131.   void eventMetaLogStarted(NdbApiSignal*, Uint32 subId, Uint32 subKey);
  132.   void eventDataLogStarted(NdbApiSignal*, Uint32 subId, Uint32 subKey);
  133.   void eventMetaScanCompleted(NdbApiSignal*, Uint32 subId, Uint32 subKey,
  134.       Interval epochs);
  135.   void eventDataScanCompleted(NdbApiSignal*, Uint32 subId, Uint32 subKey,
  136.       Interval epochs);
  137.   void eventMetaScanFailed(Uint32 subId, Uint32 subKey, GrepError::Code error);
  138.   void eventDataScanFailed(Uint32 subId, Uint32 subKey, GrepError::Code error);
  139.                   
  140.   /**
  141.    * @fn sendInsertConf
  142.    * @param gci - the gci of the applied GCIBuffer.
  143.    * @param nodeGrp - the nodeGrp of the applied GCIBuffer.
  144.    */
  145.   void eventInsertConf(Uint32 gci, Uint32 nodeGrp);
  146.   /**
  147.    * @fn sendInsertRef
  148.    * @param gci - the gci of the applied GCIBuffer.
  149.    * @param nodeGrp - the nodeGrp of the applied GCIBuffer.
  150.    * @param tableId - the table of the applied GCIBuffer.
  151.    */
  152.   void eventInsertRef(Uint32 gci, Uint32 nodeGrp, Uint32 tableId,
  153.       GrepError::Code err);  
  154.   void eventCreateTableRef(Uint32 gci,   
  155.    Uint32 tableId, 
  156.    const char * tableName,
  157.    GrepError::Code err) ;
  158.   void eventSubscriptionIdCreated(Uint32 subId, Uint32 subKey);
  159.   void eventSubscriptionIdCreateFailed(Uint32 subId, Uint32 subKey, 
  160.        GrepError::Code error);
  161.   void eventSubscriptionCreated(Uint32 subId, Uint32 subKey);
  162.   void eventSubscriptionCreateFailed(Uint32 subId, Uint32 subKey,
  163.      GrepError::Code error);
  164.   void eventMetaLogStartFailed(Uint32 subId, Uint32 subKey,
  165.        GrepError::Code error);
  166.   void eventDataLogStartFailed(Uint32 subId, Uint32 subKey,
  167.        GrepError::Code error);
  168.     
  169.   void eventNodeConnected(Uint32 nodeId);
  170.   void eventNodeDisconnected(Uint32 nodeId);
  171.   void eventNodeConnectable(Uint32 nodeId);
  172.   void printStatus();
  173.   Properties * getStatus();
  174.   Properties * query(QueryCounter counter, Uint32 replicationId);
  175.   Uint32 getSubId()   { return m_channel.getSubId(); }
  176.   Uint32 getSubKey () { return m_channel.getSubKey(); }
  177.   void setApplier(class AppNDB * app) { m_applier = app; }
  178.   void setGCIContainer(class GCIContainer * c) { m_gciContainer = c; }
  179.   /* @todo should be private */
  180.   Channel                  m_channel;
  181. private:
  182.   /***************************************************************************
  183.    * PRIVATE ATTRIBUTES
  184.    ***************************************************************************/
  185.   ExtSender *              m_extSender;
  186.   AppNDB *                 m_applier;
  187.   GCIContainer *           m_gciContainer;
  188.   Uint32                   m_subIdToRemove;
  189.   Uint32                   m_subKeyToRemove;
  190.   enum Connected 
  191.   {
  192.     UNKNOWN,           ///< 
  193.     CONNECTED,         ///< Recently received info from (all needed) PS REP
  194.     DISCONNECTED,      ///< Received disconnect info from (some needed) PS REP
  195.     CONNECTABLE        ///< Received disconnect info from (some needed) PS REP
  196.   };
  197.   Connected                m_connected;
  198.   Connected                m_repConnected;
  199.   Uint32                   m_connected_counter;
  200.   NdbMutex *               m_mutex;
  201.   /** @todo Should be channel-specific */
  202.   Uint32                   m_stopEpoch;
  203.   /***************************************************************************
  204.    * PRIVATE METHODS
  205.    ***************************************************************************/
  206.   GrepError::Code execute(NdbApiSignal*);
  207.   GrepError::Code request(GrepReq::Request req, 
  208.   Uint32 arg1,
  209.   Uint32 arg2,
  210.   NdbApiSignal*);
  211.   FuncRequestCreateSubscriptionId  * m_funcRequestCreateSubscriptionId;
  212.   FuncRequestCreateSubscription    * m_funcRequestCreateSubscription;
  213.   FuncRequestRemoveSubscription    * m_funcRequestRemoveSubscription;
  214.   FuncRequestTransfer              * m_funcRequestTransfer;
  215.   FuncRequestApply                 * m_funcRequestApply;
  216.   FuncRequestDeleteSS              * m_funcRequestDeleteSS;
  217.   FuncRequestDeletePS              * m_funcRequestDeletePS;
  218.   FuncRequestStartMetaLog          * m_funcRequestStartMetaLog;
  219.   FuncRequestStartDataLog          * m_funcRequestStartDataLog;
  220.   FuncRequestStartMetaScan         * m_funcRequestStartMetaScan;
  221.   FuncRequestStartDataScan         * m_funcRequestStartDataScan;
  222.   FuncRequestEpochInfo             * m_funcRequestEpochInfo;
  223.   void requestTransfer(NdbApiSignal * signal);
  224.   void requestApply(NdbApiSignal * signal);
  225.   void requestDelete(NdbApiSignal * signal);
  226.   void requestEpochInfo(NdbApiSignal * signal);
  227.   void getEpochState(Channel::Position pos, Properties * p);
  228.   friend void testRepState();
  229. };
  230. #endif