MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DbtuxProxy.cpp
1 /* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
2 
3  This program is free software; you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation; version 2 of the License.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software
14  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
15 
16 #include "DbtuxProxy.hpp"
17 #include "Dbtux.hpp"
18 #include "../dblqh/DblqhCommon.hpp"
19 
20 DbtuxProxy::DbtuxProxy(Block_context& ctx) :
21  LocalProxy(DBTUX, ctx)
22 {
23  // GSN_ALTER_INDX_IMPL_REQ
24  addRecSignal(GSN_ALTER_INDX_IMPL_REQ, &DbtuxProxy::execALTER_INDX_IMPL_REQ);
25  addRecSignal(GSN_ALTER_INDX_IMPL_CONF, &DbtuxProxy::execALTER_INDX_IMPL_CONF);
26  addRecSignal(GSN_ALTER_INDX_IMPL_REF, &DbtuxProxy::execALTER_INDX_IMPL_REF);
27 
28  // GSN_INDEX_STAT_IMPL_REQ
29  addRecSignal(GSN_INDEX_STAT_IMPL_REQ, &DbtuxProxy::execINDEX_STAT_IMPL_REQ);
30  addRecSignal(GSN_INDEX_STAT_IMPL_CONF, &DbtuxProxy::execINDEX_STAT_IMPL_CONF);
31  addRecSignal(GSN_INDEX_STAT_IMPL_REF, &DbtuxProxy::execINDEX_STAT_IMPL_REF);
32 
33  // GSN_INDEX_STAT_REP
34  addRecSignal(GSN_INDEX_STAT_REP, &DbtuxProxy::execINDEX_STAT_REP);
35 }
36 
37 DbtuxProxy::~DbtuxProxy()
38 {
39 }
40 
42 DbtuxProxy::newWorker(Uint32 instanceNo)
43 {
44  return new Dbtux(m_ctx, instanceNo);
45 }
46 
47 // GSN_ALTER_INDX_IMPL_REQ
48 
49 void
50 DbtuxProxy::execALTER_INDX_IMPL_REQ(Signal* signal)
51 {
52  const AlterIndxImplReq* req = (const AlterIndxImplReq*)signal->getDataPtr();
53  Ss_ALTER_INDX_IMPL_REQ& ss = ssSeize<Ss_ALTER_INDX_IMPL_REQ>();
54  ss.m_req = *req;
55  ndbrequire(signal->getLength() == AlterIndxImplReq::SignalLength);
56  sendREQ(signal, ss);
57 }
58 
59 void
60 DbtuxProxy::sendALTER_INDX_IMPL_REQ(Signal* signal, Uint32 ssId,
61  SectionHandle * handle)
62 {
63  Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
64 
65  AlterIndxImplReq* req = (AlterIndxImplReq*)signal->getDataPtrSend();
66  *req = ss.m_req;
67  req->senderRef = reference();
68  req->senderData = ssId;
69  sendSignalNoRelease(workerRef(ss.m_worker), GSN_ALTER_INDX_IMPL_REQ,
70  signal, AlterIndxImplReq::SignalLength, JBB, handle);
71 }
72 
73 void
74 DbtuxProxy::execALTER_INDX_IMPL_CONF(Signal* signal)
75 {
76  const AlterIndxImplConf* conf = (const AlterIndxImplConf*)signal->getDataPtr();
77  Uint32 ssId = conf->senderData;
78  Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
79  recvCONF(signal, ss);
80 }
81 
82 void
83 DbtuxProxy::execALTER_INDX_IMPL_REF(Signal* signal)
84 {
85  const AlterIndxImplRef* ref = (const AlterIndxImplRef*)signal->getDataPtr();
86  Uint32 ssId = ref->senderData;
87  Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
88  recvREF(signal, ss, ref->errorCode);
89 }
90 
91 void
92 DbtuxProxy::sendALTER_INDX_IMPL_CONF(Signal* signal, Uint32 ssId)
93 {
94  Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
95  BlockReference dictRef = ss.m_req.senderRef;
96 
97  if (!lastReply(ss))
98  return;
99 
100  if (ss.m_error == 0) {
101  jam();
102  AlterIndxImplConf* conf = (AlterIndxImplConf*)signal->getDataPtrSend();
103  conf->senderRef = reference();
104  conf->senderData = ss.m_req.senderData;
105  sendSignal(dictRef, GSN_ALTER_INDX_IMPL_CONF,
106  signal, AlterIndxImplConf::SignalLength, JBB);
107  } else {
108  AlterIndxImplRef* ref = (AlterIndxImplRef*)signal->getDataPtrSend();
109  ref->senderRef = reference();
110  ref->senderData = ss.m_req.senderData;
111  ref->errorCode = ss.m_error;
112  sendSignal(dictRef, GSN_ALTER_INDX_IMPL_REF,
113  signal, AlterIndxImplRef::SignalLength, JBB);
114  }
115 
116  ssRelease<Ss_ALTER_INDX_IMPL_REQ>(ssId);
117 }
118 
119 // GSN_INDEX_STAT_IMPL_REQ
120 
121 void
122 DbtuxProxy::execINDEX_STAT_IMPL_REQ(Signal* signal)
123 {
124  jamEntry();
125  const IndexStatImplReq* req =
126  (const IndexStatImplReq*)signal->getDataPtr();
127  Ss_INDEX_STAT_IMPL_REQ& ss = ssSeize<Ss_INDEX_STAT_IMPL_REQ>();
128  ss.m_req = *req;
129  ndbrequire(signal->getLength() == IndexStatImplReq::SignalLength);
130  sendREQ(signal, ss);
131 }
132 
133 void
134 DbtuxProxy::sendINDEX_STAT_IMPL_REQ(Signal* signal, Uint32 ssId,
135  SectionHandle*)
136 {
137  Ss_INDEX_STAT_IMPL_REQ& ss = ssFind<Ss_INDEX_STAT_IMPL_REQ>(ssId);
138 
139  IndexStatImplReq* req = (IndexStatImplReq*)signal->getDataPtrSend();
140  *req = ss.m_req;
141  req->senderRef = reference();
142  req->senderData = ssId;
143 
144  const Uint32 instance = workerInstance(ss.m_worker);
145  NdbLogPartInfo lpinfo(instance);
146 
147  //XXX remove unused
148  switch (req->requestType) {
149  case IndexStatReq::RT_START_MON:
150  /*
151  * DICT sets fragId if assigned frag is on this node, or else ZNIL
152  * to turn off any possible old assignment. In MT-LQH we also have
153  * to check which worker owns the frag.
154  */
155  if (req->fragId != ZNIL
156  && !lpinfo.partNoOwner(req->indexId, req->fragId)) {
157  jam();
158  req->fragId = ZNIL;
159  }
160  break;
161  case IndexStatReq::RT_STOP_MON:
162  /*
163  * DICT sets fragId to ZNIL always. There is no (pointless) check
164  * to see if the frag was ever assigned.
165  */
166  ndbrequire(req->fragId == ZNIL);
167  break;
168  case IndexStatReq::RT_SCAN_FRAG:
169  ndbrequire(req->fragId != ZNIL);
170  if (!lpinfo.partNoOwner(req->indexId, req->fragId)) {
171  jam();
172  skipReq(ss);
173  return;
174  }
175  break;
176  case IndexStatReq::RT_CLEAN_NEW:
177  case IndexStatReq::RT_CLEAN_OLD:
178  case IndexStatReq::RT_CLEAN_ALL:
179  ndbrequire(req->fragId == ZNIL);
180  break;
181  case IndexStatReq::RT_DROP_HEAD:
182  /*
183  * Only one client can do the PK-delete of the head record. We use
184  * of course the worker which owns the assigned fragment.
185  */
186  ndbrequire(req->fragId != ZNIL);
187  if (!lpinfo.partNoOwner(req->indexId, req->fragId)) {
188  jam();
189  skipReq(ss);
190  return;
191  }
192  break;
193  default:
194  ndbrequire(false);
195  break;
196  }
197 
198  sendSignal(workerRef(ss.m_worker), GSN_INDEX_STAT_IMPL_REQ,
199  signal, IndexStatImplReq::SignalLength, JBB);
200 }
201 
202 void
203 DbtuxProxy::execINDEX_STAT_IMPL_CONF(Signal* signal)
204 {
205  jamEntry();
206  const IndexStatImplConf* conf =
207  (const IndexStatImplConf*)signal->getDataPtr();
208  Uint32 ssId = conf->senderData;
209  Ss_INDEX_STAT_IMPL_REQ& ss = ssFind<Ss_INDEX_STAT_IMPL_REQ>(ssId);
210  recvCONF(signal, ss);
211 }
212 
213 void
214 DbtuxProxy::execINDEX_STAT_IMPL_REF(Signal* signal)
215 {
216  jamEntry();
217  const IndexStatImplRef* ref = (const IndexStatImplRef*)signal->getDataPtr();
218  Uint32 ssId = ref->senderData;
219  Ss_INDEX_STAT_IMPL_REQ& ss = ssFind<Ss_INDEX_STAT_IMPL_REQ>(ssId);
220  recvREF(signal, ss, ref->errorCode);
221 }
222 
223 void
224 DbtuxProxy::sendINDEX_STAT_IMPL_CONF(Signal* signal, Uint32 ssId)
225 {
226  Ss_INDEX_STAT_IMPL_REQ& ss = ssFind<Ss_INDEX_STAT_IMPL_REQ>(ssId);
227  BlockReference dictRef = ss.m_req.senderRef;
228 
229  if (!lastReply(ss))
230  return;
231 
232  if (ss.m_error == 0) {
233  jam();
234  IndexStatImplConf* conf = (IndexStatImplConf*)signal->getDataPtrSend();
235  conf->senderRef = reference();
236  conf->senderData = ss.m_req.senderData;
237  sendSignal(dictRef, GSN_INDEX_STAT_IMPL_CONF,
238  signal, IndexStatImplConf::SignalLength, JBB);
239  } else {
240  IndexStatImplRef* ref = (IndexStatImplRef*)signal->getDataPtrSend();
241  ref->senderRef = reference();
242  ref->senderData = ss.m_req.senderData;
243  ref->errorCode = ss.m_error;
244  sendSignal(dictRef, GSN_INDEX_STAT_IMPL_REF,
245  signal, IndexStatImplRef::SignalLength, JBB);
246  }
247 
248  ssRelease<Ss_INDEX_STAT_IMPL_REQ>(ssId);
249 }
250 
251 // GSN_INDEX_STAT_REP
252 
253 void
254 DbtuxProxy::execINDEX_STAT_REP(Signal* signal)
255 {
256  jamEntry();
257  const IndexStatRep* rep =
258  (const IndexStatRep*)signal->getDataPtr();
259  Ss_INDEX_STAT_REP& ss = ssSeize<Ss_INDEX_STAT_REP>();
260  ss.m_rep = *rep;
261  ndbrequire(signal->getLength() == IndexStatRep::SignalLength);
262  sendREQ(signal, ss);
263  ssRelease<Ss_INDEX_STAT_REP>(ss);
264 }
265 
266 void
267 DbtuxProxy::sendINDEX_STAT_REP(Signal* signal, Uint32 ssId,
268  SectionHandle*)
269 {
270  Ss_INDEX_STAT_REP& ss = ssFind<Ss_INDEX_STAT_REP>(ssId);
271 
272  IndexStatRep* rep = (IndexStatRep*)signal->getDataPtrSend();
273  *rep = ss.m_rep;
274  rep->senderData = reference();
275  rep->senderData = ssId;
276 
277  const Uint32 instance = workerInstance(ss.m_worker);
278  NdbLogPartInfo lpinfo(instance);
279 
280  ndbrequire(rep->fragId != ZNIL);
281  if (!lpinfo.partNoOwner(rep->indexId, rep->fragId)) {
282  jam();
283  skipReq(ss);
284  return;
285  }
286 
287  sendSignal(workerRef(ss.m_worker), GSN_INDEX_STAT_REP,
288  signal, IndexStatRep::SignalLength, JBB);
289 }
290 
291 BLOCK_FUNCTIONS(DbtuxProxy)