2
Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
4
This program is free software; you can redistribute it and/or modify
5
it under the terms of the GNU General Public License as published by
6
the Free Software Foundation; version 2 of the License.
8
This program is distributed in the hope that it will be useful,
9
but WITHOUT ANY WARRANTY; without even the implied warranty of
10
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License
14
along with this program; if not, write to the Free Software
15
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
#include "DbtcProxy.hpp"
21
DbtcProxy::DbtcProxy(Block_context& ctx) :
25
addRecSignal(GSN_TC_SCHVERREQ, &DbtcProxy::execTC_SCHVERREQ);
26
addRecSignal(GSN_TC_SCHVERCONF, &DbtcProxy::execTC_SCHVERCONF);
29
addRecSignal(GSN_TAB_COMMITREQ, &DbtcProxy::execTAB_COMMITREQ);
30
addRecSignal(GSN_TAB_COMMITCONF, &DbtcProxy::execTAB_COMMITCONF);
31
addRecSignal(GSN_TAB_COMMITREF, &DbtcProxy::execTAB_COMMITREF);
34
addRecSignal(GSN_TCSEIZEREQ, &DbtcProxy::execTCSEIZEREQ);
37
addRecSignal(GSN_TCGETOPSIZEREQ, &DbtcProxy::execTCGETOPSIZEREQ);
38
addRecSignal(GSN_TCGETOPSIZECONF, &DbtcProxy::execTCGETOPSIZECONF);
41
addRecSignal(GSN_TC_CLOPSIZEREQ, &DbtcProxy::execTC_CLOPSIZEREQ);
42
addRecSignal(GSN_TC_CLOPSIZECONF, &DbtcProxy::execTC_CLOPSIZECONF);
44
// GSN_GCP_NOMORETRANS
45
addRecSignal(GSN_GCP_NOMORETRANS, &DbtcProxy::execGCP_NOMORETRANS);
46
addRecSignal(GSN_GCP_TCFINISHED, &DbtcProxy::execGCP_TCFINISHED);
49
addRecSignal(GSN_API_FAILREQ, &DbtcProxy::execAPI_FAILREQ);
50
addRecSignal(GSN_API_FAILCONF, &DbtcProxy::execAPI_FAILCONF);
52
// GSN_PREP_DROP_TAB_REQ
53
addRecSignal(GSN_PREP_DROP_TAB_REQ, &DbtcProxy::execPREP_DROP_TAB_REQ);
54
addRecSignal(GSN_PREP_DROP_TAB_CONF, &DbtcProxy::execPREP_DROP_TAB_CONF);
55
addRecSignal(GSN_PREP_DROP_TAB_REF, &DbtcProxy::execPREP_DROP_TAB_REF);
58
addRecSignal(GSN_DROP_TAB_REQ, &DbtcProxy::execDROP_TAB_REQ);
59
addRecSignal(GSN_DROP_TAB_CONF, &DbtcProxy::execDROP_TAB_CONF);
60
addRecSignal(GSN_DROP_TAB_REF, &DbtcProxy::execDROP_TAB_REF);
63
addRecSignal(GSN_ALTER_TAB_REQ, &DbtcProxy::execALTER_TAB_REQ);
64
addRecSignal(GSN_ALTER_TAB_CONF, &DbtcProxy::execALTER_TAB_CONF);
65
addRecSignal(GSN_ALTER_TAB_REF, &DbtcProxy::execALTER_TAB_REF);
67
// GSN_CREATE_INDX_IMPL_REQ
68
addRecSignal(GSN_CREATE_INDX_IMPL_REQ, &DbtcProxy::execCREATE_INDX_IMPL_REQ);
69
addRecSignal(GSN_CREATE_INDX_IMPL_CONF,&DbtcProxy::execCREATE_INDX_IMPL_CONF);
70
addRecSignal(GSN_CREATE_INDX_IMPL_REF, &DbtcProxy::execCREATE_INDX_IMPL_REF);
72
// GSN_ALTER_INDX_IMPL_REQ
73
addRecSignal(GSN_ALTER_INDX_IMPL_REQ, &DbtcProxy::execALTER_INDX_IMPL_REQ);
74
addRecSignal(GSN_ALTER_INDX_IMPL_CONF,&DbtcProxy::execALTER_INDX_IMPL_CONF);
75
addRecSignal(GSN_ALTER_INDX_IMPL_REF, &DbtcProxy::execALTER_INDX_IMPL_REF);
77
// GSN_DROP_INDX_IMPL_REQ
78
addRecSignal(GSN_DROP_INDX_IMPL_REQ, &DbtcProxy::execDROP_INDX_IMPL_REQ);
79
addRecSignal(GSN_DROP_INDX_IMPL_CONF,&DbtcProxy::execDROP_INDX_IMPL_CONF);
80
addRecSignal(GSN_DROP_INDX_IMPL_REF, &DbtcProxy::execDROP_INDX_IMPL_REF);
82
// GSN_TAKE_OVERTCCONF
83
addRecSignal(GSN_TAKE_OVERTCCONF,&DbtcProxy::execTAKE_OVERTCCONF);
85
m_tc_seize_req_instance = 0;
88
DbtcProxy::~DbtcProxy()
93
DbtcProxy::newWorker(Uint32 instanceNo)
95
return new Dbtc(m_ctx, instanceNo);
101
DbtcProxy::callNDB_STTOR(Signal* signal)
103
Ss_READ_NODES_REQ& ss = c_ss_READ_NODESREQ;
104
ndbrequire(ss.m_gsn == 0);
106
const Uint32 startPhase = signal->theData[2];
107
switch (startPhase) {
109
ss.m_gsn = GSN_NDB_STTOR;
110
sendREAD_NODESREQ(signal);
113
backNDB_STTOR(signal);
121
DbtcProxy::execTC_SCHVERREQ(Signal* signal)
123
Ss_TC_SCHVERREQ& ss = ssSeize<Ss_TC_SCHVERREQ>(1);
125
const TcSchVerReq* req = (const TcSchVerReq*)signal->getDataPtr();
132
DbtcProxy::sendTC_SCHVERREQ(Signal* signal, Uint32 ssId, SectionHandle*)
134
Ss_TC_SCHVERREQ& ss = ssFind<Ss_TC_SCHVERREQ>(ssId);
136
TcSchVerReq* req = (TcSchVerReq*)signal->getDataPtrSend();
138
req->senderRef = reference();
139
req->senderData = ssId;
140
sendSignal(workerRef(ss.m_worker), GSN_TC_SCHVERREQ,
141
signal, TcSchVerReq::SignalLength, JBB);
145
DbtcProxy::execTC_SCHVERCONF(Signal* signal)
147
const TcSchVerConf* conf = (const TcSchVerConf*)signal->getDataPtr();
148
Uint32 ssId = conf->senderData;
149
Ss_TC_SCHVERREQ& ss = ssFind<Ss_TC_SCHVERREQ>(ssId);
150
recvCONF(signal, ss);
154
DbtcProxy::sendTC_SCHVERCONF(Signal* signal, Uint32 ssId)
156
Ss_TC_SCHVERREQ& ss = ssFind<Ss_TC_SCHVERREQ>(ssId);
157
BlockReference dictRef = ss.m_req.senderRef;
162
TcSchVerConf* conf = (TcSchVerConf*)signal->getDataPtrSend();
163
conf->senderRef = reference();
164
conf->senderData = ss.m_req.senderData;
165
sendSignal(dictRef, GSN_TC_SCHVERCONF,
166
signal, TcSchVerConf::SignalLength, JBB);
168
ssRelease<Ss_TC_SCHVERREQ>(ssId);
171
// GSN_TAB_COMMITREQ [ sub-op ]
174
DbtcProxy::execTAB_COMMITREQ(Signal* signal)
176
Ss_TAB_COMMITREQ& ss = ssSeize<Ss_TAB_COMMITREQ>(1); // lost connection
178
const TabCommitReq* req = (const TabCommitReq*)signal->getDataPtr();
184
DbtcProxy::sendTAB_COMMITREQ(Signal* signal, Uint32 ssId, SectionHandle*)
186
Ss_TAB_COMMITREQ& ss = ssFind<Ss_TAB_COMMITREQ>(ssId);
188
TabCommitReq* req = (TabCommitReq*)signal->getDataPtrSend();
189
req->senderRef = reference();
190
req->senderData = ssId;
191
req->tableId = ss.m_req.tableId;
192
sendSignal(workerRef(ss.m_worker), GSN_TAB_COMMITREQ,
193
signal, TabCommitReq::SignalLength, JBB);
197
DbtcProxy::execTAB_COMMITCONF(Signal* signal)
199
const TabCommitConf* conf = (TabCommitConf*)signal->getDataPtr();
200
Uint32 ssId = conf->senderData;
201
Ss_TAB_COMMITREQ& ss = ssFind<Ss_TAB_COMMITREQ>(ssId);
202
recvCONF(signal, ss);
206
DbtcProxy::execTAB_COMMITREF(Signal* signal)
208
const TabCommitRef* ref = (TabCommitRef*)signal->getDataPtr();
209
Uint32 ssId = ref->senderData;
210
Ss_TAB_COMMITREQ& ss = ssFind<Ss_TAB_COMMITREQ>(ssId);
212
recvREF(signal, ss, ref->errorCode);
216
DbtcProxy::sendTAB_COMMITCONF(Signal* signal, Uint32 ssId)
218
Ss_TAB_COMMITREQ& ss = ssFind<Ss_TAB_COMMITREQ>(ssId);
219
BlockReference dictRef = ss.m_req.senderRef;
224
if (ss.m_error == 0) {
226
TabCommitConf* conf = (TabCommitConf*)signal->getDataPtrSend();
227
conf->senderData = ss.m_req.senderData;
228
conf->nodeId = getOwnNodeId();
229
conf->tableId = ss.m_req.tableId;
230
sendSignal(dictRef, GSN_TAB_COMMITCONF,
231
signal, TabCommitConf::SignalLength, JBB);
234
TabCommitRef* ref = (TabCommitRef*)signal->getDataPtrSend();
235
ref->senderData = ss.m_req.senderData;
236
ref->nodeId = getOwnNodeId();
237
ref->tableId = ss.m_req.tableId;
238
sendSignal(dictRef, GSN_TAB_COMMITREF,
239
signal, TabCommitRef::SignalLength, JBB);
243
ssRelease<Ss_TAB_COMMITREQ>(ssId);
246
// GSN_PREP_DROP_TAB_REQ
249
DbtcProxy::execPREP_DROP_TAB_REQ(Signal* signal)
251
const PrepDropTabReq* req = (const PrepDropTabReq*)signal->getDataPtr();
252
Uint32 ssId = getSsId(req);
253
Ss_PREP_DROP_TAB_REQ& ss = ssSeize<Ss_PREP_DROP_TAB_REQ>(ssId);
255
ndbrequire(signal->getLength() == PrepDropTabReq::SignalLength);
260
DbtcProxy::sendPREP_DROP_TAB_REQ(Signal* signal, Uint32 ssId, SectionHandle*)
262
Ss_PREP_DROP_TAB_REQ& ss = ssFind<Ss_PREP_DROP_TAB_REQ>(ssId);
264
PrepDropTabReq* req = (PrepDropTabReq*)signal->getDataPtrSend();
266
req->senderRef = reference();
267
req->senderData = ssId; // redundant since tableId is used
268
sendSignal(workerRef(ss.m_worker), GSN_PREP_DROP_TAB_REQ,
269
signal, PrepDropTabReq::SignalLength, JBB);
273
DbtcProxy::execPREP_DROP_TAB_CONF(Signal* signal)
275
const PrepDropTabConf* conf = (const PrepDropTabConf*)signal->getDataPtr();
276
Uint32 ssId = getSsId(conf);
277
Ss_PREP_DROP_TAB_REQ& ss = ssFind<Ss_PREP_DROP_TAB_REQ>(ssId);
278
recvCONF(signal, ss);
282
DbtcProxy::execPREP_DROP_TAB_REF(Signal* signal)
284
const PrepDropTabRef* ref = (const PrepDropTabRef*)signal->getDataPtr();
285
Uint32 ssId = getSsId(ref);
286
Ss_PREP_DROP_TAB_REQ& ss = ssFind<Ss_PREP_DROP_TAB_REQ>(ssId);
287
recvREF(signal, ss, ref->errorCode);
291
DbtcProxy::sendPREP_DROP_TAB_CONF(Signal* signal, Uint32 ssId)
293
Ss_PREP_DROP_TAB_REQ& ss = ssFind<Ss_PREP_DROP_TAB_REQ>(ssId);
294
BlockReference dictRef = ss.m_req.senderRef;
299
if (ss.m_error == 0) {
301
PrepDropTabConf* conf = (PrepDropTabConf*)signal->getDataPtrSend();
302
conf->senderRef = reference();
303
conf->senderData = ss.m_req.senderData;
304
conf->tableId = ss.m_req.tableId;
305
sendSignal(dictRef, GSN_PREP_DROP_TAB_CONF,
306
signal, PrepDropTabConf::SignalLength, JBB);
309
PrepDropTabRef* ref = (PrepDropTabRef*)signal->getDataPtrSend();
310
ref->senderRef = reference();
311
ref->senderData = ss.m_req.senderData;
312
ref->tableId = ss.m_req.tableId;
313
ref->errorCode = ss.m_error;
314
sendSignal(dictRef, GSN_PREP_DROP_TAB_REF,
315
signal, PrepDropTabRef::SignalLength, JBB);
318
ssRelease<Ss_PREP_DROP_TAB_REQ>(ssId);
324
DbtcProxy::execDROP_TAB_REQ(Signal* signal)
326
const DropTabReq* req = (const DropTabReq*)signal->getDataPtr();
327
Uint32 ssId = getSsId(req);
328
Ss_DROP_TAB_REQ& ss = ssSeize<Ss_DROP_TAB_REQ>(ssId);
330
ndbrequire(signal->getLength() == DropTabReq::SignalLength);
335
DbtcProxy::sendDROP_TAB_REQ(Signal* signal, Uint32 ssId, SectionHandle*)
337
Ss_DROP_TAB_REQ& ss = ssFind<Ss_DROP_TAB_REQ>(ssId);
339
DropTabReq* req = (DropTabReq*)signal->getDataPtrSend();
341
req->senderRef = reference();
342
req->senderData = ssId; // redundant since tableId is used
343
sendSignal(workerRef(ss.m_worker), GSN_DROP_TAB_REQ,
344
signal, DropTabReq::SignalLength, JBB);
348
DbtcProxy::execDROP_TAB_CONF(Signal* signal)
350
const DropTabConf* conf = (const DropTabConf*)signal->getDataPtr();
351
Uint32 ssId = getSsId(conf);
352
Ss_DROP_TAB_REQ& ss = ssFind<Ss_DROP_TAB_REQ>(ssId);
353
recvCONF(signal, ss);
357
DbtcProxy::execDROP_TAB_REF(Signal* signal)
359
const DropTabRef* ref = (const DropTabRef*)signal->getDataPtr();
360
Uint32 ssId = getSsId(ref);
361
Ss_DROP_TAB_REQ& ss = ssFind<Ss_DROP_TAB_REQ>(ssId);
362
recvREF(signal, ss, ref->errorCode);
366
DbtcProxy::sendDROP_TAB_CONF(Signal* signal, Uint32 ssId)
368
Ss_DROP_TAB_REQ& ss = ssFind<Ss_DROP_TAB_REQ>(ssId);
369
BlockReference dictRef = ss.m_req.senderRef;
374
if (ss.m_error == 0) {
376
DropTabConf* conf = (DropTabConf*)signal->getDataPtrSend();
377
conf->senderRef = reference();
378
conf->senderData = ss.m_req.senderData;
379
conf->tableId = ss.m_req.tableId;
380
sendSignal(dictRef, GSN_DROP_TAB_CONF,
381
signal, DropTabConf::SignalLength, JBB);
384
DropTabRef* ref = (DropTabRef*)signal->getDataPtrSend();
385
ref->senderRef = reference();
386
ref->senderData = ss.m_req.senderData;
387
ref->tableId = ss.m_req.tableId;
388
ref->errorCode = ss.m_error;
389
sendSignal(dictRef, GSN_DROP_TAB_REF,
390
signal, DropTabConf::SignalLength, JBB);
393
ssRelease<Ss_DROP_TAB_REQ>(ssId);
399
DbtcProxy::execALTER_TAB_REQ(Signal* signal)
401
if (!assembleFragments(signal))
407
const AlterTabReq* req = (const AlterTabReq*)signal->getDataPtr();
408
Uint32 ssId = getSsId(req);
409
Ss_ALTER_TAB_REQ& ss = ssSeize<Ss_ALTER_TAB_REQ>(ssId);
412
SectionHandle handle(this, signal);
413
saveSections(ss, handle);
419
DbtcProxy::sendALTER_TAB_REQ(Signal* signal, Uint32 ssId,
420
SectionHandle* handle)
422
Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
424
AlterTabReq* req = (AlterTabReq*)signal->getDataPtrSend();
426
req->senderRef = reference();
427
req->senderData = ssId;
428
sendSignalNoRelease(workerRef(ss.m_worker), GSN_ALTER_TAB_REQ,
429
signal, AlterTabReq::SignalLength, JBB, handle);
433
DbtcProxy::execALTER_TAB_CONF(Signal* signal)
435
const AlterTabConf* conf = (const AlterTabConf*)signal->getDataPtr();
436
Uint32 ssId = getSsId(conf);
437
Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
438
recvCONF(signal, ss);
442
DbtcProxy::execALTER_TAB_REF(Signal* signal)
444
const AlterTabRef* ref = (const AlterTabRef*)signal->getDataPtr();
445
Uint32 ssId = getSsId(ref);
446
Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
447
recvREF(signal, ss, ref->errorCode);
451
DbtcProxy::sendALTER_TAB_CONF(Signal* signal, Uint32 ssId)
453
Ss_ALTER_TAB_REQ& ss = ssFind<Ss_ALTER_TAB_REQ>(ssId);
454
BlockReference dictRef = ss.m_req.senderRef;
459
if (ss.m_error == 0) {
461
AlterTabConf* conf = (AlterTabConf*)signal->getDataPtrSend();
462
conf->senderRef = reference();
463
conf->senderData = ss.m_req.senderData;
464
sendSignal(dictRef, GSN_ALTER_TAB_CONF,
465
signal, AlterTabConf::SignalLength, JBB);
468
AlterTabRef* ref = (AlterTabRef*)signal->getDataPtrSend();
469
ref->senderRef = reference();
470
ref->senderData = ss.m_req.senderData;
471
ref->errorCode = ss.m_error;
472
sendSignal(dictRef, GSN_ALTER_TAB_REF,
473
signal, AlterTabConf::SignalLength, JBB);
476
ssRelease<Ss_ALTER_TAB_REQ>(ssId);
480
DbtcProxy::execTCSEIZEREQ(Signal* signal)
484
if (signal->getLength() >= 3 && signal->theData[2] != 0)
487
* Specific instance requested...
489
Uint32 instance = signal->theData[2];
490
if (instance >= c_workers)
493
Uint32 senderData = signal->theData[0];
494
Uint32 senderRef = signal->theData[1];
495
signal->theData[0] = senderData;
496
signal->theData[1] = 289;
497
sendSignal(senderRef, GSN_TCSEIZEREF, signal, 2, JBB);
501
sendSignal(workerRef(instance), GSN_TCSEIZEREQ, signal,
502
signal->getLength(), JBB);
506
signal->theData[2] = 1 + m_tc_seize_req_instance;
507
sendSignal(workerRef(m_tc_seize_req_instance), GSN_TCSEIZEREQ, signal,
508
signal->getLength(), JBB);
509
m_tc_seize_req_instance = (m_tc_seize_req_instance + 1) % c_workers;
512
// GSN_TCGETOPSIZEREQ
515
DbtcProxy::execTCGETOPSIZEREQ(Signal* signal)
517
Ss_TCGETOPSIZEREQ& ss = ssSeize<Ss_TCGETOPSIZEREQ>(1);
520
memcpy(ss.m_req, signal->getDataPtr(), 2*4);
525
DbtcProxy::sendTCGETOPSIZEREQ(Signal* signal, Uint32 ssId, SectionHandle*)
527
Ss_TCGETOPSIZEREQ& ss = ssFind<Ss_TCGETOPSIZEREQ>(ssId);
529
signal->theData[0] = ssId;
530
signal->theData[1] = reference();
531
sendSignal(workerRef(ss.m_worker), GSN_TCGETOPSIZEREQ,
536
DbtcProxy::execTCGETOPSIZECONF(Signal* signal)
538
Uint32 ssId = signal->theData[0];
539
Ss_TCGETOPSIZEREQ& ss = ssFind<Ss_TCGETOPSIZEREQ>(ssId);
540
ss.m_sum += signal->theData[1];
541
recvCONF(signal, ss);
545
DbtcProxy::sendTCGETOPSIZECONF(Signal* signal, Uint32 ssId)
547
Ss_TCGETOPSIZEREQ& ss = ssFind<Ss_TCGETOPSIZEREQ>(ssId);
552
signal->theData[0] = ss.m_req[0];
553
signal->theData[1] = ss.m_sum;
554
sendSignal(ss.m_req[1], GSN_TCGETOPSIZECONF,
557
ssRelease<Ss_TCGETOPSIZEREQ>(ssId);
560
// GSN_TC_CLOPSIZEREQ
563
DbtcProxy::execTC_CLOPSIZEREQ(Signal* signal)
565
Ss_TC_CLOPSIZEREQ& ss = ssSeize<Ss_TC_CLOPSIZEREQ>(1);
567
memcpy(ss.m_req, signal->getDataPtr(), 2*4);
572
DbtcProxy::sendTC_CLOPSIZEREQ(Signal* signal, Uint32 ssId, SectionHandle*)
574
Ss_TC_CLOPSIZEREQ& ss = ssFind<Ss_TC_CLOPSIZEREQ>(ssId);
576
signal->theData[0] = ssId;
577
signal->theData[1] = reference();
578
sendSignal(workerRef(ss.m_worker), GSN_TC_CLOPSIZEREQ,
583
DbtcProxy::execTC_CLOPSIZECONF(Signal* signal)
585
Uint32 ssId = signal->theData[0];
586
Ss_TC_CLOPSIZEREQ& ss = ssFind<Ss_TC_CLOPSIZEREQ>(ssId);
587
recvCONF(signal, ss);
591
DbtcProxy::sendTC_CLOPSIZECONF(Signal* signal, Uint32 ssId)
593
Ss_TC_CLOPSIZEREQ& ss = ssFind<Ss_TC_CLOPSIZEREQ>(ssId);
598
signal->theData[0] = ss.m_req[0];
599
sendSignal(ss.m_req[1], GSN_TC_CLOPSIZECONF,
602
ssRelease<Ss_TC_CLOPSIZEREQ>(ssId);
605
// GSN_GCP_NOMORETRANS
608
DbtcProxy::execGCP_NOMORETRANS(Signal* signal)
610
Ss_GCP_NOMORETRANS& ss = ssSeize<Ss_GCP_NOMORETRANS>(1);
612
ss.m_req = *(GCPNoMoreTrans*)signal->getDataPtr();
617
DbtcProxy::sendGCP_NOMORETRANS(Signal* signal, Uint32 ssId, SectionHandle*)
619
Ss_GCP_NOMORETRANS& ss = ssFind<Ss_GCP_NOMORETRANS>(ssId);
621
GCPNoMoreTrans * req = (GCPNoMoreTrans*)signal->getDataPtrSend();
622
req->senderRef = reference();
623
req->senderData = ssId;
624
req->gci_hi = ss.m_req.gci_hi;
625
req->gci_lo = ss.m_req.gci_lo;
626
sendSignal(workerRef(ss.m_worker), GSN_GCP_NOMORETRANS,
627
signal, GCPNoMoreTrans::SignalLength, JBB);
631
DbtcProxy::execGCP_TCFINISHED(Signal* signal)
633
GCPTCFinished* conf = (GCPTCFinished*)signal->getDataPtr();
634
Uint32 ssId = conf->senderData;
635
Ss_GCP_NOMORETRANS& ss = ssFind<Ss_GCP_NOMORETRANS>(ssId);
636
recvCONF(signal, ss);
640
DbtcProxy::sendGCP_TCFINISHED(Signal* signal, Uint32 ssId)
642
Ss_GCP_NOMORETRANS& ss = ssFind<Ss_GCP_NOMORETRANS>(ssId);
647
GCPTCFinished* conf = (GCPTCFinished*)signal->getDataPtrSend();
648
conf->senderData = ss.m_req.senderData;
649
conf->gci_hi = ss.m_req.gci_hi;
650
conf->gci_lo = ss.m_req.gci_lo;
651
sendSignal(ss.m_req.senderRef, GSN_GCP_TCFINISHED,
652
signal, GCPTCFinished::SignalLength, JBB);
654
ssRelease<Ss_GCP_NOMORETRANS>(ssId);
661
DbtcProxy::execAPI_FAILREQ(Signal* signal)
663
Uint32 nodeId = signal->theData[0];
664
Ss_API_FAILREQ& ss = ssSeize<Ss_API_FAILREQ>(nodeId);
666
ss.m_ref = signal->theData[1];
671
DbtcProxy::sendAPI_FAILREQ(Signal* signal, Uint32 ssId, SectionHandle*)
673
Ss_API_FAILREQ& ss = ssFind<Ss_API_FAILREQ>(ssId);
675
signal->theData[0] = ssId;
676
signal->theData[1] = reference();
677
sendSignal(workerRef(ss.m_worker), GSN_API_FAILREQ,
682
DbtcProxy::execAPI_FAILCONF(Signal* signal)
684
Uint32 nodeId = signal->theData[0];
685
Ss_API_FAILREQ& ss = ssFind<Ss_API_FAILREQ>(nodeId);
686
recvCONF(signal, ss);
690
DbtcProxy::sendAPI_FAILCONF(Signal* signal, Uint32 ssId)
692
Ss_API_FAILREQ& ss = ssFind<Ss_API_FAILREQ>(ssId);
697
signal->theData[0] = ssId;
698
signal->theData[1] = calcTcBlockRef(getOwnNodeId());
699
sendSignal(ss.m_ref, GSN_API_FAILCONF,
702
ssRelease<Ss_API_FAILREQ>(ssId);
705
// GSN_CREATE_INDX_IMPL_REQ
708
DbtcProxy::execCREATE_INDX_IMPL_REQ(Signal* signal)
711
if (!assembleFragments(signal))
717
const CreateIndxImplReq* req = (const CreateIndxImplReq*)signal->getDataPtr();
718
Ss_CREATE_INDX_IMPL_REQ& ss = ssSeize<Ss_CREATE_INDX_IMPL_REQ>();
720
SectionHandle handle(this, signal);
721
saveSections(ss, handle);
726
DbtcProxy::sendCREATE_INDX_IMPL_REQ(Signal* signal, Uint32 ssId,
727
SectionHandle * handle)
729
Ss_CREATE_INDX_IMPL_REQ& ss = ssFind<Ss_CREATE_INDX_IMPL_REQ>(ssId);
731
CreateIndxImplReq* req = (CreateIndxImplReq*)signal->getDataPtrSend();
733
req->senderRef = reference();
734
req->senderData = ssId;
735
sendSignalNoRelease(workerRef(ss.m_worker), GSN_CREATE_INDX_IMPL_REQ,
736
signal, CreateIndxImplReq::SignalLength, JBB,
741
DbtcProxy::execCREATE_INDX_IMPL_CONF(Signal* signal)
743
const CreateIndxImplConf* conf = (const CreateIndxImplConf*)signal->getDataPtr();
744
Uint32 ssId = conf->senderData;
745
Ss_CREATE_INDX_IMPL_REQ& ss = ssFind<Ss_CREATE_INDX_IMPL_REQ>(ssId);
746
recvCONF(signal, ss);
750
DbtcProxy::execCREATE_INDX_IMPL_REF(Signal* signal)
752
const CreateIndxImplRef* ref = (const CreateIndxImplRef*)signal->getDataPtr();
753
Uint32 ssId = ref->senderData;
754
Ss_CREATE_INDX_IMPL_REQ& ss = ssFind<Ss_CREATE_INDX_IMPL_REQ>(ssId);
755
recvREF(signal, ss, ref->errorCode);
759
DbtcProxy::sendCREATE_INDX_IMPL_CONF(Signal* signal, Uint32 ssId)
761
Ss_CREATE_INDX_IMPL_REQ& ss = ssFind<Ss_CREATE_INDX_IMPL_REQ>(ssId);
762
BlockReference dictRef = ss.m_req.senderRef;
767
if (ss.m_error == 0) {
769
CreateIndxImplConf* conf = (CreateIndxImplConf*)signal->getDataPtrSend();
770
conf->senderRef = reference();
771
conf->senderData = ss.m_req.senderData;
772
sendSignal(dictRef, GSN_CREATE_INDX_IMPL_CONF,
773
signal, CreateIndxImplConf::SignalLength, JBB);
775
CreateIndxImplRef* ref = (CreateIndxImplRef*)signal->getDataPtrSend();
776
ref->senderRef = reference();
777
ref->senderData = ss.m_req.senderData;
778
ref->errorCode = ss.m_error;
779
sendSignal(dictRef, GSN_CREATE_INDX_IMPL_REF,
780
signal, CreateIndxImplRef::SignalLength, JBB);
783
ssRelease<Ss_CREATE_INDX_IMPL_REQ>(ssId);
786
// GSN_ALTER_INDX_IMPL_REQ
789
DbtcProxy::execALTER_INDX_IMPL_REQ(Signal* signal)
791
const AlterIndxImplReq* req = (const AlterIndxImplReq*)signal->getDataPtr();
792
Ss_ALTER_INDX_IMPL_REQ& ss = ssSeize<Ss_ALTER_INDX_IMPL_REQ>();
794
ndbrequire(signal->getLength() == AlterIndxImplReq::SignalLength);
799
DbtcProxy::sendALTER_INDX_IMPL_REQ(Signal* signal, Uint32 ssId, SectionHandle*)
801
Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
803
AlterIndxImplReq* req = (AlterIndxImplReq*)signal->getDataPtrSend();
805
req->senderRef = reference();
806
req->senderData = ssId;
807
sendSignal(workerRef(ss.m_worker), GSN_ALTER_INDX_IMPL_REQ,
808
signal, AlterIndxImplReq::SignalLength, JBB);
812
DbtcProxy::execALTER_INDX_IMPL_CONF(Signal* signal)
814
const AlterIndxImplConf* conf = (const AlterIndxImplConf*)signal->getDataPtr();
815
Uint32 ssId = conf->senderData;
816
Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
817
recvCONF(signal, ss);
821
DbtcProxy::execALTER_INDX_IMPL_REF(Signal* signal)
823
const AlterIndxImplRef* ref = (const AlterIndxImplRef*)signal->getDataPtr();
824
Uint32 ssId = ref->senderData;
825
Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
826
recvREF(signal, ss, ref->errorCode);
830
DbtcProxy::sendALTER_INDX_IMPL_CONF(Signal* signal, Uint32 ssId)
832
Ss_ALTER_INDX_IMPL_REQ& ss = ssFind<Ss_ALTER_INDX_IMPL_REQ>(ssId);
833
BlockReference dictRef = ss.m_req.senderRef;
838
if (ss.m_error == 0) {
840
AlterIndxImplConf* conf = (AlterIndxImplConf*)signal->getDataPtrSend();
841
conf->senderRef = reference();
842
conf->senderData = ss.m_req.senderData;
843
sendSignal(dictRef, GSN_ALTER_INDX_IMPL_CONF,
844
signal, AlterIndxImplConf::SignalLength, JBB);
846
AlterIndxImplRef* ref = (AlterIndxImplRef*)signal->getDataPtrSend();
847
ref->senderRef = reference();
848
ref->senderData = ss.m_req.senderData;
849
ref->errorCode = ss.m_error;
850
sendSignal(dictRef, GSN_ALTER_INDX_IMPL_REF,
851
signal, AlterIndxImplRef::SignalLength, JBB);
854
ssRelease<Ss_ALTER_INDX_IMPL_REQ>(ssId);
857
// GSN_DROP_INDX_IMPL_REQ
860
DbtcProxy::execDROP_INDX_IMPL_REQ(Signal* signal)
862
const DropIndxImplReq* req = (const DropIndxImplReq*)signal->getDataPtr();
863
Ss_DROP_INDX_IMPL_REQ& ss = ssSeize<Ss_DROP_INDX_IMPL_REQ>();
865
ndbrequire(signal->getLength() == DropIndxImplReq::SignalLength);
870
DbtcProxy::sendDROP_INDX_IMPL_REQ(Signal* signal, Uint32 ssId, SectionHandle*)
872
Ss_DROP_INDX_IMPL_REQ& ss = ssFind<Ss_DROP_INDX_IMPL_REQ>(ssId);
874
DropIndxImplReq* req = (DropIndxImplReq*)signal->getDataPtrSend();
876
req->senderRef = reference();
877
req->senderData = ssId;
878
sendSignal(workerRef(ss.m_worker), GSN_DROP_INDX_IMPL_REQ,
879
signal, DropIndxImplReq::SignalLength, JBB);
883
DbtcProxy::execDROP_INDX_IMPL_CONF(Signal* signal)
885
const DropIndxImplConf* conf = (const DropIndxImplConf*)signal->getDataPtr();
886
Uint32 ssId = conf->senderData;
887
Ss_DROP_INDX_IMPL_REQ& ss = ssFind<Ss_DROP_INDX_IMPL_REQ>(ssId);
888
recvCONF(signal, ss);
892
DbtcProxy::execDROP_INDX_IMPL_REF(Signal* signal)
894
const DropIndxImplRef* ref = (const DropIndxImplRef*)signal->getDataPtr();
895
Uint32 ssId = ref->senderData;
896
Ss_DROP_INDX_IMPL_REQ& ss = ssFind<Ss_DROP_INDX_IMPL_REQ>(ssId);
897
recvREF(signal, ss, ref->errorCode);
901
DbtcProxy::sendDROP_INDX_IMPL_CONF(Signal* signal, Uint32 ssId)
903
Ss_DROP_INDX_IMPL_REQ& ss = ssFind<Ss_DROP_INDX_IMPL_REQ>(ssId);
904
BlockReference dictRef = ss.m_req.senderRef;
909
if (ss.m_error == 0) {
911
DropIndxImplConf* conf = (DropIndxImplConf*)signal->getDataPtrSend();
912
conf->senderRef = reference();
913
conf->senderData = ss.m_req.senderData;
914
sendSignal(dictRef, GSN_DROP_INDX_IMPL_CONF,
915
signal, DropIndxImplConf::SignalLength, JBB);
917
DropIndxImplRef* ref = (DropIndxImplRef*)signal->getDataPtrSend();
918
ref->senderRef = reference();
919
ref->senderData = ss.m_req.senderData;
920
ref->errorCode = ss.m_error;
921
sendSignal(dictRef, GSN_DROP_INDX_IMPL_REF,
922
signal, DropIndxImplRef::SignalLength, JBB);
925
ssRelease<Ss_DROP_INDX_IMPL_REQ>(ssId);
929
DbtcProxy::execTAKE_OVERTCCONF(Signal* signal)
933
if (!checkNodeFailSequence(signal))
939
for (Uint32 i = 0; i < c_workers; i++)
942
Uint32 ref = numberToRef(number(), workerInstance(i), getOwnNodeId());
943
sendSignal(ref, GSN_TAKE_OVERTCCONF, signal,
949
BLOCK_FUNCTIONS(DbtcProxy)