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