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 */
18
#define DBTUP_META_CPP
20
#include <RefConvert.hpp>
21
#include <ndb_limits.h>
23
#include <signaldata/TupFrag.hpp>
24
#include <signaldata/FsRef.hpp>
25
#include <signaldata/FsConf.hpp>
26
#include <signaldata/FsRemoveReq.hpp>
27
#include <signaldata/DropTab.hpp>
28
#include <signaldata/AlterTab.hpp>
29
#include <signaldata/CreateFilegroupImpl.hpp>
30
#include <AttributeDescriptor.hpp>
31
#include "AttributeOffset.hpp"
34
void Dbtup::execTUPFRAGREQ(Signal* signal)
38
TupFragReq* tupFragReq = (TupFragReq*)signal->getDataPtr();
39
if (tupFragReq->userPtr == (Uint32)-1) {
41
abortAddFragOp(signal);
45
FragoperrecPtr fragOperPtr;
46
FragrecordPtr regFragPtr;
47
TablerecPtr regTabPtr;
49
Uint32 userptr = tupFragReq->userPtr;
50
Uint32 userblockref = tupFragReq->userRef;
51
Uint32 reqinfo = tupFragReq->reqInfo;
52
regTabPtr.i = tupFragReq->tableId;
53
Uint32 noOfAttributes = tupFragReq->noOfAttr;
54
Uint32 fragId = tupFragReq->fragId;
55
/* Uint32 schemaVersion = tupFragReq->schemaVersion;*/
56
Uint32 noOfKeyAttr = tupFragReq->noOfKeyAttr;
57
Uint32 noOfCharsets = tupFragReq->noOfCharsets;
59
Uint32 checksumIndicator = tupFragReq->checksumIndicator;
60
Uint32 gcpIndicator = tupFragReq->globalCheckpointIdIndicator;
61
Uint32 tablespace_id= tupFragReq->tablespaceid;
62
Uint32 forceVarPart = tupFragReq->forceVarPartFlag;
65
(((Uint64)tupFragReq->maxRowsHigh) << 32) + tupFragReq->maxRowsLow;
67
(((Uint64)tupFragReq->minRowsHigh) << 32) + tupFragReq->minRowsLow;
70
// config mismatch - do not crash if release compiled
71
if (regTabPtr.i >= cnoOfTablerec) {
73
tupFragReq->userPtr = userptr;
74
tupFragReq->userRef = 800;
75
sendSignal(userblockref, GSN_TUPFRAGREF, signal, 2, JBB);
80
ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
81
if (cfirstfreeFragopr == RNIL) {
83
tupFragReq->userPtr = userptr;
84
tupFragReq->userRef = ZNOFREE_FRAGOP_ERROR;
85
sendSignal(userblockref, GSN_TUPFRAGREF, signal, 2, JBB);
88
seizeFragoperrec(fragOperPtr);
90
fragOperPtr.p->nextFragoprec = RNIL;
91
fragOperPtr.p->lqhBlockrefFrag = userblockref;
92
fragOperPtr.p->lqhPtrFrag = userptr;
93
fragOperPtr.p->fragidFrag = fragId;
94
fragOperPtr.p->tableidFrag = regTabPtr.i;
95
fragOperPtr.p->attributeCount = noOfAttributes;
97
memset(fragOperPtr.p->m_null_bits, 0, sizeof(fragOperPtr.p->m_null_bits));
98
memset(fragOperPtr.p->m_fix_attributes_size, 0,
99
sizeof(fragOperPtr.p->m_fix_attributes_size));
100
memset(fragOperPtr.p->m_var_attributes_size, 0,
101
sizeof(fragOperPtr.p->m_var_attributes_size));
103
fragOperPtr.p->charsetIndex = 0;
104
fragOperPtr.p->minRows = minRows;
105
fragOperPtr.p->maxRows = maxRows;
107
ndbrequire(reqinfo == ZADDFRAG);
109
getFragmentrec(regFragPtr, fragId, regTabPtr.p);
110
if (regFragPtr.i != RNIL) {
112
terrorCode= ZEXIST_FRAG_ERROR;
113
fragrefuse1Lab(signal, fragOperPtr);
116
if (cfirstfreefrag != RNIL) {
118
seizeFragrecord(regFragPtr);
121
terrorCode= ZFULL_FRAGRECORD_ERROR;
122
fragrefuse1Lab(signal, fragOperPtr);
125
initFragRange(regFragPtr.p);
126
if (!addfragtotab(regTabPtr.p, fragId, regFragPtr.i)) {
128
terrorCode= ZNO_FREE_TAB_ENTRY_ERROR;
129
fragrefuse2Lab(signal, fragOperPtr, regFragPtr);
132
if (cfirstfreerange == RNIL) {
134
terrorCode= ZNO_FREE_PAGE_RANGE_ERROR;
135
fragrefuse3Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
139
regFragPtr.p->fragTableId= regTabPtr.i;
140
regFragPtr.p->fragmentId= fragId;
141
regFragPtr.p->m_tablespace_id= tablespace_id;
142
regFragPtr.p->m_undo_complete= false;
143
regFragPtr.p->m_lcp_scan_op = RNIL;
144
regFragPtr.p->m_lcp_keep_list = RNIL;
145
regFragPtr.p->m_var_page_chunks = RNIL;
146
regFragPtr.p->m_restore_lcp_id = RNIL;
148
if (ERROR_INSERTED(4007) && regTabPtr.p->fragid[0] == fragId ||
149
ERROR_INSERTED(4008) && regTabPtr.p->fragid[1] == fragId) {
152
fragrefuse4Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
153
CLEAR_ERROR_INSERT_VALUE;
157
if (regTabPtr.p->tableStatus == NOT_DEFINED) {
159
//-----------------------------------------------------------------------------
160
// We are setting up references to the header of the tuple.
161
// Active operation This word contains a reference to the operation active
162
// on the tuple at the moment. RNIL means no one active at
163
// all. Not optional.
164
// Tuple version Uses only low 16 bits. Not optional.
165
// Checksum The third header word is optional and contains a checksum
166
// of the tuple header.
167
// Null-bits A number of words to contain null bits for all
168
// non-dynamic attributes. Each word contains upto 32 null
169
// bits. Each time a new word is needed we allocate the
170
// complete word. Zero nullable attributes means that there
172
//-----------------------------------------------------------------------------
173
fragOperPtr.p->definingFragment= true;
174
regTabPtr.p->tableStatus= DEFINING;
175
regTabPtr.p->m_bits = 0;
176
regTabPtr.p->m_bits |= (checksumIndicator ? Tablerec::TR_Checksum : 0);
177
regTabPtr.p->m_bits |= (gcpIndicator ? Tablerec::TR_RowGCI : 0);
178
regTabPtr.p->m_bits |= (forceVarPart ? Tablerec::TR_ForceVarPart : 0);
180
regTabPtr.p->m_offsets[MM].m_disk_ref_offset= 0;
181
regTabPtr.p->m_offsets[MM].m_null_words= 0;
182
regTabPtr.p->m_offsets[MM].m_fix_header_size= 0;
183
regTabPtr.p->m_offsets[MM].m_max_var_offset= 0;
185
regTabPtr.p->m_offsets[DD].m_disk_ref_offset= 0;
186
regTabPtr.p->m_offsets[DD].m_null_words= 0;
187
regTabPtr.p->m_offsets[DD].m_fix_header_size= 0;
188
regTabPtr.p->m_offsets[DD].m_max_var_offset= 0;
190
regTabPtr.p->m_attributes[MM].m_no_of_fixsize= 0;
191
regTabPtr.p->m_attributes[MM].m_no_of_varsize= 0;
192
regTabPtr.p->m_attributes[DD].m_no_of_fixsize= 0;
193
regTabPtr.p->m_attributes[DD].m_no_of_varsize= 0;
195
regTabPtr.p->noOfKeyAttr= noOfKeyAttr;
196
regTabPtr.p->noOfCharsets= noOfCharsets;
197
regTabPtr.p->m_no_of_attributes= noOfAttributes;
199
regTabPtr.p->notNullAttributeMask.clear();
200
regTabPtr.p->blobAttributeMask.clear();
203
Uint32 tableDescriptorRef= allocTabDescr(regTabPtr.p, offset);
204
if (tableDescriptorRef == RNIL) {
206
fragrefuse4Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
209
setUpDescriptorReferences(tableDescriptorRef, regTabPtr.p, offset);
212
fragOperPtr.p->definingFragment= false;
214
signal->theData[0]= fragOperPtr.p->lqhPtrFrag;
215
signal->theData[1]= fragOperPtr.i;
216
signal->theData[2]= regFragPtr.i;
217
signal->theData[3]= fragId;
218
sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUPFRAGCONF, signal, 4, JBB);
222
bool Dbtup::addfragtotab(Tablerec* const regTabPtr,
226
for (Uint32 i = 0; i < MAX_FRAG_PER_NODE; i++) {
228
if (regTabPtr->fragid[i] == RNIL) {
230
regTabPtr->fragid[i]= fragId;
231
regTabPtr->fragrec[i]= fragIndex;
238
void Dbtup::getFragmentrec(FragrecordPtr& regFragPtr,
240
Tablerec* const regTabPtr)
242
for (Uint32 i = 0; i < MAX_FRAG_PER_NODE; i++) {
244
if (regTabPtr->fragid[i] == fragId) {
246
regFragPtr.i= regTabPtr->fragrec[i];
247
ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);
255
void Dbtup::seizeFragrecord(FragrecordPtr& regFragPtr)
257
regFragPtr.i= cfirstfreefrag;
258
ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);
259
cfirstfreefrag= regFragPtr.p->nextfreefrag;
260
regFragPtr.p->nextfreefrag= RNIL;
263
void Dbtup::seizeFragoperrec(FragoperrecPtr& fragOperPtr)
265
fragOperPtr.i= cfirstfreeFragopr;
266
ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
267
cfirstfreeFragopr = fragOperPtr.p->nextFragoprec;
268
fragOperPtr.p->nextFragoprec = RNIL;
269
fragOperPtr.p->inUse = true;
270
}//Dbtup::seizeFragoperrec()
272
/* **************************************************************** */
273
/* ************** TUP_ADD_ATTRREQ ****************** */
274
/* **************************************************************** */
275
void Dbtup::execTUP_ADD_ATTRREQ(Signal* signal)
277
FragrecordPtr regFragPtr;
278
FragoperrecPtr fragOperPtr;
279
TablerecPtr regTabPtr;
282
fragOperPtr.i= signal->theData[0];
283
ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
284
Uint32 attrId = signal->theData[2];
285
Uint32 attrDescriptor = signal->theData[3];
286
Uint32 extType = AttributeDescriptor::getType(attrDescriptor);
287
// DICT sends charset number in upper half
288
Uint32 csNumber = (signal->theData[4] >> 16);
290
regTabPtr.i= fragOperPtr.p->tableidFrag;
291
ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
293
Uint32 fragId= fragOperPtr.p->fragidFrag;
295
getFragmentrec(regFragPtr, fragId, regTabPtr.p);
296
ndbrequire(regFragPtr.i != RNIL);
298
ndbrequire(fragOperPtr.p->attributeCount > 0);
299
fragOperPtr.p->attributeCount--;
300
const bool lastAttr = (fragOperPtr.p->attributeCount == 0);
302
if (regTabPtr.p->tableStatus != DEFINING)
304
ndbrequire(regTabPtr.p->tableStatus == DEFINED);
305
signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
306
signal->theData[1] = lastAttr;
307
sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
314
* Init Disk_alloc_info
316
CreateFilegroupImplReq rep;
317
if(regTabPtr.p->m_no_of_disk_attributes)
319
Tablespace_client tsman(0, c_tsman, 0, 0,
320
regFragPtr.p->m_tablespace_id);
321
ndbrequire(tsman.get_tablespace_info(&rep) == 0);
322
regFragPtr.p->m_logfile_group_id= rep.tablespace.logfile_group_id;
327
regFragPtr.p->m_logfile_group_id = RNIL;
329
new (®FragPtr.p->m_disk_alloc_info)
330
Disk_alloc_info(regTabPtr.p, rep.tablespace.extent_size);
331
releaseFragoperrec(fragOperPtr);
336
Uint32 firstTabDesIndex= regTabPtr.p->tabDescriptor + (attrId * ZAD_SIZE);
337
setTabDescrWord(firstTabDesIndex, attrDescriptor);
338
Uint32 attrLen = AttributeDescriptor::getSize(attrDescriptor);
341
if (!AttributeDescriptor::getDynamic(attrDescriptor)) {
343
Uint32 pos= 0, null_pos;
344
Uint32 bytes= AttributeDescriptor::getSizeInBytes(attrDescriptor);
345
Uint32 words= (bytes + 3) / 4;
346
Uint32 ind= AttributeDescriptor::getDiskBased(attrDescriptor);
347
ndbrequire(ind <= 1);
348
null_pos= fragOperPtr.p->m_null_bits[ind];
350
if (AttributeDescriptor::getNullable(attrDescriptor))
353
fragOperPtr.p->m_null_bits[ind]++;
357
regTabPtr.p->notNullAttributeMask.set(attrId);
360
if (extType == NDB_TYPE_BLOB || extType == NDB_TYPE_TEXT) {
361
regTabPtr.p->blobAttributeMask.set(attrId);
364
switch (AttributeDescriptor::getArrayType(attrDescriptor)) {
365
case NDB_ARRAYTYPE_FIXED:
368
regTabPtr.p->m_attributes[ind].m_no_of_fixsize++;
372
pos= fragOperPtr.p->m_fix_attributes_size[ind];
373
fragOperPtr.p->m_fix_attributes_size[ind] += words;
378
Uint32 bitCount = AttributeDescriptor::getArraySize(attrDescriptor);
379
fragOperPtr.p->m_null_bits[ind] += bitCount;
386
fragOperPtr.p->m_var_attributes_size[ind] += bytes;
387
pos= regTabPtr.p->m_attributes[ind].m_no_of_varsize++;
392
AttributeOffset::setOffset(attrDes2, pos);
393
AttributeOffset::setNullFlagPos(attrDes2, null_pos);
398
CHARSET_INFO* cs = all_charsets[csNumber];
399
ndbrequire(cs != NULL);
401
while (i < fragOperPtr.p->charsetIndex) {
403
if (regTabPtr.p->charsetArray[i] == cs)
407
if (i == fragOperPtr.p->charsetIndex) {
409
fragOperPtr.p->charsetIndex++;
411
ndbrequire(i < regTabPtr.p->noOfCharsets);
412
regTabPtr.p->charsetArray[i]= cs;
413
AttributeOffset::setCharsetPos(attrDes2, i);
415
setTabDescrWord(firstTabDesIndex + 1, attrDes2);
417
if (ERROR_INSERTED(4009) && regTabPtr.p->fragid[0] == fragId && attrId == 0||
418
ERROR_INSERTED(4010) && regTabPtr.p->fragid[0] == fragId && lastAttr ||
419
ERROR_INSERTED(4011) && regTabPtr.p->fragid[1] == fragId && attrId == 0||
420
ERROR_INSERTED(4012) && regTabPtr.p->fragid[1] == fragId && lastAttr) {
423
addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
424
CLEAR_ERROR_INSERT_VALUE;
428
/* **************************************************************** */
429
/* ************** TUP_ADD_ATTCONF ****************** */
430
/* **************************************************************** */
433
signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
434
signal->theData[1] = lastAttr;
435
sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
440
ndbrequire(regTabPtr.p->tableStatus == DEFINING);
441
regTabPtr.p->tableStatus= DEFINED;
442
regFragPtr.p->fragStatus= ACTIVE;
444
#define BTW(x) ((x+31) >> 5)
445
regTabPtr.p->m_offsets[MM].m_null_words= BTW(fragOperPtr.p->m_null_bits[MM]);
446
regTabPtr.p->m_offsets[DD].m_null_words= BTW(fragOperPtr.p->m_null_bits[DD]);
451
Uint32 pos[2] = { 0, 0 };
452
if (regTabPtr.p->m_bits & Tablerec::TR_Checksum)
457
if (regTabPtr.p->m_bits & Tablerec::TR_RowGCI)
463
regTabPtr.p->m_no_of_disk_attributes=
464
regTabPtr.p->m_attributes[DD].m_no_of_fixsize +
465
regTabPtr.p->m_attributes[DD].m_no_of_varsize;
467
if(regTabPtr.p->m_no_of_disk_attributes > 0)
469
regTabPtr.p->m_offsets[MM].m_disk_ref_offset= pos[MM];
470
pos[MM] += Disk_part_ref::SZ32; // 8 bytes
475
* var part ref is stored at m_disk_ref_offset + Disk_part_ref::SZ32
477
regTabPtr.p->m_offsets[MM].m_disk_ref_offset= pos[MM]-Disk_part_ref::SZ32;
480
if (regTabPtr.p->m_attributes[MM].m_no_of_varsize)
482
pos[MM] += Var_part_ref::SZ32;
483
regTabPtr.p->m_bits &= ~(Uint32)Tablerec::TR_ForceVarPart;
485
else if (regTabPtr.p->m_bits & Tablerec::TR_ForceVarPart)
487
pos[MM] += Var_part_ref::SZ32;
490
regTabPtr.p->m_offsets[MM].m_null_offset= pos[MM];
491
regTabPtr.p->m_offsets[DD].m_null_offset= pos[DD];
493
pos[MM]+= regTabPtr.p->m_offsets[MM].m_null_words;
494
pos[DD]+= regTabPtr.p->m_offsets[DD].m_null_words;
496
Uint32 *tabDesc = (Uint32*)(tableDescriptor+regTabPtr.p->tabDescriptor);
497
for(Uint32 i= 0; i<regTabPtr.p->m_no_of_attributes; i++)
499
Uint32 ind= AttributeDescriptor::getDiskBased(* tabDesc);
500
Uint32 arr= AttributeDescriptor::getArrayType(* tabDesc++);
502
if(arr == NDB_ARRAYTYPE_FIXED)
504
Uint32 desc= * tabDesc;
505
Uint32 off= AttributeOffset::getOffset(desc) + pos[ind];
506
AttributeOffset::setOffset(desc, off);
512
regTabPtr.p->m_offsets[MM].m_fix_header_size=
513
Tuple_header::HeaderSize +
514
fragOperPtr.p->m_fix_attributes_size[MM] +
517
regTabPtr.p->m_offsets[DD].m_fix_header_size=
518
fragOperPtr.p->m_fix_attributes_size[DD] +
521
if(regTabPtr.p->m_attributes[DD].m_no_of_varsize == 0 &&
522
regTabPtr.p->m_attributes[DD].m_no_of_fixsize > 0)
523
regTabPtr.p->m_offsets[DD].m_fix_header_size += Tuple_header::HeaderSize;
525
regTabPtr.p->m_offsets[MM].m_max_var_offset=
526
fragOperPtr.p->m_var_attributes_size[MM];
528
regTabPtr.p->m_offsets[DD].m_max_var_offset=
529
fragOperPtr.p->m_var_attributes_size[DD];
531
regTabPtr.p->total_rec_size=
532
pos[MM] + fragOperPtr.p->m_fix_attributes_size[MM] +
533
pos[DD] + fragOperPtr.p->m_fix_attributes_size[DD] +
534
((fragOperPtr.p->m_var_attributes_size[MM] + 3) >> 2) +
535
((fragOperPtr.p->m_var_attributes_size[DD] + 3) >> 2) +
536
(regTabPtr.p->m_attributes[MM].m_no_of_varsize ?
537
(regTabPtr.p->m_attributes[MM].m_no_of_varsize + 2) >> 1 : 0) +
538
(regTabPtr.p->m_attributes[DD].m_no_of_varsize ?
539
(regTabPtr.p->m_attributes[DD].m_no_of_varsize + 2) >> 1 : 0) +
540
Tuple_header::HeaderSize +
541
(regTabPtr.p->m_no_of_disk_attributes ? Tuple_header::HeaderSize : 0);
543
setUpQueryRoutines(regTabPtr.p);
544
setUpKeyArray(regTabPtr.p);
547
ndbout << *regTabPtr.p << endl;
548
Uint32 idx= regTabPtr.p->tabDescriptor;
549
for(Uint32 i = 0; i<regTabPtr.p->m_no_of_attributes; i++)
551
ndbout << i << ": " << endl;
552
ndbout << *(AttributeDescriptor*)(tableDescriptor+idx) << endl;
553
ndbout << *(AttributeOffset*)(tableDescriptor+idx+1) << endl;
559
Uint32 fix_tupheader = regTabPtr.p->m_offsets[MM].m_fix_header_size;
560
ndbassert(fix_tupheader > 0);
561
Uint32 noRowsPerPage = ZWORDS_ON_PAGE / fix_tupheader;
562
Uint32 noAllocatedPages =
563
(fragOperPtr.p->minRows + noRowsPerPage - 1 )/ noRowsPerPage;
564
if (fragOperPtr.p->minRows == 0)
565
noAllocatedPages = 2;
566
else if (noAllocatedPages == 0)
567
noAllocatedPages = 2;
568
noAllocatedPages = allocFragPages(regFragPtr.p, noAllocatedPages);
570
if (noAllocatedPages == 0) {
572
terrorCode = ZNO_PAGES_ALLOCATED_ERROR;
573
addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
578
CreateFilegroupImplReq rep;
579
if(regTabPtr.p->m_no_of_disk_attributes)
582
Tablespace_client tsman(0, c_tsman, 0, 0,
583
regFragPtr.p->m_tablespace_id);
584
ndbrequire(tsman.get_tablespace_info(&rep) == 0);
585
regFragPtr.p->m_logfile_group_id= rep.tablespace.logfile_group_id;
590
regFragPtr.p->m_logfile_group_id = RNIL;
593
new (®FragPtr.p->m_disk_alloc_info)
594
Disk_alloc_info(regTabPtr.p, rep.tablespace.extent_size);
596
if (regTabPtr.p->m_no_of_disk_attributes)
599
if(!(getNodeState().startLevel == NodeState::SL_STARTING &&
600
getNodeState().starting.startPhase <= 4))
605
cb.m_callbackData= fragOperPtr.i;
606
cb.m_callbackFunction =
607
safe_cast(&Dbtup::undo_createtable_callback);
608
Uint32 sz= sizeof(Disk_undo::Create) >> 2;
610
Logfile_client lgman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
612
c_lgman->alloc_log_space(regFragPtr.p->m_logfile_group_id, sz)))
614
addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
618
int res= lgman.get_log_buffer(signal, sz, &cb);
622
signal->theData[0] = 1;
625
ndbrequire("NOT YET IMPLEMENTED" == 0);
628
execute(signal, cb, regFragPtr.p->m_logfile_group_id);
633
signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
634
signal->theData[1] = lastAttr;
635
sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
638
releaseFragoperrec(fragOperPtr);
644
Dbtup::undo_createtable_callback(Signal* signal, Uint32 opPtrI, Uint32 unused)
646
FragrecordPtr regFragPtr;
647
FragoperrecPtr fragOperPtr;
648
TablerecPtr regTabPtr;
650
fragOperPtr.i= opPtrI;
651
ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
653
regTabPtr.i= fragOperPtr.p->tableidFrag;
654
ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
656
getFragmentrec(regFragPtr, fragOperPtr.p->fragidFrag, regTabPtr.p);
657
ndbrequire(regFragPtr.i != RNIL);
659
Logfile_client lgman(this, c_lgman, regFragPtr.p->m_logfile_group_id);
661
Disk_undo::Create create;
662
create.m_type_length= Disk_undo::UNDO_CREATE << 16 | (sizeof(create) >> 2);
663
create.m_table = regTabPtr.i;
665
Logfile_client::Change c[1] = {{ &create, sizeof(create) >> 2 } };
667
Uint64 lsn= lgman.add_entry(c, 1);
669
Logfile_client::Request req;
670
req.m_callback.m_callbackData= fragOperPtr.i;
671
req.m_callback.m_callbackFunction =
672
safe_cast(&Dbtup::undo_createtable_logsync_callback);
674
int ret = lgman.sync_lsn(signal, lsn, &req, 0);
679
warningEvent("Failed to sync log for create of table: %u", regTabPtr.i);
681
execute(signal, req.m_callback, regFragPtr.p->m_logfile_group_id);
686
Dbtup::undo_createtable_logsync_callback(Signal* signal, Uint32 ptrI,
690
FragoperrecPtr fragOperPtr;
692
ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
694
signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
695
signal->theData[1] = 1;
696
sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF,
699
releaseFragoperrec(fragOperPtr);
703
* Descriptor has these parts:
705
* 0 readFunctionArray ( one for each attribute )
706
* 1 updateFunctionArray ( ditto )
707
* 2 charsetArray ( pointers to distinct CHARSET_INFO )
708
* 3 readKeyArray ( attribute ids of keys )
709
* 5 tabDescriptor ( attribute descriptors, each ZAD_SIZE )
711
void Dbtup::setUpDescriptorReferences(Uint32 descriptorReference,
712
Tablerec* const regTabPtr,
713
const Uint32* offset)
715
Uint32* desc= &tableDescriptor[descriptorReference].tabDescr;
716
regTabPtr->readFunctionArray= (ReadFunction*)(desc + offset[0]);
717
regTabPtr->updateFunctionArray= (UpdateFunction*)(desc + offset[1]);
718
regTabPtr->charsetArray= (CHARSET_INFO**)(desc + offset[2]);
719
regTabPtr->readKeyArray= descriptorReference + offset[3];
720
regTabPtr->tabDescriptor= descriptorReference + offset[4];
721
regTabPtr->m_real_order_descriptor = descriptorReference + offset[5];
725
Dbtup::sizeOfReadFunction()
727
ReadFunction* tmp= (ReadFunction*)&tableDescriptor[0];
728
TableDescriptor* start= &tableDescriptor[0];
729
TableDescriptor * end= (TableDescriptor*)(tmp + 1);
730
return (Uint32)(end - start);
733
void Dbtup::setUpKeyArray(Tablerec* const regTabPtr)
735
ndbrequire((regTabPtr->readKeyArray + regTabPtr->noOfKeyAttr) <
737
Uint32* keyArray= &tableDescriptor[regTabPtr->readKeyArray].tabDescr;
738
Uint32 countKeyAttr= 0;
739
for (Uint32 i= 0; i < regTabPtr->m_no_of_attributes; i++) {
741
Uint32 refAttr= regTabPtr->tabDescriptor + (i * ZAD_SIZE);
742
Uint32 attrDescriptor= getTabDescrWord(refAttr);
743
if (AttributeDescriptor::getPrimaryKey(attrDescriptor)) {
745
AttributeHeader::init(&keyArray[countKeyAttr], i, 0);
749
ndbrequire(countKeyAttr == regTabPtr->noOfKeyAttr);
752
* Setup real order array (16 bit per column)
754
const Uint32 off= regTabPtr->m_real_order_descriptor;
755
const Uint32 sz= (regTabPtr->m_no_of_attributes + 1) >> 1;
756
ndbrequire((off + sz) < cnoOfTabDescrRec);
759
Uint16* order= (Uint16*)&tableDescriptor[off].tabDescr;
760
for (Uint32 type = 0; type < 4; type++)
762
for (Uint32 i= 0; i < regTabPtr->m_no_of_attributes; i++)
765
Uint32 refAttr= regTabPtr->tabDescriptor + (i * ZAD_SIZE);
766
Uint32 desc = getTabDescrWord(refAttr);
769
if (AttributeDescriptor::getArrayType(desc) != NDB_ARRAYTYPE_FIXED)
773
if (AttributeDescriptor::getDiskBased(desc))
780
* order++ = i << ZAD_LOG_SIZE;
785
ndbrequire(cnt == regTabPtr->m_no_of_attributes);
788
void Dbtup::addattrrefuseLab(Signal* signal,
789
FragrecordPtr regFragPtr,
790
FragoperrecPtr fragOperPtr,
791
Tablerec* const regTabPtr,
794
releaseFragPages(regFragPtr.p);
795
deleteFragTab(regTabPtr, fragId);
796
releaseFragrec(regFragPtr);
797
releaseTabDescr(regTabPtr);
800
signal->theData[0]= fragOperPtr.p->lqhPtrFrag;
801
signal->theData[1]= terrorCode;
802
sendSignal(fragOperPtr.p->lqhBlockrefFrag,
803
GSN_TUP_ADD_ATTRREF, signal, 2, JBB);
804
releaseFragoperrec(fragOperPtr);
807
void Dbtup::fragrefuse4Lab(Signal* signal,
808
FragoperrecPtr fragOperPtr,
809
FragrecordPtr regFragPtr,
810
Tablerec* const regTabPtr,
813
releaseFragPages(regFragPtr.p);
814
fragrefuse3Lab(signal, fragOperPtr, regFragPtr, regTabPtr, fragId);
818
void Dbtup::fragrefuse3Lab(Signal* signal,
819
FragoperrecPtr fragOperPtr,
820
FragrecordPtr regFragPtr,
821
Tablerec* const regTabPtr,
824
fragrefuse2Lab(signal, fragOperPtr, regFragPtr);
825
deleteFragTab(regTabPtr, fragId);
828
void Dbtup::fragrefuse2Lab(Signal* signal,
829
FragoperrecPtr fragOperPtr,
830
FragrecordPtr regFragPtr)
832
fragrefuse1Lab(signal, fragOperPtr);
833
releaseFragrec(regFragPtr);
836
void Dbtup::fragrefuse1Lab(Signal* signal, FragoperrecPtr fragOperPtr)
838
fragrefuseLab(signal, fragOperPtr);
839
releaseFragoperrec(fragOperPtr);
842
void Dbtup::fragrefuseLab(Signal* signal, FragoperrecPtr fragOperPtr)
844
signal->theData[0]= fragOperPtr.p->lqhPtrFrag;
845
signal->theData[1]= terrorCode;
846
sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUPFRAGREF, signal, 2, JBB);
849
void Dbtup::releaseFragoperrec(FragoperrecPtr fragOperPtr)
851
fragOperPtr.p->inUse = false;
852
fragOperPtr.p->nextFragoprec = cfirstfreeFragopr;
853
cfirstfreeFragopr = fragOperPtr.i;
854
}//Dbtup::releaseFragoperrec()
856
void Dbtup::deleteFragTab(Tablerec* const regTabPtr, Uint32 fragId)
858
for (Uint32 i = 0; i < MAX_FRAG_PER_NODE; i++) {
860
if (regTabPtr->fragid[i] == fragId) {
862
regTabPtr->fragid[i]= RNIL;
863
regTabPtr->fragrec[i]= RNIL;
871
* LQH aborts on-going create table operation. The table is later
874
void Dbtup::abortAddFragOp(Signal* signal)
876
FragoperrecPtr fragOperPtr;
878
fragOperPtr.i = signal->theData[1];
879
ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
880
ndbrequire(fragOperPtr.p->inUse);
881
releaseFragoperrec(fragOperPtr);
885
Dbtup::execDROP_TAB_REQ(Signal* signal)
888
if (ERROR_INSERTED(4013)) {
893
DropTabReq* req= (DropTabReq*)signal->getDataPtr();
896
tabPtr.i= req->tableId;
897
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
899
tabPtr.p->m_dropTable.tabUserRef = req->senderRef;
900
tabPtr.p->m_dropTable.tabUserPtr = req->senderData;
901
tabPtr.p->tableStatus = DROPPING;
903
signal->theData[0]= ZREL_FRAG;
904
signal->theData[1]= tabPtr.i;
905
signal->theData[2]= RNIL;
906
sendSignal(cownref, GSN_CONTINUEB, signal, 3, JBB);
909
void Dbtup::releaseTabDescr(Tablerec* const regTabPtr)
911
Uint32 descriptor= regTabPtr->readKeyArray;
912
if (descriptor != RNIL) {
915
getTabDescrOffsets(regTabPtr, offset);
917
regTabPtr->tabDescriptor= RNIL;
918
regTabPtr->readKeyArray= RNIL;
919
regTabPtr->readFunctionArray= NULL;
920
regTabPtr->updateFunctionArray= NULL;
921
regTabPtr->charsetArray= NULL;
923
// move to start of descriptor
924
descriptor -= offset[3];
925
Uint32 retNo= getTabDescrWord(descriptor + ZTD_DATASIZE);
926
ndbrequire(getTabDescrWord(descriptor + ZTD_HEADER) == ZTD_TYPE_NORMAL);
927
ndbrequire(retNo == getTabDescrWord((descriptor + retNo) - ZTD_TR_SIZE));
928
ndbrequire(ZTD_TYPE_NORMAL ==
929
getTabDescrWord((descriptor + retNo) - ZTD_TR_TYPE));
930
freeTabDescr(descriptor, retNo);
934
void Dbtup::releaseFragment(Signal* signal, Uint32 tableId,
935
Uint32 logfile_group_id)
939
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
940
Uint32 fragIndex = RNIL;
941
Uint32 fragId = RNIL;
943
for (i = 0; i < MAX_FRAG_PER_NODE; i++) {
945
if (tabPtr.p->fragid[i] != RNIL) {
947
fragIndex= tabPtr.p->fragrec[i];
948
fragId= tabPtr.p->fragid[i];
952
if (fragIndex != RNIL) {
955
signal->theData[0] = ZUNMAP_PAGES;
956
signal->theData[1] = tabPtr.i;
957
signal->theData[2] = fragIndex;
958
signal->theData[3] = 0;
959
sendSignal(cownref, GSN_CONTINUEB, signal, 4, JBB);
963
if (logfile_group_id != RNIL)
966
cb.m_callbackData= tabPtr.i;
967
cb.m_callbackFunction =
968
safe_cast(&Dbtup::drop_table_log_buffer_callback);
969
Uint32 sz= sizeof(Disk_undo::Drop) >> 2;
970
int r0 = c_lgman->alloc_log_space(logfile_group_id, sz);
974
warningEvent("Failed to alloc log space for drop table: %u",
979
Logfile_client lgman(this, c_lgman, logfile_group_id);
980
int res= lgman.get_log_buffer(signal, sz, &cb);
986
warningEvent("Failed to get log buffer for drop table: %u",
988
c_lgman->free_log_space(logfile_group_id, sz);
992
execute(signal, cb, logfile_group_id);
998
drop_table_logsync_callback(signal, tabPtr.i, RNIL);
1002
Dbtup::drop_fragment_unmap_pages(Signal *signal,
1004
FragrecordPtr fragPtr,
1007
if (tabPtr.p->m_no_of_disk_attributes)
1010
Disk_alloc_info& alloc_info= fragPtr.p->m_disk_alloc_info;
1012
if (!alloc_info.m_unmap_pages.isEmpty())
1015
ndbout_c("waiting for unmape pages");
1016
signal->theData[0] = ZUNMAP_PAGES;
1017
signal->theData[1] = tabPtr.i;
1018
signal->theData[2] = fragPtr.i;
1019
signal->theData[3] = pos;
1020
sendSignal(cownref, GSN_CONTINUEB, signal, 4, JBB);
1023
while(alloc_info.m_dirty_pages[pos].isEmpty() && pos < MAX_FREE_LIST)
1026
if (pos == MAX_FREE_LIST)
1028
if(alloc_info.m_curr_extent_info_ptr_i != RNIL)
1030
Local_extent_info_list
1031
list(c_extent_pool, alloc_info.m_free_extents[0]);
1032
Ptr<Extent_info> ext_ptr;
1033
c_extent_pool.getPtr(ext_ptr, alloc_info.m_curr_extent_info_ptr_i);
1035
alloc_info.m_curr_extent_info_ptr_i= RNIL;
1038
drop_fragment_free_extent(signal, tabPtr, fragPtr, 0);
1043
ArrayPool<Page> *pool= (ArrayPool<Page>*)&m_global_page_pool;
1045
LocalDLList<Page> list(*pool, alloc_info.m_dirty_pages[pos]);
1046
list.first(pagePtr);
1047
list.remove(pagePtr);
1050
Page_cache_client::Request req;
1051
req.m_page.m_page_no = pagePtr.p->m_page_no;
1052
req.m_page.m_file_no = pagePtr.p->m_file_no;
1054
req.m_callback.m_callbackData= pos;
1055
req.m_callback.m_callbackFunction =
1056
safe_cast(&Dbtup::drop_fragment_unmap_page_callback);
1058
int flags= Page_cache_client::COMMIT_REQ;
1059
int res= m_pgman.get_page(signal, req, flags);
1066
ndbrequire((Uint32)res == pagePtr.i);
1067
drop_fragment_unmap_page_callback(signal, pos, res);
1071
drop_fragment_free_extent(signal, tabPtr, fragPtr, 0);
1075
Dbtup::drop_fragment_unmap_page_callback(Signal* signal,
1076
Uint32 pos, Uint32 page_id)
1078
Ptr<GlobalPage> page;
1079
m_global_page_pool.getPtr(page, page_id);
1082
key.m_page_no = ((Page*)page.p)->m_page_no;
1083
key.m_file_no = ((Page*)page.p)->m_file_no;
1085
Uint32 fragId = ((Page*)page.p)->m_fragment_id;
1086
Uint32 tableId = ((Page*)page.p)->m_table_id;
1087
m_pgman.drop_page(key, page_id);
1091
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1093
FragrecordPtr fragPtr;
1094
getFragmentrec(fragPtr, fragId, tabPtr.p);
1096
signal->theData[0] = ZUNMAP_PAGES;
1097
signal->theData[1] = tabPtr.i;
1098
signal->theData[2] = fragPtr.i;
1099
signal->theData[3] = pos;
1100
sendSignal(cownref, GSN_CONTINUEB, signal, 4, JBB);
1104
Dbtup::drop_fragment_free_extent(Signal *signal,
1106
FragrecordPtr fragPtr,
1109
if (tabPtr.p->m_no_of_disk_attributes)
1111
Disk_alloc_info& alloc_info= fragPtr.p->m_disk_alloc_info;
1112
for(; pos<EXTENT_SEARCH_MATRIX_SIZE; pos++)
1114
if(!alloc_info.m_free_extents[pos].isEmpty())
1118
cb.m_callbackData= fragPtr.i;
1119
cb.m_callbackFunction =
1120
safe_cast(&Dbtup::drop_fragment_free_extent_log_buffer_callback);
1121
#if NOT_YET_UNDO_FREE_EXTENT
1122
Uint32 sz= sizeof(Disk_undo::FreeExtent) >> 2;
1123
(void) c_lgman->alloc_log_space(fragPtr.p->m_logfile_group_id, sz);
1125
Logfile_client lgman(this, c_lgman, fragPtr.p->m_logfile_group_id);
1127
int res= lgman.get_log_buffer(signal, sz, &cb);
1133
ndbrequire("NOT YET IMPLEMENTED" == 0);
1136
execute(signal, cb, fragPtr.p->m_logfile_group_id);
1140
execute(signal, cb, fragPtr.p->m_logfile_group_id);
1146
ArrayPool<Page> *cheat_pool= (ArrayPool<Page>*)&m_global_page_pool;
1147
for(pos= 0; pos<MAX_FREE_LIST; pos++)
1149
ndbrequire(alloc_info.m_page_requests[pos].isEmpty());
1150
LocalDLList<Page> list(* cheat_pool, alloc_info.m_dirty_pages[pos]);
1155
signal->theData[0] = ZFREE_VAR_PAGES;
1156
signal->theData[1] = tabPtr.i;
1157
signal->theData[2] = fragPtr.i;
1158
sendSignal(reference(), GSN_CONTINUEB, signal, 3, JBB);
1162
Dbtup::drop_table_log_buffer_callback(Signal* signal, Uint32 tablePtrI,
1163
Uint32 logfile_group_id)
1166
tabPtr.i = tablePtrI;
1167
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1169
ndbrequire(tabPtr.p->m_no_of_disk_attributes);
1171
Disk_undo::Drop drop;
1172
drop.m_table = tabPtr.i;
1173
drop.m_type_length =
1174
(Disk_undo::UNDO_DROP << 16) | (sizeof(drop) >> 2);
1175
Logfile_client lgman(this, c_lgman, logfile_group_id);
1177
Logfile_client::Change c[1] = {{ &drop, sizeof(drop) >> 2 } };
1178
Uint64 lsn = lgman.add_entry(c, 1);
1180
Logfile_client::Request req;
1181
req.m_callback.m_callbackData= tablePtrI;
1182
req.m_callback.m_callbackFunction =
1183
safe_cast(&Dbtup::drop_table_logsync_callback);
1185
int ret = lgman.sync_lsn(signal, lsn, &req, 0);
1190
warningEvent("Failed to syn log for drop of table: %u", tablePtrI);
1192
execute(signal, req.m_callback, logfile_group_id);
1197
Dbtup::drop_table_logsync_callback(Signal* signal,
1199
Uint32 logfile_group_id)
1203
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1205
DropTabConf * const dropConf= (DropTabConf *)signal->getDataPtrSend();
1206
dropConf->senderRef= reference();
1207
dropConf->senderData= tabPtr.p->m_dropTable.tabUserPtr;
1208
dropConf->tableId= tabPtr.i;
1209
sendSignal(tabPtr.p->m_dropTable.tabUserRef, GSN_DROP_TAB_CONF,
1210
signal, DropTabConf::SignalLength, JBB);
1212
releaseTabDescr(tabPtr.p);
1217
Dbtup::drop_fragment_free_extent_log_buffer_callback(Signal* signal,
1221
FragrecordPtr fragPtr;
1222
fragPtr.i = fragPtrI;
1223
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
1226
tabPtr.i = fragPtr.p->fragTableId;
1227
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1229
ndbrequire(tabPtr.p->m_no_of_disk_attributes);
1230
Disk_alloc_info& alloc_info= fragPtr.p->m_disk_alloc_info;
1232
for(Uint32 pos = 0; pos<EXTENT_SEARCH_MATRIX_SIZE; pos++)
1234
if(!alloc_info.m_free_extents[pos].isEmpty())
1237
Local_extent_info_list
1238
list(c_extent_pool, alloc_info.m_free_extents[pos]);
1239
Ptr<Extent_info> ext_ptr;
1240
list.first(ext_ptr);
1242
#if NOT_YET_UNDO_FREE_EXTENT
1243
#error "This code is complete"
1244
#error "but not needed until we do dealloc of empty extents"
1245
Disk_undo::FreeExtent free;
1246
free.m_table = tabPtr.i;
1247
free.m_fragment = fragPtr.p->fragmentId;
1248
free.m_file_no = ext_ptr.p->m_key.m_file_no;
1249
free.m_page_no = ext_ptr.p->m_key.m_page_no;
1250
free.m_type_length =
1251
(Disk_undo::UNDO_FREE_EXTENT << 16) | (sizeof(free) >> 2);
1252
Logfile_client lgman(this, c_lgman, fragPtr.p->m_logfile_group_id);
1254
Logfile_client::Change c[1] = {{ &free, sizeof(free) >> 2 } };
1255
Uint64 lsn = lgman.add_entry(c, 1);
1260
Tablespace_client tsman(signal, c_tsman, tabPtr.i,
1261
fragPtr.p->fragmentId,
1262
fragPtr.p->m_tablespace_id);
1264
tsman.free_extent(&ext_ptr.p->m_key, lsn);
1265
c_extent_hash.remove(ext_ptr);
1266
list.release(ext_ptr);
1268
signal->theData[0] = ZFREE_EXTENT;
1269
signal->theData[1] = tabPtr.i;
1270
signal->theData[2] = fragPtr.i;
1271
signal->theData[3] = pos;
1272
sendSignal(cownref, GSN_CONTINUEB, signal, 4, JBB);
1280
Dbtup::drop_fragment_free_var_pages(Signal* signal)
1283
Uint32 tableId = signal->theData[1];
1284
Uint32 fragPtrI = signal->theData[2];
1288
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1290
FragrecordPtr fragPtr;
1291
fragPtr.i = fragPtrI;
1292
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
1295
if ((pagePtr.i = fragPtr.p->m_var_page_chunks) != RNIL)
1297
c_page_pool.getPtr(pagePtr);
1298
Var_page* page = (Var_page*)pagePtr.p;
1299
fragPtr.p->m_var_page_chunks = page->next_chunk;
1301
Uint32 sz = page->chunk_size;
1302
returnCommonArea(pagePtr.i, sz);
1304
signal->theData[0] = ZFREE_VAR_PAGES;
1305
signal->theData[1] = tabPtr.i;
1306
signal->theData[2] = fragPtr.i;
1307
sendSignal(cownref, GSN_CONTINUEB, signal, 3, JBB);
1312
* Remove LCP's for fragment
1314
tabPtr.p->m_dropTable.m_lcpno = 0;
1315
tabPtr.p->m_dropTable.m_fragPtrI = fragPtr.i;
1316
drop_fragment_fsremove(signal, tabPtr, fragPtr);
1320
Dbtup::drop_fragment_fsremove_done(Signal* signal,
1322
FragrecordPtr fragPtr)
1326
* now continue with "next"
1328
Uint32 logfile_group_id = fragPtr.p->m_logfile_group_id ;
1329
releaseFragPages(fragPtr.p);
1331
for(i= 0; i<MAX_FRAG_PER_NODE; i++)
1332
if(tabPtr.p->fragrec[i] == fragPtr.i)
1335
ndbrequire(i != MAX_FRAG_PER_NODE);
1336
tabPtr.p->fragid[i]= RNIL;
1337
tabPtr.p->fragrec[i]= RNIL;
1338
releaseFragrec(fragPtr);
1340
signal->theData[0]= ZREL_FRAG;
1341
signal->theData[1]= tabPtr.i;
1342
signal->theData[2]= logfile_group_id;
1343
sendSignal(cownref, GSN_CONTINUEB, signal, 3, JBB);
1350
Dbtup::drop_fragment_fsremove(Signal* signal,
1352
FragrecordPtr fragPtr)
1354
FsRemoveReq* req = (FsRemoveReq*)signal->getDataPtrSend();
1355
req->userReference = reference();
1356
req->userPointer = tabPtr.i;
1358
req->ownDirectory = 0;
1360
Uint32 lcpno = tabPtr.p->m_dropTable.m_lcpno;
1361
Uint32 fragId = fragPtr.p->fragmentId;
1362
Uint32 tableId = fragPtr.p->fragTableId;
1364
FsOpenReq::setVersion(req->fileNumber, 5);
1365
FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA);
1366
FsOpenReq::v5_setLcpNo(req->fileNumber, lcpno);
1367
FsOpenReq::v5_setTableId(req->fileNumber, tableId);
1368
FsOpenReq::v5_setFragmentId(req->fileNumber, fragId);
1369
sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal,
1370
FsRemoveReq::SignalLength, JBB);
1374
Dbtup::execFSREMOVEREF(Signal* signal)
1377
FsRef* ref = (FsRef*)signal->getDataPtr();
1378
Uint32 userPointer = ref->userPointer;
1379
FsConf* conf = (FsConf*)signal->getDataPtrSend();
1380
conf->userPointer = userPointer;
1381
execFSREMOVECONF(signal);
1385
Dbtup::execFSREMOVECONF(Signal* signal)
1388
FsConf* conf = (FsConf*)signal->getDataPtrSend();
1391
FragrecordPtr fragPtr;
1393
tabPtr.i = conf->userPointer;
1394
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1396
ndbrequire(tabPtr.p->tableStatus == DROPPING);
1398
fragPtr.i = tabPtr.p->m_dropTable.m_fragPtrI;
1399
ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord);
1401
tabPtr.p->m_dropTable.m_lcpno++;
1402
if (tabPtr.p->m_dropTable.m_lcpno < 3)
1405
drop_fragment_fsremove(signal, tabPtr, fragPtr);
1410
drop_fragment_fsremove_done(signal, tabPtr, fragPtr);
1416
Dbtup::start_restore_lcp(Uint32 tableId, Uint32 fragId)
1420
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1422
tabPtr.p->m_dropTable.tabUserPtr= tabPtr.p->m_attributes[DD].m_no_of_fixsize;
1423
tabPtr.p->m_dropTable.tabUserRef= tabPtr.p->m_attributes[DD].m_no_of_varsize;
1425
Uint32 *tabDesc = (Uint32*)(tableDescriptor+tabPtr.p->tabDescriptor);
1426
for(Uint32 i= 0; i<tabPtr.p->m_no_of_attributes; i++)
1428
Uint32 disk= AttributeDescriptor::getDiskBased(* tabDesc);
1429
Uint32 null= AttributeDescriptor::getNullable(* tabDesc);
1431
ndbrequire(tabPtr.p->notNullAttributeMask.get(i) != null);
1433
tabPtr.p->notNullAttributeMask.clear(i);
1437
tabPtr.p->m_no_of_disk_attributes = 0;
1438
tabPtr.p->m_attributes[DD].m_no_of_fixsize = 0;
1439
tabPtr.p->m_attributes[DD].m_no_of_varsize = 0;
1442
Dbtup::complete_restore_lcp(Uint32 tableId, Uint32 fragId)
1446
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1448
tabPtr.p->m_attributes[DD].m_no_of_fixsize= tabPtr.p->m_dropTable.tabUserPtr;
1449
tabPtr.p->m_attributes[DD].m_no_of_varsize= tabPtr.p->m_dropTable.tabUserRef;
1451
tabPtr.p->m_no_of_disk_attributes =
1452
tabPtr.p->m_attributes[DD].m_no_of_fixsize +
1453
tabPtr.p->m_attributes[DD].m_no_of_varsize;
1455
Uint32 *tabDesc = (Uint32*)(tableDescriptor+tabPtr.p->tabDescriptor);
1456
for(Uint32 i= 0; i<tabPtr.p->m_no_of_attributes; i++)
1458
Uint32 disk= AttributeDescriptor::getDiskBased(* tabDesc);
1459
Uint32 null= AttributeDescriptor::getNullable(* tabDesc);
1462
tabPtr.p->notNullAttributeMask.set(i);
1469
Dbtup::get_frag_info(Uint32 tableId, Uint32 fragId, Uint32* maxPage)
1474
ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
1476
FragrecordPtr fragPtr;
1477
getFragmentrec(fragPtr, fragId, tabPtr.p);
1481
* maxPage = fragPtr.p->noOfPages;