1
/* Copyright (C) 2003 MySQL AB
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.
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.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
20
#include <RefConvert.hpp>
21
#include <ndb_limits.h>
23
#include <AttributeDescriptor.hpp>
24
#include "AttributeOffset.hpp"
25
#include <AttributeHeader.hpp>
26
#include <Interpreter.hpp>
27
#include <signaldata/FsConf.hpp>
28
#include <signaldata/FsRef.hpp>
29
#include <signaldata/FsRemoveReq.hpp>
30
#include <signaldata/TupCommit.hpp>
31
#include <signaldata/TupKey.hpp>
33
#include <signaldata/DropTab.hpp>
36
#define DEBUG(x) { ndbout << "TUP::" << x << endl; }
38
void Dbtup::initData()
40
cnoOfAttrbufrec = ZNO_OF_ATTRBUFREC;
41
cnoOfFragrec = MAX_FRAG_PER_NODE;
42
cnoOfFragoprec = MAX_FRAG_PER_NODE;
43
cnoOfPageRangeRec = ZNO_OF_PAGE_RANGE_REC;
44
c_maxTriggersPerTable = ZDEFAULT_MAX_NO_TRIGGERS_PER_TABLE;
45
c_noOfBuildIndexRec = 32;
47
// Records with constant sizes
51
Dbtup::Dbtup(Block_context& ctx, Pgman* pgman)
52
: SimulatedBlock(DBTUP, ctx),
55
c_extent_hash(c_extent_pool),
57
c_buildIndexList(c_buildIndexPool),
60
BLOCK_CONSTRUCTOR(Dbtup);
62
addRecSignal(GSN_DEBUG_SIG, &Dbtup::execDEBUG_SIG);
63
addRecSignal(GSN_CONTINUEB, &Dbtup::execCONTINUEB);
64
addRecSignal(GSN_LCP_FRAG_ORD, &Dbtup::execLCP_FRAG_ORD);
66
addRecSignal(GSN_DUMP_STATE_ORD, &Dbtup::execDUMP_STATE_ORD);
67
addRecSignal(GSN_SEND_PACKED, &Dbtup::execSEND_PACKED);
68
addRecSignal(GSN_ATTRINFO, &Dbtup::execATTRINFO);
69
addRecSignal(GSN_STTOR, &Dbtup::execSTTOR);
70
addRecSignal(GSN_MEMCHECKREQ, &Dbtup::execMEMCHECKREQ);
71
addRecSignal(GSN_TUPKEYREQ, &Dbtup::execTUPKEYREQ);
72
addRecSignal(GSN_TUPSEIZEREQ, &Dbtup::execTUPSEIZEREQ);
73
addRecSignal(GSN_TUPRELEASEREQ, &Dbtup::execTUPRELEASEREQ);
74
addRecSignal(GSN_STORED_PROCREQ, &Dbtup::execSTORED_PROCREQ);
75
addRecSignal(GSN_TUPFRAGREQ, &Dbtup::execTUPFRAGREQ);
76
addRecSignal(GSN_TUP_ADD_ATTRREQ, &Dbtup::execTUP_ADD_ATTRREQ);
77
addRecSignal(GSN_TUP_COMMITREQ, &Dbtup::execTUP_COMMITREQ);
78
addRecSignal(GSN_TUP_ABORTREQ, &Dbtup::execTUP_ABORTREQ);
79
addRecSignal(GSN_NDB_STTOR, &Dbtup::execNDB_STTOR);
80
addRecSignal(GSN_READ_CONFIG_REQ, &Dbtup::execREAD_CONFIG_REQ, true);
83
addRecSignal(GSN_CREATE_TRIG_REQ, &Dbtup::execCREATE_TRIG_REQ);
84
addRecSignal(GSN_DROP_TRIG_REQ, &Dbtup::execDROP_TRIG_REQ);
86
addRecSignal(GSN_DROP_TAB_REQ, &Dbtup::execDROP_TAB_REQ);
88
addRecSignal(GSN_TUP_DEALLOCREQ, &Dbtup::execTUP_DEALLOCREQ);
89
addRecSignal(GSN_TUP_WRITELOG_REQ, &Dbtup::execTUP_WRITELOG_REQ);
91
// Ordered index related
92
addRecSignal(GSN_BUILDINDXREQ, &Dbtup::execBUILDINDXREQ);
95
addRecSignal(GSN_ACC_SCANREQ, &Dbtup::execACC_SCANREQ);
96
addRecSignal(GSN_NEXT_SCANREQ, &Dbtup::execNEXT_SCANREQ);
97
addRecSignal(GSN_ACC_CHECK_SCAN, &Dbtup::execACC_CHECK_SCAN);
98
addRecSignal(GSN_ACCKEYCONF, &Dbtup::execACCKEYCONF);
99
addRecSignal(GSN_ACCKEYREF, &Dbtup::execACCKEYREF);
100
addRecSignal(GSN_ACC_ABORTCONF, &Dbtup::execACC_ABORTCONF);
103
addRecSignal(GSN_FSREMOVEREF, &Dbtup::execFSREMOVEREF, true);
104
addRecSignal(GSN_FSREMOVECONF, &Dbtup::execFSREMOVECONF, true);
113
totNoOfPagesAllocated = 0;
114
cnoOfAllocatedPages = 0;
117
CLEAR_ERROR_INSERT_VALUE;
122
// Records with dynamic sizes
123
deallocRecord((void **)&attrbufrec,"Attrbufrec",
127
deallocRecord((void **)&fragoperrec,"Fragoperrec",
131
deallocRecord((void **)&fragrecord,"Fragrecord",
135
deallocRecord((void **)&hostBuffer,"HostBuffer",
139
deallocRecord((void **)&pageRange,"PageRange",
143
deallocRecord((void **)&tablerec,"Tablerec",
147
deallocRecord((void **)&tableDescriptor, "TableDescriptor",
148
sizeof(TableDescriptor),
153
BLOCK_FUNCTIONS(Dbtup)
155
void Dbtup::execCONTINUEB(Signal* signal)
158
Uint32 actionType = signal->theData[0];
159
Uint32 dataPtr = signal->theData[1];
160
switch (actionType) {
161
case ZINITIALISE_RECORDS:
163
initialiseRecordsLab(signal, dataPtr,
164
signal->theData[2], signal->theData[3]);
168
releaseFragment(signal, dataPtr, signal->theData[2]);
170
case ZREPORT_MEMORY_USAGE:{
172
static int c_currentMemUsed = 0;
173
Uint32 cnt = signal->theData[1];
174
Uint32 tmp = c_page_pool.getSize();
175
int now = tmp ? (cnoOfAllocatedPages * 100)/tmp : 0;
176
const int thresholds[] = { 100, 90, 80, 0 };
179
const Uint32 sz = sizeof(thresholds)/sizeof(thresholds[0]);
180
for(i = 0; i<sz; i++){
181
if(now >= thresholds[i]){
187
if(now != c_currentMemUsed ||
188
(c_memusage_report_frequency && cnt + 1 == c_memusage_report_frequency))
190
reportMemoryUsage(signal,
191
now > c_currentMemUsed ? 1 :
192
now < c_currentMemUsed ? -1 : 0);
194
c_currentMemUsed = now;
200
signal->theData[0] = ZREPORT_MEMORY_USAGE;
201
signal->theData[1] = cnt;
202
sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 2);
207
buildIndex(signal, dataPtr);
213
c_scanOpPool.getPtr(scanPtr, dataPtr);
214
scanCont(signal, scanPtr);
223
FragrecordPtr fragPtr;
224
fragPtr.i= signal->theData[2];
225
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
226
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
227
drop_fragment_free_extent(signal, tabPtr, fragPtr, signal->theData[3]);
236
FragrecordPtr fragPtr;
237
fragPtr.i= signal->theData[2];
238
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
239
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
240
drop_fragment_unmap_pages(signal, tabPtr, fragPtr, signal->theData[3]);
243
case ZFREE_VAR_PAGES:
246
drop_fragment_free_var_pages(signal);
253
}//Dbtup::execTUP_CONTINUEB()
255
/* **************************************************************** */
256
/* ---------------------------------------------------------------- */
257
/* ------------------- SYSTEM RESTART MODULE ---------------------- */
258
/* ---------------------------------------------------------------- */
259
/* **************************************************************** */
260
void Dbtup::execSTTOR(Signal* signal)
263
Uint32 startPhase = signal->theData[1];
264
Uint32 sigKey = signal->theData[6];
265
switch (startPhase) {
268
ndbrequire((c_lqh= (Dblqh*)globalData.getBlock(DBLQH)) != 0);
269
ndbrequire((c_tsman= (Tsman*)globalData.getBlock(TSMAN)) != 0);
270
ndbrequire((c_lgman= (Lgman*)globalData.getBlock(LGMAN)) != 0);
271
cownref = calcTupBlockRef(0);
277
signal->theData[0] = sigKey;
278
signal->theData[1] = 3;
279
signal->theData[2] = 2;
280
signal->theData[3] = ZSTARTPHASE1;
281
signal->theData[4] = 255;
282
sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 5, JBB);
284
}//Dbtup::execSTTOR()
286
/************************************************************************************************/
287
// SIZE_ALTREP INITIALIZE DATA STRUCTURES, FILES AND DS VARIABLES, GET READY FOR EXTERNAL
289
/************************************************************************************************/
290
void Dbtup::execREAD_CONFIG_REQ(Signal* signal)
292
const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr();
293
Uint32 ref = req->senderRef;
294
Uint32 senderData = req->senderData;
295
ndbrequire(req->noOfParameters == 0);
299
const ndb_mgm_configuration_iterator * p =
300
m_ctx.m_config.getOwnConfigIterator();
303
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_FRAG, &cnoOfFragrec));
305
Uint32 noOfTriggers= 0;
309
if (ndb_mgm_get_int_parameter(p, CFG_DB_MAX_ALLOCATE, &tmp))
310
tmp = 32 * 1024 * 1024;
311
m_max_allocate_pages = (tmp + GLOBAL_PAGE_SIZE - 1) / GLOBAL_PAGE_SIZE;
314
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE_RANGE, &tmp));
315
initPageRangeSize(tmp);
316
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE, &cnoOfTablerec));
317
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE_DESC,
319
Uint32 noOfStoredProc;
320
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_STORED_PROC,
322
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGERS,
325
cnoOfTabDescrRec = (cnoOfTabDescrRec & 0xFFFFFFF0) + 16;
329
c_storedProcPool.setSize(noOfStoredProc);
330
c_buildIndexPool.setSize(c_noOfBuildIndexRec);
331
c_triggerPool.setSize(noOfTriggers, false, true, true, CFG_DB_NO_TRIGGERS);
333
c_extent_hash.setSize(1024); // 4k
337
c_page_request_pool.wo_pool_init(RT_DBTUP_PAGE_REQUEST, pc);
338
c_extent_pool.init(RT_DBTUP_EXTENT_INFO, pc);
340
Uint32 nScanOp; // use TUX config for now
341
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUX_SCAN_OP, &nScanOp));
342
c_scanOpPool.setSize(nScanOp + 1);
344
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_BATCH_SIZE, &nScanBatch));
345
c_scanLockPool.setSize(nScanOp * nScanBatch);
348
/* read ahead for disk scan can not be more that disk page buffer */
350
Uint64 tmp = 64*1024*1024;
351
ndb_mgm_get_int64_parameter(p, CFG_DB_DISK_PAGE_BUFFER_MEMORY, &tmp);
352
m_max_page_read_ahead = (tmp + GLOBAL_PAGE_SIZE - 1) / GLOBAL_PAGE_SIZE; // in pages
353
// never read ahead more than 32 pages
354
if (m_max_page_read_ahead > 32)
355
m_max_page_read_ahead = 32;
360
ndbrequire(c_scanOpPool.seize(lcp));
361
new (lcp.p) ScanOp();
362
c_lcp_scan_op= lcp.i;
365
cminusOne = czero - 1;
367
clastBitMask = clastBitMask << 31;
369
c_memusage_report_frequency = 0;
370
ndb_mgm_get_int_parameter(p, CFG_DB_MEMREPORT_FREQUENCY,
371
&c_memusage_report_frequency);
373
initialiseRecordsLab(signal, 0, ref, senderData);
374
}//Dbtup::execSIZEALT_REP()
376
void Dbtup::initRecords()
381
const ndb_mgm_configuration_iterator * p =
382
m_ctx.m_config.getOwnConfigIterator();
385
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE, &tmp));
387
// Records with dynamic sizes
388
Page* ptr =(Page*)allocRecord("Page", sizeof(Page), tmp, false, CFG_DB_DATA_MEM);
389
c_page_pool.set(ptr, tmp);
391
attrbufrec = (Attrbufrec*)allocRecord("Attrbufrec",
395
fragoperrec = (Fragoperrec*)allocRecord("Fragoperrec",
399
fragrecord = (Fragrecord*)allocRecord("Fragrecord",
403
hostBuffer = (HostBuffer*)allocRecord("HostBuffer",
407
tableDescriptor = (TableDescriptor*)allocRecord("TableDescriptor",
408
sizeof(TableDescriptor),
411
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_OP_RECS, &tmp));
412
ndb_mgm_get_int_parameter(p, CFG_DB_NO_LOCAL_OPS, &tmp1);
413
c_operation_pool.setSize(tmp, false, true, true,
414
tmp1 == 0 ? CFG_DB_NO_OPS : CFG_DB_NO_LOCAL_OPS);
416
pageRange = (PageRange*)allocRecord("PageRange",
420
tablerec = (Tablerec*)allocRecord("Tablerec",
424
for (i = 0; i<cnoOfTablerec; i++) {
425
void * p = &tablerec[i];
426
new (p) Tablerec(c_triggerPool);
428
}//Dbtup::initRecords()
430
void Dbtup::initialiseRecordsLab(Signal* signal, Uint32 switchData,
431
Uint32 retRef, Uint32 retData)
433
switch (switchData) {
436
initializeHostBuffer();
440
initializeOperationrec();
451
initializeTablerec();
458
initializeFragrecord();
462
initializeFragoperrec();
466
initializePageRange();
470
initializeTabDescr();
480
initializeAttrbufrec();
489
ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
490
conf->senderRef = reference();
491
conf->senderData = retData;
492
sendSignal(retRef, GSN_READ_CONFIG_CONF, signal,
493
ReadConfigConf::SignalLength, JBB);
500
signal->theData[0] = ZINITIALISE_RECORDS;
501
signal->theData[1] = switchData + 1;
502
signal->theData[2] = retRef;
503
signal->theData[3] = retData;
504
sendSignal(reference(), GSN_CONTINUEB, signal, 4, JBB);
506
}//Dbtup::initialiseRecordsLab()
508
void Dbtup::execNDB_STTOR(Signal* signal)
511
cndbcntrRef = signal->theData[0];
512
Uint32 ownNodeId = signal->theData[1];
513
Uint32 startPhase = signal->theData[2];
514
switch (startPhase) {
517
cownNodeId = ownNodeId;
518
cownref = calcTupBlockRef(ownNodeId);
525
startphase3Lab(signal, ~0, ~0);
532
/*****************************************/
533
/* NOW SET THE DISK WRITE SPEED TO */
534
/* PAGES PER TICK AFTER SYSTEM */
536
/*****************************************/
537
signal->theData[0] = ZREPORT_MEMORY_USAGE;
538
signal->theData[1] = 0;
539
sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 1000, 2);
545
signal->theData[0] = cownref;
546
sendSignal(cndbcntrRef, GSN_NDB_STTORRY, signal, 1, JBB);
547
}//Dbtup::execNDB_STTOR()
549
void Dbtup::startphase3Lab(Signal* signal, Uint32 config1, Uint32 config2)
551
}//Dbtup::startphase3Lab()
553
void Dbtup::initializeAttrbufrec()
555
AttrbufrecPtr attrBufPtr;
556
for (attrBufPtr.i = 0;
557
attrBufPtr.i < cnoOfAttrbufrec; attrBufPtr.i++) {
559
ptrAss(attrBufPtr, attrbufrec);
560
attrBufPtr.p->attrbuf[ZBUF_NEXT] = attrBufPtr.i + 1;
562
attrBufPtr.i = cnoOfAttrbufrec - 1;
563
ptrAss(attrBufPtr, attrbufrec);
564
attrBufPtr.p->attrbuf[ZBUF_NEXT] = RNIL;
565
cfirstfreeAttrbufrec = 0;
566
cnoFreeAttrbufrec = cnoOfAttrbufrec;
567
}//Dbtup::initializeAttrbufrec()
569
void Dbtup::initializeFragoperrec()
571
FragoperrecPtr fragoperPtr;
572
for (fragoperPtr.i = 0; fragoperPtr.i < cnoOfFragoprec; fragoperPtr.i++) {
573
ptrAss(fragoperPtr, fragoperrec);
574
fragoperPtr.p->nextFragoprec = fragoperPtr.i + 1;
576
fragoperPtr.i = cnoOfFragoprec - 1;
577
ptrAss(fragoperPtr, fragoperrec);
578
fragoperPtr.p->nextFragoprec = RNIL;
579
cfirstfreeFragopr = 0;
580
}//Dbtup::initializeFragoperrec()
582
void Dbtup::initializeFragrecord()
584
FragrecordPtr regFragPtr;
585
for (regFragPtr.i = 0; regFragPtr.i < cnoOfFragrec; regFragPtr.i++) {
587
ptrAss(regFragPtr, fragrecord);
588
new (regFragPtr.p) Fragrecord();
589
regFragPtr.p->nextfreefrag = regFragPtr.i + 1;
590
regFragPtr.p->fragStatus = IDLE;
592
regFragPtr.i = cnoOfFragrec - 1;
593
ptrAss(regFragPtr, fragrecord);
594
regFragPtr.p->nextfreefrag = RNIL;
596
}//Dbtup::initializeFragrecord()
598
void Dbtup::initializeHostBuffer()
601
cpackedListIndex = 0;
602
for (hostId = 0; hostId < MAX_NODES; hostId++) {
603
hostBuffer[hostId].inPackedList = false;
604
hostBuffer[hostId].noOfPacketsTA = 0;
605
hostBuffer[hostId].packetLenTA = 0;
607
}//Dbtup::initializeHostBuffer()
610
void Dbtup::initializeOperationrec()
613
}//Dbtup::initializeOperationrec()
615
void Dbtup::initializeTablerec()
617
TablerecPtr regTabPtr;
618
for (regTabPtr.i = 0; regTabPtr.i < cnoOfTablerec; regTabPtr.i++) {
621
ptrAss(regTabPtr, tablerec);
622
initTab(regTabPtr.p);
624
}//Dbtup::initializeTablerec()
627
Dbtup::initTab(Tablerec* const regTabPtr)
629
for (Uint32 i = 0; i < MAX_FRAG_PER_NODE; i++) {
630
regTabPtr->fragid[i] = RNIL;
631
regTabPtr->fragrec[i] = RNIL;
633
regTabPtr->readFunctionArray = NULL;
634
regTabPtr->updateFunctionArray = NULL;
635
regTabPtr->charsetArray = NULL;
637
regTabPtr->tabDescriptor = RNIL;
638
regTabPtr->readKeyArray = RNIL;
640
regTabPtr->m_bits = 0;
642
regTabPtr->m_no_of_attributes = 0;
643
regTabPtr->noOfKeyAttr = 0;
645
regTabPtr->m_dropTable.tabUserPtr = RNIL;
646
regTabPtr->m_dropTable.tabUserRef = 0;
647
regTabPtr->tableStatus = NOT_DEFINED;
649
// Clear trigger data
650
if (!regTabPtr->afterInsertTriggers.isEmpty())
651
regTabPtr->afterInsertTriggers.release();
652
if (!regTabPtr->afterDeleteTriggers.isEmpty())
653
regTabPtr->afterDeleteTriggers.release();
654
if (!regTabPtr->afterUpdateTriggers.isEmpty())
655
regTabPtr->afterUpdateTriggers.release();
656
if (!regTabPtr->subscriptionInsertTriggers.isEmpty())
657
regTabPtr->subscriptionInsertTriggers.release();
658
if (!regTabPtr->subscriptionDeleteTriggers.isEmpty())
659
regTabPtr->subscriptionDeleteTriggers.release();
660
if (!regTabPtr->subscriptionUpdateTriggers.isEmpty())
661
regTabPtr->subscriptionUpdateTriggers.release();
662
if (!regTabPtr->constraintUpdateTriggers.isEmpty())
663
regTabPtr->constraintUpdateTriggers.release();
664
if (!regTabPtr->tuxCustomTriggers.isEmpty())
665
regTabPtr->tuxCustomTriggers.release();
668
void Dbtup::initializeTabDescr()
670
TableDescriptorPtr regTabDesPtr;
671
for (Uint32 i = 0; i < 16; i++) {
672
cfreeTdList[i] = RNIL;
674
for (regTabDesPtr.i = 0; regTabDesPtr.i < cnoOfTabDescrRec; regTabDesPtr.i++) {
676
ptrAss(regTabDesPtr, tableDescriptor);
677
regTabDesPtr.p->tabDescr = RNIL;
679
freeTabDescr(0, cnoOfTabDescrRec);
680
}//Dbtup::initializeTabDescr()
682
/* ---------------------------------------------------------------- */
683
/* ---------------------------------------------------------------- */
684
/* --------------- CONNECT/DISCONNECT MODULE ---------------------- */
685
/* ---------------------------------------------------------------- */
686
/* ---------------------------------------------------------------- */
687
void Dbtup::execTUPSEIZEREQ(Signal* signal)
689
OperationrecPtr regOperPtr;
691
Uint32 userPtr = signal->theData[0];
692
BlockReference userRef = signal->theData[1];
693
if (!c_operation_pool.seize(regOperPtr))
696
signal->theData[0] = userPtr;
697
signal->theData[1] = ZGET_OPREC_ERROR;
698
sendSignal(userRef, GSN_TUPSEIZEREF, signal, 2, JBB);
702
new (regOperPtr.p) Operationrec();
703
regOperPtr.p->firstAttrinbufrec = RNIL;
704
regOperPtr.p->lastAttrinbufrec = RNIL;
705
regOperPtr.p->m_any_value = 0;
706
regOperPtr.p->op_struct.op_type = ZREAD;
707
regOperPtr.p->op_struct.in_active_list = false;
708
set_trans_state(regOperPtr.p, TRANS_DISCONNECTED);
709
regOperPtr.p->storedProcedureId = ZNIL;
710
regOperPtr.p->prevActiveOp = RNIL;
711
regOperPtr.p->nextActiveOp = RNIL;
712
regOperPtr.p->tupVersion = ZNIL;
713
regOperPtr.p->op_struct.delete_insert_flag = false;
715
initOpConnection(regOperPtr.p);
716
regOperPtr.p->userpointer = userPtr;
717
signal->theData[0] = regOperPtr.p->userpointer;
718
signal->theData[1] = regOperPtr.i;
719
sendSignal(userRef, GSN_TUPSEIZECONF, signal, 2, JBB);
721
}//Dbtup::execTUPSEIZEREQ()
723
#define printFragment(t){ for(Uint32 i = 0; i < MAX_FRAG_PER_NODE;i++){\
724
ndbout_c("table = %d fragid[%d] = %d fragrec[%d] = %d", \
725
t.i, t.p->fragid[i], i, t.p->fragrec[i]); }}
727
void Dbtup::execTUPRELEASEREQ(Signal* signal)
729
OperationrecPtr regOperPtr;
731
regOperPtr.i = signal->theData[0];
732
c_operation_pool.getPtr(regOperPtr);
733
set_trans_state(regOperPtr.p, TRANS_DISCONNECTED);
734
c_operation_pool.release(regOperPtr);
736
signal->theData[0] = regOperPtr.p->userpointer;
737
sendSignal(DBLQH_REF, GSN_TUPRELEASECONF, signal, 1, JBB);
739
}//Dbtup::execTUPRELEASEREQ()
741
void Dbtup::releaseFragrec(FragrecordPtr regFragPtr)
743
regFragPtr.p->nextfreefrag = cfirstfreefrag;
744
cfirstfreefrag = regFragPtr.i;
745
}//Dbtup::releaseFragrec()