MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DbtcInit.cpp
1 /*
2  Copyright (C) 2003-2008 MySQL AB, 2008-2010 Sun Microsystems, Inc.
3  All rights reserved. Use is subject to license terms.
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; version 2 of the License.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18 
19 #define DBTC_C
20 #include "Dbtc.hpp"
21 #include <pc.hpp>
22 #include <ndb_limits.h>
23 #include <Properties.hpp>
24 #include <Configuration.hpp>
25 
26 #define DEBUG(x) { ndbout << "TC::" << x << endl; }
27 
28 
29 void Dbtc::initData()
30 {
31  capiConnectFilesize = ZAPI_CONNECT_FILESIZE;
32  ccacheFilesize = ZAPI_CONNECT_FILESIZE;
33  chostFilesize = MAX_NODES;
34  cgcpFilesize = ZGCP_FILESIZE;
35  cscanrecFileSize = ZSCANREC_FILE_SIZE;
36  cscanFragrecFileSize = ZSCAN_FRAGREC_FILE_SIZE;
37  ctabrecFilesize = ZTABREC_FILESIZE;
38  ctcConnectFilesize = ZTC_CONNECT_FILESIZE;
39  cdihblockref = DBDIH_REF;
40  cdictblockref = DBDICT_REF;
41  clqhblockref = DBLQH_REF;
42  cerrorBlockref = NDBCNTR_REF;
43 
44  // Records with constant sizes
45  tcFailRecord = (TcFailRecord*)allocRecord("TcFailRecord",
46  sizeof(TcFailRecord), 1);
47 
48  // Variables
49  ctcTimer = 0;
50 
51  // Trigger and index pools
52  c_theDefinedTriggerPool.setSize(c_maxNumberOfDefinedTriggers);
53  c_theFiredTriggerPool.setSize(c_maxNumberOfFiredTriggers);
54  c_theIndexPool.setSize(c_maxNumberOfIndexes);
55  c_theIndexOperationPool.setSize(c_maxNumberOfIndexOperations);
56  c_theAttributeBufferPool.setSize(c_transactionBufferSpace);
57  c_firedTriggerHash.setSize((c_maxNumberOfFiredTriggers+10)/10);
58 }//Dbtc::initData()
59 
60 void Dbtc::initRecords()
61 {
62  void *p;
63  // Records with dynamic sizes
64  cacheRecord = (CacheRecord*)allocRecord("CacheRecord",
65  sizeof(CacheRecord),
66  ccacheFilesize);
67 
68  apiConnectRecord = (ApiConnectRecord*)allocRecord("ApiConnectRecord",
69  sizeof(ApiConnectRecord),
70  capiConnectFilesize);
71 
72  for(unsigned i = 0; i<capiConnectFilesize; i++) {
73  p = &apiConnectRecord[i];
74  new (p) ApiConnectRecord(c_theFiredTriggerPool,
76  }
77  // Init all fired triggers
79  FiredTriggerPtr tptr;
80  while(triggers.seize(tptr) == true) {
81  p= tptr.p;
82  new (p) TcFiredTriggerData();
83  }
84  triggers.release();
85 
86  /*
87  // Init all index records
88  ArrayList<TcIndexData> indexes(c_theIndexPool);
89  TcIndexDataPtr iptr;
90  while(indexes.seize(iptr) == true) {
91  new (iptr.p) TcIndexData(c_theAttrInfoListPool);
92  }
93  indexes.release();
94  */
95 
96  // Init all index operation records
98  TcIndexOperationPtr ioptr;
99  while(indexOps.seize(ioptr) == true) {
100  p= ioptr.p;
101  new (p) TcIndexOperation(); // TODO : Modify alloc size of c_theAttributeBufferPool
102  }
103  indexOps.release();
104 
105  c_apiConTimer = (UintR*)allocRecord("ApiConTimer",
106  sizeof(UintR),
107  capiConnectFilesize);
108 
109  c_apiConTimer_line = (UintR*)allocRecord("ApiConTimer_line",
110  sizeof(UintR),
111  capiConnectFilesize);
112 
113  tcConnectRecord = (TcConnectRecord*)allocRecord("TcConnectRecord",
114  sizeof(TcConnectRecord),
115  ctcConnectFilesize);
116 
117  m_commitAckMarkerPool.setSize(2 * capiConnectFilesize);
118  m_commitAckMarkerHash.setSize(1024);
119 
120  hostRecord = (HostRecord*)allocRecord("HostRecord",
121  sizeof(HostRecord),
122  chostFilesize);
123 
124  tableRecord = (TableRecord*)allocRecord("TableRecord",
125  sizeof(TableRecord),
126  ctabrecFilesize);
127 
128  scanRecord = (ScanRecord*)allocRecord("ScanRecord",
129  sizeof(ScanRecord),
130  cscanrecFileSize);
131 
132 
133  c_scan_frag_pool.setSize(cscanFragrecFileSize);
134  {
135  ScanFragRecPtr ptr;
136  SLList<ScanFragRec> tmp(c_scan_frag_pool);
137  while(tmp.seize(ptr)) {
138  new (ptr.p) ScanFragRec();
139  }
140  tmp.release();
141  }
142 
143  indexOps.release();
144 
145  gcpRecord = (GcpRecord*)allocRecord("GcpRecord",
146  sizeof(GcpRecord),
147  cgcpFilesize);
148 
149 }//Dbtc::initRecords()
150 
151 bool
152 Dbtc::getParam(const char* name, Uint32* count)
153 {
154  if (name != NULL && count != NULL)
155  {
156  /* FragmentInfoPool
157  * We increase the size of the fragment info pool
158  * to handle fragmented SCANTABREQ signals from
159  * the API
160  */
161  if (strcmp(name, "FragmentInfoPool") == 0)
162  {
163  /* Worst case is each API node sending a
164  * single fragmented request concurrently
165  * This could change in future if APIs can
166  * interleave fragments from different
167  * requests
168  */
169  *count= MAX_NODES + 10;
170  return true;
171  }
172  }
173  return false;
174 }
175 
176 Dbtc::Dbtc(Block_context& ctx, Uint32 instanceNo):
177  SimulatedBlock(DBTC, ctx, instanceNo),
178  c_theDefinedTriggers(c_theDefinedTriggerPool),
179  c_firedTriggerHash(c_theFiredTriggerPool),
180  c_maxNumberOfDefinedTriggers(0),
181  c_maxNumberOfFiredTriggers(0),
182  c_theIndexes(c_theIndexPool),
183  c_maxNumberOfIndexes(0),
184  c_maxNumberOfIndexOperations(0),
185  m_commitAckMarkerHash(m_commitAckMarkerPool)
186 {
187  BLOCK_CONSTRUCTOR(Dbtc);
188 
189  const ndb_mgm_configuration_iterator * p =
190  ctx.m_config.getOwnConfigIterator();
191  ndbrequire(p != 0);
192 
193  Uint32 transactionBufferMemory = 0;
194  Uint32 maxNoOfIndexes = 0, maxNoOfConcurrentIndexOperations = 0;
195  Uint32 maxNoOfTriggers = 0, maxNoOfFiredTriggers = 0;
196 
197  ndb_mgm_get_int_parameter(p, CFG_DB_TRANS_BUFFER_MEM,
198  &transactionBufferMemory);
199  ndb_mgm_get_int_parameter(p, CFG_DICT_TABLE,
200  &maxNoOfIndexes);
201  ndb_mgm_get_int_parameter(p, CFG_DB_NO_INDEX_OPS,
202  &maxNoOfConcurrentIndexOperations);
203  ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGERS,
204  &maxNoOfTriggers);
205  ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGER_OPS,
206  &maxNoOfFiredTriggers);
207 
208  c_transactionBufferSpace =
209  transactionBufferMemory / AttributeBuffer::getSegmentSize();
210  c_maxNumberOfIndexes = maxNoOfIndexes;
211  c_maxNumberOfIndexOperations = maxNoOfConcurrentIndexOperations;
212  c_maxNumberOfDefinedTriggers = maxNoOfTriggers;
213  c_maxNumberOfFiredTriggers = maxNoOfFiredTriggers;
214 
215  // Transit signals
216  addRecSignal(GSN_PACKED_SIGNAL, &Dbtc::execPACKED_SIGNAL);
217  addRecSignal(GSN_ABORTED, &Dbtc::execABORTED);
218  addRecSignal(GSN_ATTRINFO, &Dbtc::execATTRINFO);
219  addRecSignal(GSN_CONTINUEB, &Dbtc::execCONTINUEB);
220  addRecSignal(GSN_KEYINFO, &Dbtc::execKEYINFO);
221  addRecSignal(GSN_SCAN_NEXTREQ, &Dbtc::execSCAN_NEXTREQ);
222  addRecSignal(GSN_TAKE_OVERTCREQ, &Dbtc::execTAKE_OVERTCREQ);
223  addRecSignal(GSN_TAKE_OVERTCCONF, &Dbtc::execTAKE_OVERTCCONF);
224  addRecSignal(GSN_LQHKEYREF, &Dbtc::execLQHKEYREF);
225 
226  // Received signals
227 
228  addRecSignal(GSN_DUMP_STATE_ORD, &Dbtc::execDUMP_STATE_ORD);
229  addRecSignal(GSN_DBINFO_SCANREQ, &Dbtc::execDBINFO_SCANREQ);
230  addRecSignal(GSN_SEND_PACKED, &Dbtc::execSEND_PACKED, true);
231  addRecSignal(GSN_SCAN_HBREP, &Dbtc::execSCAN_HBREP);
232  addRecSignal(GSN_COMPLETED, &Dbtc::execCOMPLETED);
233  addRecSignal(GSN_COMMITTED, &Dbtc::execCOMMITTED);
234  addRecSignal(GSN_DIH_SCAN_GET_NODES_CONF, &Dbtc::execDIH_SCAN_GET_NODES_CONF);
235  addRecSignal(GSN_DIH_SCAN_GET_NODES_REF, &Dbtc::execDIH_SCAN_GET_NODES_REF);
236  addRecSignal(GSN_DIVERIFYCONF, &Dbtc::execDIVERIFYCONF);
237  addRecSignal(GSN_DIH_SCAN_TAB_CONF, &Dbtc::execDIH_SCAN_TAB_CONF);
238  addRecSignal(GSN_DIH_SCAN_TAB_REF, &Dbtc::execDIH_SCAN_TAB_REF);
239  addRecSignal(GSN_GCP_NOMORETRANS, &Dbtc::execGCP_NOMORETRANS);
240  addRecSignal(GSN_LQHKEYCONF, &Dbtc::execLQHKEYCONF);
241  addRecSignal(GSN_NDB_STTOR, &Dbtc::execNDB_STTOR);
242  addRecSignal(GSN_READ_NODESCONF, &Dbtc::execREAD_NODESCONF);
243  addRecSignal(GSN_READ_NODESREF, &Dbtc::execREAD_NODESREF);
244  addRecSignal(GSN_STTOR, &Dbtc::execSTTOR);
245  addRecSignal(GSN_TC_COMMITREQ, &Dbtc::execTC_COMMITREQ);
246  addRecSignal(GSN_TC_CLOPSIZEREQ, &Dbtc::execTC_CLOPSIZEREQ);
247  addRecSignal(GSN_TCGETOPSIZEREQ, &Dbtc::execTCGETOPSIZEREQ);
248  addRecSignal(GSN_TCKEYREQ, &Dbtc::execTCKEYREQ);
249  addRecSignal(GSN_TCRELEASEREQ, &Dbtc::execTCRELEASEREQ);
250  addRecSignal(GSN_TCSEIZEREQ, &Dbtc::execTCSEIZEREQ);
251  addRecSignal(GSN_TCROLLBACKREQ, &Dbtc::execTCROLLBACKREQ);
252  addRecSignal(GSN_TC_HBREP, &Dbtc::execTC_HBREP);
253  addRecSignal(GSN_TC_SCHVERREQ, &Dbtc::execTC_SCHVERREQ);
254  addRecSignal(GSN_TAB_COMMITREQ, &Dbtc::execTAB_COMMITREQ);
255  addRecSignal(GSN_SCAN_TABREQ, &Dbtc::execSCAN_TABREQ);
256  addRecSignal(GSN_SCAN_FRAGCONF, &Dbtc::execSCAN_FRAGCONF);
257  addRecSignal(GSN_SCAN_FRAGREF, &Dbtc::execSCAN_FRAGREF);
258  addRecSignal(GSN_READ_CONFIG_REQ, &Dbtc::execREAD_CONFIG_REQ, true);
259  addRecSignal(GSN_LQH_TRANSCONF, &Dbtc::execLQH_TRANSCONF);
260  addRecSignal(GSN_COMPLETECONF, &Dbtc::execCOMPLETECONF);
261  addRecSignal(GSN_COMMITCONF, &Dbtc::execCOMMITCONF);
262  addRecSignal(GSN_ABORTCONF, &Dbtc::execABORTCONF);
263  addRecSignal(GSN_NODE_FAILREP, &Dbtc::execNODE_FAILREP);
264  addRecSignal(GSN_INCL_NODEREQ, &Dbtc::execINCL_NODEREQ);
265  addRecSignal(GSN_TIME_SIGNAL, &Dbtc::execTIME_SIGNAL);
266  addRecSignal(GSN_API_FAILREQ, &Dbtc::execAPI_FAILREQ);
267 
268  addRecSignal(GSN_TC_COMMIT_ACK, &Dbtc::execTC_COMMIT_ACK);
269  addRecSignal(GSN_ABORT_ALL_REQ, &Dbtc::execABORT_ALL_REQ);
270 
271  addRecSignal(GSN_CREATE_TRIG_IMPL_REQ, &Dbtc::execCREATE_TRIG_IMPL_REQ);
272  addRecSignal(GSN_DROP_TRIG_IMPL_REQ, &Dbtc::execDROP_TRIG_IMPL_REQ);
273  addRecSignal(GSN_FIRE_TRIG_ORD, &Dbtc::execFIRE_TRIG_ORD);
274  addRecSignal(GSN_TRIG_ATTRINFO, &Dbtc::execTRIG_ATTRINFO);
275 
276  addRecSignal(GSN_CREATE_INDX_IMPL_REQ, &Dbtc::execCREATE_INDX_IMPL_REQ);
277  addRecSignal(GSN_DROP_INDX_IMPL_REQ, &Dbtc::execDROP_INDX_IMPL_REQ);
278  addRecSignal(GSN_TCINDXREQ, &Dbtc::execTCINDXREQ);
279  addRecSignal(GSN_INDXKEYINFO, &Dbtc::execINDXKEYINFO);
280  addRecSignal(GSN_INDXATTRINFO, &Dbtc::execINDXATTRINFO);
281  addRecSignal(GSN_ALTER_INDX_IMPL_REQ, &Dbtc::execALTER_INDX_IMPL_REQ);
282 
283  addRecSignal(GSN_TRANSID_AI_R, &Dbtc::execTRANSID_AI_R);
284  addRecSignal(GSN_KEYINFO20_R, &Dbtc::execKEYINFO20_R);
285  addRecSignal(GSN_SIGNAL_DROPPED_REP, &Dbtc::execSIGNAL_DROPPED_REP, true);
286 
287  // Index table lookup
288  addRecSignal(GSN_TCKEYCONF, &Dbtc::execTCKEYCONF);
289  addRecSignal(GSN_TCKEYREF, &Dbtc::execTCKEYREF);
290  addRecSignal(GSN_TRANSID_AI, &Dbtc::execTRANSID_AI);
291  addRecSignal(GSN_TCROLLBACKREP, &Dbtc::execTCROLLBACKREP);
292 
293  //addRecSignal(GSN_CREATE_TAB_REQ, &Dbtc::execCREATE_TAB_REQ);
294  addRecSignal(GSN_DROP_TAB_REQ, &Dbtc::execDROP_TAB_REQ);
295  addRecSignal(GSN_PREP_DROP_TAB_REQ, &Dbtc::execPREP_DROP_TAB_REQ);
296 
297  addRecSignal(GSN_ALTER_TAB_REQ, &Dbtc::execALTER_TAB_REQ);
298  addRecSignal(GSN_ROUTE_ORD, &Dbtc::execROUTE_ORD);
299  addRecSignal(GSN_TCKEY_FAILREFCONF_R, &Dbtc::execTCKEY_FAILREFCONF_R);
300 
301  addRecSignal(GSN_FIRE_TRIG_REF, &Dbtc::execFIRE_TRIG_REF);
302  addRecSignal(GSN_FIRE_TRIG_CONF, &Dbtc::execFIRE_TRIG_CONF);
303 
304  cacheRecord = 0;
305  apiConnectRecord = 0;
306  tcConnectRecord = 0;
307  hostRecord = 0;
308  tableRecord = 0;
309  scanRecord = 0;
310  gcpRecord = 0;
311  tcFailRecord = 0;
312  c_apiConTimer = 0;
313  c_apiConTimer_line = 0;
314  cpackedListIndex = 0;
315  c_ongoing_take_over_cnt = 0;
316 
317 #ifdef VM_TRACE
318  {
319  void* tmp[] = { &apiConnectptr,
320  &tcConnectptr,
321  &cachePtr,
322  &hostptr,
323  &timeOutptr,
324  &scanFragptr,
325  &tcNodeFailptr };
326  init_globals_list(tmp, sizeof(tmp)/sizeof(tmp[0]));
327  }
328 #endif
329  cacheRecord = 0;
330  apiConnectRecord = 0;
331  tcConnectRecord = 0;
332  hostRecord = 0;
333  tableRecord = 0;
334  scanRecord = 0;
335  gcpRecord = 0;
336  tcFailRecord = 0;
337  c_apiConTimer = 0;
338  c_apiConTimer_line = 0;
339  csystemStart = SSS_FALSE;
340  m_deferred_enabled = ~Uint32(0);
341  m_max_writes_per_trans = ~Uint32(0);
342 }//Dbtc::Dbtc()
343 
344 Dbtc::~Dbtc()
345 {
346  // Records with dynamic sizes
347  deallocRecord((void **)&cacheRecord, "CacheRecord",
348  sizeof(CacheRecord),
349  ccacheFilesize);
350 
351  deallocRecord((void **)&apiConnectRecord, "ApiConnectRecord",
352  sizeof(ApiConnectRecord),
353  capiConnectFilesize);
354 
355  deallocRecord((void **)&tcConnectRecord, "TcConnectRecord",
356  sizeof(TcConnectRecord),
357  ctcConnectFilesize);
358 
359  deallocRecord((void **)&hostRecord, "HostRecord",
360  sizeof(HostRecord),
361  chostFilesize);
362 
363  deallocRecord((void **)&tableRecord, "TableRecord",
364  sizeof(TableRecord),
365  ctabrecFilesize);
366 
367  deallocRecord((void **)&scanRecord, "ScanRecord",
368  sizeof(ScanRecord),
369  cscanrecFileSize);
370 
371  deallocRecord((void **)&gcpRecord, "GcpRecord",
372  sizeof(GcpRecord),
373  cgcpFilesize);
374 
375  deallocRecord((void **)&tcFailRecord, "TcFailRecord",
376  sizeof(TcFailRecord), 1);
377 
378  deallocRecord((void **)&c_apiConTimer, "ApiConTimer",
379  sizeof(UintR),
380  capiConnectFilesize);
381 
382  deallocRecord((void **)&c_apiConTimer_line, "ApiConTimer",
383  sizeof(UintR),
384  capiConnectFilesize);
385 }//Dbtc::~Dbtc()
386 
387 BLOCK_FUNCTIONS(Dbtc)
388