summaryrefslogtreecommitdiff
path: root/ndb/src/old_files/rep/transfer/TransPS.hpp
blob: 0464b9e47c03844670fafd1f9c2830b1019164a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* Copyright (C) 2003 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#ifndef TransPS_HPP
#define TransPS_HPP

#include <NdbTick.h>
#include <NdbMain.h>
#include <NdbOut.hpp>
#include <NdbSleep.h>

#include <TransporterDefinitions.hpp>
#include <TransporterFacade.hpp>
#include <ClusterMgr.hpp>

#include <rep/storage/GCIContainerPS.hpp>

#include <signaldata/RepImpl.hpp>

#include <rep/SignalQueue.hpp>
#include <rep/ExtSender.hpp>

#include <rep/rep_version.hpp>

extern "C" {
static void * signalExecThread_C(void *);
}

/**
 * @class TransPS
 * @brief Responsible for REP-REP interface in Primary System role
 */
class TransPS {
public:
  /***************************************************************************
   * Constructor / Destructor
   ***************************************************************************/
  TransPS(GCIContainerPS * gciContainer);
  ~TransPS();

  void init(TransporterFacade * tf, const char * connectString = NULL);

  /***************************************************************************
   * Public Methods
   ***************************************************************************/
  ExtSender *  getRepSender()                { return m_repSender; };
  void         setGrepSender(ExtSender * es) { m_grepSender = es; };

private: 
  /***************************************************************************
   * Private Methods
   ***************************************************************************/
  /**
   *  SignalQueue executor thread
   */

  friend void * signalExecThread_C(void *);

  void signalExecThreadRun();

  static void execSignal(void* signalSender, NdbApiSignal* signal, 
			 class LinearSectionPtr ptr[3]);
  
  static void execNodeStatus(void* signalSender, NodeId, 
			     bool alive, bool nfCompleted);

  void sendSignalRep(NdbApiSignal * s);
  void sendSignalGrep(NdbApiSignal * s);

  void sendFragmentedSignalRep(NdbApiSignal * s, LinearSectionPtr ptr[3],
			       Uint32 sections );
  void sendFragmentedSignalGrep(NdbApiSignal * s, LinearSectionPtr ptr[3],
				Uint32 sections );
  
  /***************************************************************************
   * Signal executors
   ***************************************************************************/
  void execREP_CLEAR_PS_GCIBUFFER_REQ(NdbApiSignal*);
  void execREP_GET_GCI_REQ(NdbApiSignal*);
  void execREP_GET_GCIBUFFER_REQ(NdbApiSignal*);

  /***************************************************************************
   * Ref signal senders
   ***************************************************************************/
  void sendREP_GET_GCI_REF(NdbApiSignal* signal, Uint32 nodeGrp,
			   Uint32 firstPSGCI, Uint32 lastPSGCI,
			   GrepError::Code err);
  
  void sendREP_CLEAR_PS_GCIBUFFER_REF(NdbApiSignal* signal, 
				      Uint32 firstGCI, Uint32 lastGCI,
				      Uint32 currentGCI, Uint32 nodeGrp,
				      GrepError::Code err);

  void sendREP_GET_GCIBUFFER_REF(NdbApiSignal* signal,
				 Uint32 firstGCI, Uint32 lastGCI,
				 Uint32 nodeGrp,
				 GrepError::Code err);

  /***************************************************************************
   * Other Methods
   ***************************************************************************/
  void transferPages(Uint32 firstGCI, Uint32 lastGCI, Uint32 id, 
		     Uint32 nodeGrp, NdbApiSignal* signal);

  /*************
   * Variables
   *************/
  Uint32                  m_ownNodeId;          ///< NodeId of this node
  Uint32                  m_ownBlockNo;         ///< BlockNo of this "block"
  BlockReference          m_ownRef;             ///< Reference to this 

  BlockReference          m_extRepRef;          ///< Node ref of REP at SS

  ExtSender *             m_grepSender;         ///< Responsible send to GREP
  ExtSender *             m_repSender;          ///< Responsible send to REP
  
  struct NdbThread *      m_signalExecThread;
  class SignalQueue       m_signalRecvQueue;

  GCIContainerPS *	  m_gciContainerPS;     ///< Ref to gci container.
};

#endif