diff options
author | tomas@whalegate.ndb.mysql.com <> | 2007-05-22 23:21:32 +0200 |
---|---|---|
committer | tomas@whalegate.ndb.mysql.com <> | 2007-05-22 23:21:32 +0200 |
commit | a4934466c07d7867bf0895dc970f3d3504b0be53 (patch) | |
tree | eeb4148c241776cda3087857c25c71d2df0e43f7 | |
parent | 6ddf4785bbbcbb84930d4f461e1d249e1833bece (diff) | |
parent | 2c715f1ad4497175565c001073993ed4d2a120dd (diff) | |
download | mariadb-git-a4934466c07d7867bf0895dc970f3d3504b0be53.tar.gz |
Merge whalegate.ndb.mysql.com:/home/tomas/mysql-5.1
into whalegate.ndb.mysql.com:/home/tomas/mysql-5.1-single-user
38 files changed, 1223 insertions, 527 deletions
diff --git a/BUILD/Makefile.am b/BUILD/Makefile.am index 46814a077de..82e31c4a47b 100644 --- a/BUILD/Makefile.am +++ b/BUILD/Makefile.am @@ -28,6 +28,7 @@ EXTRA_DIST = FINISH.sh \ compile-alpha-debug \ compile-amd64-debug-max \ compile-amd64-max \ + compile-amd64-max-sci \ compile-darwin-mwcc \ compile-dist \ compile-hpux11-parisc2-aCC \ @@ -52,6 +53,7 @@ EXTRA_DIST = FINISH.sh \ compile-pentium-valgrind-max \ compile-pentium64-debug \ compile-pentium64-debug-max \ + compile-pentium64-max-sci \ compile-pentium64-valgrind-max \ compile-ppc \ compile-ppc-debug \ diff --git a/BUILD/compile-amd64-max-sci b/BUILD/compile-amd64-max-sci new file mode 100644 index 00000000000..4afa9004742 --- /dev/null +++ b/BUILD/compile-amd64-max-sci @@ -0,0 +1,8 @@ +#! /bin/sh + +path=`dirname $0` +. "$path/SETUP.sh" +extra_flags="$amd64_cflags $fast_cflags -g" +extra_configs="$amd64_configs $max_configs --with-ndb-sci=/opt/DIS" + +. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium64-max-sci b/BUILD/compile-pentium64-max-sci new file mode 100644 index 00000000000..9ebb1988475 --- /dev/null +++ b/BUILD/compile-pentium64-max-sci @@ -0,0 +1,9 @@ +#! /bin/sh + +path=`dirname $0` +. "$path/SETUP.sh" + +extra_flags="$pentium64_cflags $fast_cflags -g" +extra_configs="$pentium_configs $max_configs --with-ndb-sci=/opt/DIS" + +. "$path/FINISH.sh" diff --git a/config/ac-macros/ha_ndbcluster.m4 b/config/ac-macros/ha_ndbcluster.m4 index 04244b9ec13..c6327c46f15 100644 --- a/config/ac-macros/ha_ndbcluster.m4 +++ b/config/ac-macros/ha_ndbcluster.m4 @@ -43,7 +43,7 @@ AC_DEFUN([MYSQL_CHECK_NDB_OPTIONS], [ if test -f "$mysql_sci_dir/lib/libsisci.a" -a \ -f "$mysql_sci_dir/include/sisci_api.h"; then NDB_SCI_INCLUDES="-I$mysql_sci_dir/include" - NDB_SCI_LIBS="-L$mysql_sci_dir/lib -lsisci" + NDB_SCI_LIBS="$mysql_sci_dir/lib/libsisci.a" AC_MSG_RESULT([-- including sci transporter]) AC_DEFINE([NDB_SCI_TRANSPORTER], [1], [Including Ndb Cluster DB sci transporter]) diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am index cf5971affe4..024b85eed8e 100644 --- a/libmysqld/Makefile.am +++ b/libmysqld/Makefile.am @@ -95,6 +95,7 @@ INC_LIB= $(top_builddir)/regex/libregex.a \ $(top_builddir)/strings/libmystrings.a \ $(top_builddir)/dbug/libdbug.a \ $(top_builddir)/vio/libvio.a \ + @NDB_SCI_LIBS@ \ @mysql_plugin_libs@ \ $(yassl_inc_libs) diff --git a/libmysqld/examples/Makefile.am b/libmysqld/examples/Makefile.am index 3e4769c564d..ec5bbbb86e5 100644 --- a/libmysqld/examples/Makefile.am +++ b/libmysqld/examples/Makefile.am @@ -36,7 +36,8 @@ INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir) \ -I$(top_srcdir) -I$(top_srcdir)/client -I$(top_srcdir)/regex \ $(openssl_includes) LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@ $(yassl_libs) -LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @LIBDL@ $(CXXLDFLAGS) +LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @LIBDL@ $(CXXLDFLAGS) \ + @NDB_SCI_LIBS@ mysqltest_embedded_LINK = $(CXXLINK) mysqltest_embedded_SOURCES = mysqltest.c diff --git a/mysql-test/include/have_log_bin.inc b/mysql-test/include/have_log_bin.inc new file mode 100644 index 00000000000..11530dc953e --- /dev/null +++ b/mysql-test/include/have_log_bin.inc @@ -0,0 +1,4 @@ +-- require r/have_log_bin.require +disable_query_log; +show variables like "log_bin"; +enable_query_log; diff --git a/mysql-test/r/have_log_bin.require b/mysql-test/r/have_log_bin.require new file mode 100644 index 00000000000..cacdf8df0ce --- /dev/null +++ b/mysql-test/r/have_log_bin.require @@ -0,0 +1,2 @@ +Variable_name Value +have_log_bin ON diff --git a/mysql-test/t/ndb_binlog_basic2.test b/mysql-test/t/ndb_binlog_basic2.test index 9fa9f2f965a..bcc6b503320 100644 --- a/mysql-test/t/ndb_binlog_basic2.test +++ b/mysql-test/t/ndb_binlog_basic2.test @@ -1,4 +1,5 @@ -- source include/have_ndb.inc +-- source include/have_log_bin.inc --error ER_NDB_CANT_SWITCH_BINLOG_FORMAT set session binlog_format=row; diff --git a/sql/Makefile.am b/sql/Makefile.am index 465e5c843f4..d280b22f493 100644 --- a/sql/Makefile.am +++ b/sql/Makefile.am @@ -33,7 +33,7 @@ SUPPORTING_LIBS = $(top_builddir)/vio/libvio.a \ $(top_builddir)/regex/libregex.a \ $(top_builddir)/strings/libmystrings.a mysqld_DEPENDENCIES= @mysql_plugin_libs@ $(SUPPORTING_LIBS) -LDADD = $(SUPPORTING_LIBS) @ZLIB_LIBS@ +LDADD = $(SUPPORTING_LIBS) @ZLIB_LIBS@ @NDB_SCI_LIBS@ mysqld_LDADD = @MYSQLD_EXTRA_LDFLAGS@ \ @pstack_libs@ \ @mysql_plugin_libs@ \ diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 7f89809be66..afb2589f6b9 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -2731,18 +2731,25 @@ int ha_ndbcluster::write_row(byte *record) { // Table has hidden primary key Ndb *ndb= get_ndb(); - int ret; Uint64 auto_value; uint retries= NDB_AUTO_INCREMENT_RETRIES; - do { + int retry_sleep= 30; /* 30 milliseconds, transaction */ + for (;;) + { Ndb_tuple_id_range_guard g(m_share); - ret= ndb->getAutoIncrementValue(m_table, g.range, auto_value, 1); - } while (ret == -1 && - --retries && - ndb->getNdbError().status == NdbError::TemporaryError); - if (ret == -1) - ERR_RETURN(ndb->getNdbError()); - if (set_hidden_key(op, table_share->fields, (const byte*)&auto_value)) + if (ndb->getAutoIncrementValue(m_table, g.range, auto_value, 1) == -1) + { + if (--retries && + ndb->getNdbError().status == NdbError::TemporaryError); + { + my_sleep(retry_sleep); + continue; + } + ERR_RETURN(ndb->getNdbError()); + } + break; + } + if (set_hidden_key(op, table->s->fields, (const byte*)&auto_value)) ERR_RETURN(op->getNdbError()); } else @@ -6064,24 +6071,28 @@ void ha_ndbcluster::get_auto_increment(ulonglong offset, ulonglong increment, m_rows_to_insert - m_rows_inserted : ((m_rows_to_insert > m_autoincrement_prefetch) ? m_rows_to_insert : m_autoincrement_prefetch)); - int ret; uint retries= NDB_AUTO_INCREMENT_RETRIES; - do { + int retry_sleep= 30; /* 30 milliseconds, transaction */ + for (;;) + { Ndb_tuple_id_range_guard g(m_share); - ret= - m_skip_auto_increment ? - ndb->readAutoIncrementValue(m_table, g.range, auto_value) : - ndb->getAutoIncrementValue(m_table, g.range, auto_value, cache_size); - } while (ret == -1 && - --retries && - ndb->getNdbError().status == NdbError::TemporaryError); - if (ret == -1) - { - const NdbError err= ndb->getNdbError(); - sql_print_error("Error %lu in ::get_auto_increment(): %s", - (ulong) err.code, err.message); - *first_value= ~(ulonglong) 0; - DBUG_VOID_RETURN; + if (m_skip_auto_increment && + ndb->readAutoIncrementValue(m_table, g.range, auto_value) || + ndb->getAutoIncrementValue(m_table, g.range, auto_value, cache_size)) + { + if (--retries && + ndb->getNdbError().status == NdbError::TemporaryError); + { + my_sleep(retry_sleep); + continue; + } + const NdbError err= ndb->getNdbError(); + sql_print_error("Error %lu in ::get_auto_increment(): %s", + (ulong) err.code, err.message); + *first_value= ~(ulonglong) 0; + DBUG_VOID_RETURN; + } + break; } *first_value= (longlong)auto_value; /* From the point of view of MySQL, NDB reserves one row at a time */ @@ -6263,23 +6274,23 @@ int ha_ndbcluster::open(const char *name, int mode, uint test_if_locked) set_dbname(name); set_tabname(name); - if (check_ndb_connection()) + if ((res= check_ndb_connection()) || + (res= get_metadata(name))) { /* ndb_share reference handler free */ DBUG_PRINT("NDB_SHARE", ("%s handler free use_count: %u", m_share->key, m_share->use_count)); free_share(&m_share); m_share= 0; - DBUG_RETURN(HA_ERR_NO_CONNECTION); + DBUG_RETURN(res); } - - res= get_metadata(name); - if (!res) + while (1) { Ndb *ndb= get_ndb(); if (ndb->setDatabaseName(m_dbname)) { - ERR_RETURN(ndb->getNdbError()); + res= ndb_to_mysql_error(&ndb->getNdbError()); + break; } struct Ndb_statistics stat; res= ndb_get_table_statistics(NULL, FALSE, ndb, m_table, &stat); @@ -6288,14 +6299,20 @@ int ha_ndbcluster::open(const char *name, int mode, uint test_if_locked) stats.records= stat.row_count; if(!res) res= info(HA_STATUS_CONST); + break; + } + if (res) + { + free_share(&m_share); + m_share= 0; + release_metadata(current_thd, get_ndb()); + DBUG_RETURN(res); } - #ifdef HAVE_NDB_BINLOG if (!ndb_binlog_tables_inited && ndb_binlog_running) table->db_stat|= HA_READ_ONLY; #endif - - DBUG_RETURN(res); + DBUG_RETURN(0); } /* diff --git a/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp b/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp index 8d438f79259..8126267f946 100644 --- a/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp +++ b/storage/ndb/include/kernel/signaldata/FsOpenReq.hpp @@ -44,6 +44,8 @@ class FsOpenReq { friend class Restore; friend class Dblqh; + friend class Dbtup; + /** * For printing */ diff --git a/storage/ndb/include/mgmapi/ndbd_exit_codes.h b/storage/ndb/include/mgmapi/ndbd_exit_codes.h index 71802fd8fcc..30578bdf722 100644 --- a/storage/ndb/include/mgmapi/ndbd_exit_codes.h +++ b/storage/ndb/include/mgmapi/ndbd_exit_codes.h @@ -78,8 +78,9 @@ typedef ndbd_exit_classification_enum ndbd_exit_classification; #define NDBD_EXIT_SR_RESTARTCONFLICT 2311 #define NDBD_EXIT_NO_MORE_UNDOLOG 2312 #define NDBD_EXIT_SR_UNDOLOG 2313 -#define NDBD_EXIT_SR_SCHEMAFILE 2310 #define NDBD_EXIT_SINGLE_USER_MODE 2314 +#define NDBD_EXIT_NODE_DECLARED_DEAD 2315 +#define NDBD_EXIT_SR_SCHEMAFILE 2316 #define NDBD_EXIT_MEMALLOC 2327 #define NDBD_EXIT_BLOCK_JBUFCONGESTION 2334 #define NDBD_EXIT_TIME_QUEUE_SHORT 2335 diff --git a/storage/ndb/src/common/debugger/signaldata/SignalNames.cpp b/storage/ndb/src/common/debugger/signaldata/SignalNames.cpp index 884a49b3a94..0d31cd5de7f 100644 --- a/storage/ndb/src/common/debugger/signaldata/SignalNames.cpp +++ b/storage/ndb/src/common/debugger/signaldata/SignalNames.cpp @@ -621,6 +621,14 @@ const GsnName SignalNames [] = { ,{ GSN_LCP_PREPARE_REF, "LCP_PREPARE_REF" } ,{ GSN_LCP_PREPARE_CONF, "LCP_PREPARE_CONF" } + ,{ GSN_DICT_ABORT_REQ, "DICT_ABORT_REQ" } + ,{ GSN_DICT_ABORT_REF, "DICT_ABORT_REF" } + ,{ GSN_DICT_ABORT_CONF, "DICT_ABORT_CONF" } + + ,{ GSN_DICT_COMMIT_REQ, "DICT_COMMIT_REQ" } + ,{ GSN_DICT_COMMIT_REF, "DICT_COMMIT_REF" } + ,{ GSN_DICT_COMMIT_CONF, "DICT_COMMIT_CONF" } + /* DICT LOCK */ ,{ GSN_DICT_LOCK_REQ, "DICT_LOCK_REQ" } ,{ GSN_DICT_LOCK_CONF, "DICT_LOCK_CONF" } diff --git a/storage/ndb/src/common/transporter/Packer.cpp b/storage/ndb/src/common/transporter/Packer.cpp index 1045c8ac283..df7ff078e63 100644 --- a/storage/ndb/src/common/transporter/Packer.cpp +++ b/storage/ndb/src/common/transporter/Packer.cpp @@ -20,7 +20,12 @@ #include <TransporterCallback.hpp> #include <RefConvert.hpp> +#ifdef ERROR_INSERT +Uint32 MAX_RECEIVED_SIGNALS = 1024; +#else #define MAX_RECEIVED_SIGNALS 1024 +#endif + Uint32 TransporterRegistry::unpack(Uint32 * readPtr, Uint32 sizeOfData, diff --git a/storage/ndb/src/common/transporter/SCI_Transporter.cpp b/storage/ndb/src/common/transporter/SCI_Transporter.cpp index 138b79acb51..0720fe84973 100644 --- a/storage/ndb/src/common/transporter/SCI_Transporter.cpp +++ b/storage/ndb/src/common/transporter/SCI_Transporter.cpp @@ -65,13 +65,10 @@ SCI_Transporter::SCI_Transporter(TransporterRegistry &t_reg, m_initLocal=false; - m_swapCounter=0; m_failCounter=0; m_remoteNodes[0]=remoteSciNodeId0; m_remoteNodes[1]=remoteSciNodeId1; m_adapters = nAdapters; - // The maximum number of times to try and create, - // start and destroy a sequence m_ActiveAdapterId=0; m_StandbyAdapterId=1; @@ -102,8 +99,6 @@ SCI_Transporter::SCI_Transporter(TransporterRegistry &t_reg, DBUG_VOID_RETURN; } - - void SCI_Transporter::disconnectImpl() { DBUG_ENTER("SCI_Transporter::disconnectImpl"); @@ -129,7 +124,8 @@ void SCI_Transporter::disconnectImpl() if(err != SCI_ERR_OK) { report_error(TE_SCI_UNABLE_TO_CLOSE_CHANNEL); - DBUG_PRINT("error", ("Cannot close channel to the driver. Error code 0x%x", + DBUG_PRINT("error", + ("Cannot close channel to the driver. Error code 0x%x", err)); } } @@ -164,19 +160,18 @@ bool SCI_Transporter::initTransporter() { m_sendBuffer.m_buffer = new Uint32[m_sendBuffer.m_sendBufferSize / 4]; m_sendBuffer.m_dataSize = 0; - DBUG_PRINT("info", ("Created SCI Send Buffer with buffer size %d and packet size %d", + DBUG_PRINT("info", + ("Created SCI Send Buffer with buffer size %d and packet size %d", m_sendBuffer.m_sendBufferSize, m_PacketSize * 4)); if(!getLinkStatus(m_ActiveAdapterId) || (m_adapters > 1 && !getLinkStatus(m_StandbyAdapterId))) { - DBUG_PRINT("error", ("The link is not fully operational. Check the cables and the switches")); - //reportDisconnect(remoteNodeId, 0); - //doDisconnect(); + DBUG_PRINT("error", + ("The link is not fully operational. Check the cables and the switches")); //NDB should terminate report_error(TE_SCI_LINK_ERROR); DBUG_RETURN(false); } - DBUG_RETURN(true); } // initTransporter() @@ -235,7 +230,8 @@ sci_error_t SCI_Transporter::initLocalSegment() { DBUG_PRINT("info", ("SCInode iD %d adapter %d\n", sciAdapters[i].localSciNodeId, i)); if(err != SCI_ERR_OK) { - DBUG_PRINT("error", ("Cannot open an SCI virtual device. Error code 0x%x", + DBUG_PRINT("error", + ("Cannot open an SCI virtual device. Error code 0x%x", err)); DBUG_RETURN(err); } @@ -269,7 +265,8 @@ sci_error_t SCI_Transporter::initLocalSegment() { &err); if(err != SCI_ERR_OK) { - DBUG_PRINT("error", ("Local Segment is not accessible by an SCI adapter. Error code 0x%x\n", + DBUG_PRINT("error", + ("Local Segment is not accessible by an SCI adapter. Error code 0x%x\n", err)); DBUG_RETURN(err); } @@ -303,15 +300,13 @@ sci_error_t SCI_Transporter::initLocalSegment() { &err); if(err != SCI_ERR_OK) { - DBUG_PRINT("error", ("Local Segment is not available for remote connections. Error code 0x%x\n", + DBUG_PRINT("error", + ("Local Segment is not available for remote connections. Error code 0x%x\n", err)); DBUG_RETURN(err); } } - - setupLocalSegment(); - DBUG_RETURN(err); } // initLocalSegment() @@ -343,12 +338,6 @@ bool SCI_Transporter::doSend() { if(sizeToSend==4097) i4097++; #endif - if(startSequence(m_ActiveAdapterId)!=SCI_ERR_OK) { - DBUG_PRINT("error", ("Start sequence failed")); - report_error(TE_SCI_UNABLE_TO_START_SEQUENCE); - return false; - } - tryagain: retry++; @@ -374,119 +363,36 @@ bool SCI_Transporter::doSend() { SCI_FLAG_ERROR_CHECK, &err); - if (err != SCI_ERR_OK) { - if(err == SCI_ERR_OUT_OF_RANGE) { - DBUG_PRINT("error", ("Data transfer : out of range error")); - goto tryagain; - } - if(err == SCI_ERR_SIZE_ALIGNMENT) { - DBUG_PRINT("error", ("Data transfer : alignment error")); - DBUG_PRINT("info", ("sendPtr 0x%x, sizeToSend = %d", sendPtr, sizeToSend)); - goto tryagain; - } - if(err == SCI_ERR_OFFSET_ALIGNMENT) { - DBUG_PRINT("error", ("Data transfer : offset alignment")); - goto tryagain; - } - if(err == SCI_ERR_TRANSFER_FAILED) { - //(m_TargetSegm[m_StandbyAdapterId].writer)->heavyLock(); - if(getLinkStatus(m_ActiveAdapterId)) { - goto tryagain; - } - if (m_adapters == 1) { - DBUG_PRINT("error", ("SCI Transfer failed")); + if (err == SCI_ERR_OUT_OF_RANGE || + err == SCI_ERR_SIZE_ALIGNMENT || + err == SCI_ERR_OFFSET_ALIGNMENT) { + DBUG_PRINT("error", ("Data transfer error = %d", err)); report_error(TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR); return false; - } - m_failCounter++; - Uint32 temp=m_ActiveAdapterId; - switch(m_swapCounter) { - case 0: - /**swap from active (0) to standby (1)*/ - if(getLinkStatus(m_StandbyAdapterId)) { - DBUG_PRINT("error", ("Swapping from adapter 0 to 1")); + } + if(err == SCI_ERR_TRANSFER_FAILED) { + if(getLinkStatus(m_ActiveAdapterId)) + goto tryagain; + if (m_adapters == 1) { + DBUG_PRINT("error", ("SCI Transfer failed")); + report_error(TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR); + return false; + } + m_failCounter++; + Uint32 temp=m_ActiveAdapterId; + if (getLinkStatus(m_StandbyAdapterId)) { failoverShmWriter(); SCIStoreBarrier(m_TargetSegm[m_StandbyAdapterId].sequence,0); m_ActiveAdapterId=m_StandbyAdapterId; m_StandbyAdapterId=temp; - SCIRemoveSequence((m_TargetSegm[m_StandbyAdapterId].sequence), - FLAGS, - &err); - if(err!=SCI_ERR_OK) { - report_error(TE_SCI_UNABLE_TO_REMOVE_SEQUENCE); - DBUG_PRINT("error", ("Unable to remove sequence")); - return false; - } - if(startSequence(m_ActiveAdapterId)!=SCI_ERR_OK) { - DBUG_PRINT("error", ("Start sequence failed")); - report_error(TE_SCI_UNABLE_TO_START_SEQUENCE); - return false; - } - m_swapCounter++; - DBUG_PRINT("info", ("failover complete")); - goto tryagain; - } else { - report_error(TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR); - DBUG_PRINT("error", ("SCI Transfer failed")); - return false; - } - return false; - break; - case 1: - /** swap back from 1 to 0 - must check that the link is up */ - - if(getLinkStatus(m_StandbyAdapterId)) { - failoverShmWriter(); - m_ActiveAdapterId=m_StandbyAdapterId; - m_StandbyAdapterId=temp; - DBUG_PRINT("info", ("Swapping from 1 to 0")); - if(createSequence(m_ActiveAdapterId)!=SCI_ERR_OK) { - DBUG_PRINT("error", ("Unable to create sequence")); - report_error(TE_SCI_UNABLE_TO_CREATE_SEQUENCE); - return false; - } - if(startSequence(m_ActiveAdapterId)!=SCI_ERR_OK) { - DBUG_PRINT("error", ("startSequence failed... disconnecting")); - report_error(TE_SCI_UNABLE_TO_START_SEQUENCE); - return false; - } - - SCIRemoveSequence((m_TargetSegm[m_StandbyAdapterId].sequence) - , FLAGS, - &err); - if(err!=SCI_ERR_OK) { - DBUG_PRINT("error", ("Unable to remove sequence")); - report_error(TE_SCI_UNABLE_TO_REMOVE_SEQUENCE); - return false; - } - - if(createSequence(m_StandbyAdapterId)!=SCI_ERR_OK) { - DBUG_PRINT("error", ("Unable to create sequence on standby")); - report_error(TE_SCI_UNABLE_TO_CREATE_SEQUENCE); - return false; - } - - m_swapCounter=0; - - DBUG_PRINT("info", ("failover complete..")); - goto tryagain; - + DBUG_PRINT("error", ("Swapping from adapter %u to %u", + m_StandbyAdapterId, m_ActiveAdapterId)); } else { - DBUG_PRINT("error", ("Unrecoverable data transfer error")); report_error(TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR); - return false; + DBUG_PRINT("error", ("SCI Transfer failed")); } - - break; - default: - DBUG_PRINT("error", ("Unrecoverable data transfer error")); - report_error(TE_SCI_UNRECOVERABLE_DATA_TFX_ERROR); - return false; - break; - } - } + } } else { SHM_Writer * writer = (m_TargetSegm[m_ActiveAdapterId].writer); writer->updateWritePtr(sizeToSend); @@ -497,7 +403,6 @@ bool SCI_Transporter::doSend() { m_sendBuffer.m_dataSize = 0; m_sendBuffer.m_forceSendLimit = sendLimit; } - } else { /** * If we end up here, the SCI segment is full. @@ -552,15 +457,12 @@ void SCI_Transporter::setupLocalSegment() DBUG_VOID_RETURN; } //setupLocalSegment - - void SCI_Transporter::setupRemoteSegment() { DBUG_ENTER("SCI_Transporter::setupRemoteSegment"); Uint32 sharedSize = 0; sharedSize =4096; //start of the buffer is page aligned - Uint32 sizeOfBuffer = m_BufferSize; const Uint32 slack = MAX_MESSAGE_SIZE; sizeOfBuffer -= sharedSize; @@ -666,7 +568,6 @@ SCI_Transporter::init_remote() DBUG_PRINT("error", ("Error connecting segment, err 0x%x", err)); DBUG_RETURN(false); } - } // Map the remote memory segment into program space for(Uint32 i=0; i < m_adapters ; i++) { @@ -679,13 +580,14 @@ SCI_Transporter::init_remote() FLAGS, &err); - - if(err!= SCI_ERR_OK) { - DBUG_PRINT("error", ("Cannot map a segment to the remote node %d. Error code 0x%x",m_RemoteSciNodeId, err)); - //NDB SHOULD TERMINATE AND COMPUTER REBOOTED! - report_error(TE_SCI_CANNOT_MAP_REMOTESEGMENT); - DBUG_RETURN(false); - } + if(err!= SCI_ERR_OK) { + DBUG_PRINT("error", + ("Cannot map a segment to the remote node %d. Error code 0x%x", + m_RemoteSciNodeId, err)); + //NDB SHOULD TERMINATE AND COMPUTER REBOOTED! + report_error(TE_SCI_CANNOT_MAP_REMOTESEGMENT); + DBUG_RETURN(false); + } } m_mapped=true; setupRemoteSegment(); @@ -713,7 +615,6 @@ SCI_Transporter::connect_client_impl(NDB_SOCKET_TYPE sockfd) NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); } - if (!init_local()) { NDB_CLOSE_SOCKET(sockfd); DBUG_RETURN(false); @@ -788,29 +689,9 @@ sci_error_t SCI_Transporter::createSequence(Uint32 adapterid) { &(m_TargetSegm[adapterid].sequence), SCI_FLAG_FAST_BARRIER, &err); - - return err; } // createSequence() - -sci_error_t SCI_Transporter::startSequence(Uint32 adapterid) { - - sci_error_t err; - /** Perform preliminary error check on an SCI adapter before starting a - * sequence of read and write operations on the mapped segment. - */ - m_SequenceStatus = SCIStartSequence( - (m_TargetSegm[adapterid].sequence), - FLAGS, &err); - - - // If there still is an error then data cannot be safely send - return err; -} // startSequence() - - - bool SCI_Transporter::disconnectLocal() { DBUG_ENTER("SCI_Transporter::disconnectLocal"); @@ -878,9 +759,6 @@ SCI_Transporter::~SCI_Transporter() { DBUG_VOID_RETURN; } // ~SCI_Transporter() - - - void SCI_Transporter::closeSCI() { // Termination of SCI sci_error_t err; @@ -897,8 +775,9 @@ void SCI_Transporter::closeSCI() { SCIClose(activeSCIDescriptor, FLAGS, &err); if(err != SCI_ERR_OK) { - DBUG_PRINT("error", ("Cannot close SCI channel to the driver. Error code 0x%x", - err)); + DBUG_PRINT("error", + ("Cannot close SCI channel to the driver. Error code 0x%x", + err)); } SCITerminate(); DBUG_VOID_RETURN; @@ -973,7 +852,6 @@ SCI_Transporter::getConnectionStatus() { return false; } - void SCI_Transporter::setConnected() { *m_remoteStatusFlag = SCICONNECTED; @@ -983,7 +861,6 @@ SCI_Transporter::setConnected() { *m_localStatusFlag = SCICONNECTED; } - void SCI_Transporter::setDisconnect() { if(getLinkStatus(m_ActiveAdapterId)) @@ -994,7 +871,6 @@ SCI_Transporter::setDisconnect() { } } - bool SCI_Transporter::checkConnected() { if (*m_localStatusFlag == SCIDISCONNECT) { @@ -1015,8 +891,9 @@ SCI_Transporter::initSCI() { SCIInitialize(0, &error); if(error != SCI_ERR_OK) { DBUG_PRINT("error", ("Cannot initialize SISCI library.")); - DBUG_PRINT("error", ("Inconsistency between SISCI library and SISCI driver. Error code 0x%x", - error)); + DBUG_PRINT("error", + ("Inconsistency between SISCI library and SISCI driver. Error code 0x%x", + error)); DBUG_RETURN(false); } init = true; @@ -1029,3 +906,4 @@ SCI_Transporter::get_free_buffer() const { return (m_TargetSegm[m_ActiveAdapterId].writer)->get_free_buffer(); } + diff --git a/storage/ndb/src/common/transporter/SCI_Transporter.hpp b/storage/ndb/src/common/transporter/SCI_Transporter.hpp index fbba2ac4516..f774186f238 100644 --- a/storage/ndb/src/common/transporter/SCI_Transporter.hpp +++ b/storage/ndb/src/common/transporter/SCI_Transporter.hpp @@ -54,12 +54,12 @@ * local segment, the SCI transporter connects to a segment created by another * transporter at a remote node, and the maps the remote segment into its * virtual address space. However, since NDB Cluster relies on redundancy - * at the network level, by using dual SCI adapters communica - * + * at the network level, by using dual SCI adapters communication can be + * maintained even if one of the adapter cards fails (or anything on the + * network this adapter card exists in e.g. an SCI switch failure). * */ - /** * class SCITransporter * @brief - main class for the SCI transporter. @@ -84,16 +84,6 @@ public: sci_error_t createSequence(Uint32 adapterid); - /** - * starts a sequence for error checking. - * The actual checking that a sequence is correct is done implicitly - * in SCIMemCpy (in doSend). - * @param adapterid the adapter on which to start the sequence. - * @return SCI_ERR_OK if ok, otherwize something else. - */ - sci_error_t startSequence(Uint32 adapterid); - - /** Initiate Local Segment: create a memory segment, * prepare a memory segment, map the local segment * into memory space and make segment available. @@ -159,7 +149,6 @@ private: bool m_mapped; bool m_initLocal; bool m_sciinit; - Uint32 m_swapCounter; Uint32 m_failCounter; /** * For statistics on transfered packets @@ -195,7 +184,6 @@ private: */ Uint32 m_reportFreq; - Uint32 m_adapters; Uint32 m_numberOfRemoteNodes; diff --git a/storage/ndb/src/common/transporter/TCP_Transporter.hpp b/storage/ndb/src/common/transporter/TCP_Transporter.hpp index 211ace8f03d..ed1a154c944 100644 --- a/storage/ndb/src/common/transporter/TCP_Transporter.hpp +++ b/storage/ndb/src/common/transporter/TCP_Transporter.hpp @@ -102,6 +102,10 @@ private: virtual void updateReceiveDataPtr(Uint32 bytesRead); virtual Uint32 get_free_buffer() const; + + inline bool hasReceiveData () const { + return receiveBuffer.sizeOfData > 0; + } protected: /** * Setup client/server and perform connect/accept diff --git a/storage/ndb/src/common/transporter/TransporterRegistry.cpp b/storage/ndb/src/common/transporter/TransporterRegistry.cpp index f35217a9726..3e7589a54fe 100644 --- a/storage/ndb/src/common/transporter/TransporterRegistry.cpp +++ b/storage/ndb/src/common/transporter/TransporterRegistry.cpp @@ -739,16 +739,13 @@ TransporterRegistry::poll_SHM(Uint32 timeOutMillis) Uint32 TransporterRegistry::poll_TCP(Uint32 timeOutMillis) { + bool hasdata = false; if (false && nTCPTransporters == 0) { tcpReadSelectReply = 0; return 0; } - struct timeval timeout; - timeout.tv_sec = timeOutMillis / 1000; - timeout.tv_usec = (timeOutMillis % 1000) * 1000; - NDB_SOCKET_TYPE maxSocketValue = -1; // Needed for TCP/IP connections @@ -771,8 +768,15 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis) // Put the connected transporters in the socket read-set FD_SET(socket, &tcpReadset); } + hasdata |= t->hasReceiveData(); } + timeOutMillis = hasdata ? 0 : timeOutMillis; + + struct timeval timeout; + timeout.tv_sec = timeOutMillis / 1000; + timeout.tv_usec = (timeOutMillis % 1000) * 1000; + // The highest socket value plus one maxSocketValue++; @@ -787,7 +791,7 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis) } #endif - return tcpReadSelectReply; + return tcpReadSelectReply || hasdata; } #endif @@ -796,26 +800,26 @@ void TransporterRegistry::performReceive() { #ifdef NDB_TCP_TRANSPORTER - if(tcpReadSelectReply > 0) + for (int i=0; i<nTCPTransporters; i++) { - for (int i=0; i<nTCPTransporters; i++) - { - checkJobBuffer(); - TCP_Transporter *t = theTCPTransporters[i]; - const NodeId nodeId = t->getRemoteNodeId(); - const NDB_SOCKET_TYPE socket = t->getSocket(); - if(is_connected(nodeId)){ - if(t->isConnected() && FD_ISSET(socket, &tcpReadset)) + checkJobBuffer(); + TCP_Transporter *t = theTCPTransporters[i]; + const NodeId nodeId = t->getRemoteNodeId(); + const NDB_SOCKET_TYPE socket = t->getSocket(); + if(is_connected(nodeId)){ + if(t->isConnected()) + { + if (FD_ISSET(socket, &tcpReadset)) { - const int receiveSize = t->doReceive(); - if(receiveSize > 0) - { - Uint32 * ptr; - Uint32 sz = t->getReceiveData(&ptr); - transporter_recv_from(callbackObj, nodeId); - Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]); - t->updateReceiveDataPtr(szUsed); - } + t->doReceive(); + } + + if (t->hasReceiveData()) + { + Uint32 * ptr; + Uint32 sz = t->getReceiveData(&ptr); + Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]); + t->updateReceiveDataPtr(szUsed); } } } diff --git a/storage/ndb/src/kernel/blocks/backup/Backup.cpp b/storage/ndb/src/kernel/blocks/backup/Backup.cpp index fc698d161e0..d86c22024cd 100644 --- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp +++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp @@ -3553,10 +3553,10 @@ Backup::execBACKUP_FRAGMENT_REQ(Signal* signal) ScanFragReq::setHoldLockFlag(req->requestInfo, 0); ScanFragReq::setKeyinfoFlag(req->requestInfo, 0); ScanFragReq::setAttrLen(req->requestInfo,attrLen); + ScanFragReq::setTupScanFlag(req->requestInfo, 1); if (ptr.p->is_lcp()) { ScanFragReq::setScanPrio(req->requestInfo, 1); - ScanFragReq::setTupScanFlag(req->requestInfo, 1); ScanFragReq::setNoDiskFlag(req->requestInfo, 1); ScanFragReq::setLcpScanFlag(req->requestInfo, 1); } diff --git a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp index 3fe85de73e6..7a992587010 100644 --- a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +++ b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp @@ -133,6 +133,7 @@ Cmvmi::~Cmvmi() #ifdef ERROR_INSERT NodeBitmask c_error_9000_nodes_mask; +extern Uint32 MAX_RECEIVED_SIGNALS; #endif void Cmvmi::execNDB_TAMPER(Signal* signal) @@ -162,6 +163,22 @@ void Cmvmi::execNDB_TAMPER(Signal* signal) kill(getpid(), SIGABRT); } #endif + +#ifdef ERROR_INSERT + if (signal->theData[0] == 9003) + { + if (MAX_RECEIVED_SIGNALS < 1024) + { + MAX_RECEIVED_SIGNALS = 1024; + } + else + { + MAX_RECEIVED_SIGNALS = 1 + (rand() % 128); + } + ndbout_c("MAX_RECEIVED_SIGNALS: %d", MAX_RECEIVED_SIGNALS); + CLEAR_ERROR_INSERT_VALUE; + } +#endif }//execNDB_TAMPER() void Cmvmi::execSET_LOGLEVELORD(Signal* signal) diff --git a/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp b/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp index 4b2926d4981..6a1ad48f8b7 100644 --- a/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp +++ b/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp @@ -5200,9 +5200,9 @@ void Dbacc::execEXPANDCHECK2(Signal* signal) { jamEntry(); - if(refToBlock(signal->getSendersBlockRef()) == DBLQH){ + if(refToBlock(signal->getSendersBlockRef()) == DBLQH) + { jam(); - reenable_expand_after_redo_log_exection_complete(signal); return; } diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp index 66cd523f333..ac3acdc6778 100644 --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp @@ -86,6 +86,9 @@ #include <signaldata/CreateObj.hpp> #include <SLList.hpp> +#include <EventLogger.hpp> +extern EventLogger g_eventLogger; + #define ZNOT_FOUND 626 #define ZALREADYEXIST 630 @@ -188,7 +191,7 @@ struct { 0, 0, 0, 0, &Dbdict::drop_undofile_prepare_start, 0, 0, - 0, 0, + 0, &Dbdict::drop_undofile_commit_complete, 0, 0, 0 } }; @@ -1371,18 +1374,36 @@ void Dbdict::readSchemaConf(Signal* signal, for (Uint32 n = 0; n < xsf->noOfPages; n++) { SchemaFile * sf = &xsf->schemaPage[n]; - bool ok = - memcmp(sf->Magic, NDB_SF_MAGIC, sizeof(sf->Magic)) == 0 && - sf->FileSize != 0 && - sf->FileSize % NDB_SF_PAGE_SIZE == 0 && - sf->FileSize == sf0->FileSize && - sf->PageNumber == n && - computeChecksum((Uint32*)sf, NDB_SF_PAGE_SIZE_IN_WORDS) == 0; - ndbrequireErr(ok || !crashInd, NDBD_EXIT_SR_SCHEMAFILE); - if (! ok) { - jam(); + bool ok = false; + const char *reason; + if (memcmp(sf->Magic, NDB_SF_MAGIC, sizeof(sf->Magic)) != 0) + { jam(); reason = "magic code"; } + else if (sf->FileSize == 0) + { jam(); reason = "file size == 0"; } + else if (sf->FileSize % NDB_SF_PAGE_SIZE != 0) + { jam(); reason = "invalid size multiple"; } + else if (sf->FileSize != sf0->FileSize) + { jam(); reason = "invalid size"; } + else if (sf->PageNumber != n) + { jam(); reason = "invalid page number"; } + else if (computeChecksum((Uint32*)sf, NDB_SF_PAGE_SIZE_IN_WORDS) != 0) + { jam(); reason = "invalid checksum"; } + else + ok = true; + + if (!ok) + { + char reason_msg[128]; + snprintf(reason_msg, sizeof(reason_msg), + "schema file corrupt, page %u (%s, " + "sz=%u sz0=%u pn=%u)", + n, reason, sf->FileSize, sf0->FileSize, sf->PageNumber); + if (crashInd) + progError(__LINE__, NDBD_EXIT_SR_SCHEMAFILE, reason_msg); ndbrequireErr(fsPtr.p->fsState == FsConnectRecord::READ_SCHEMA1, NDBD_EXIT_SR_SCHEMAFILE); + jam(); + infoEvent("primary %s, trying backup", reason_msg); readSchemaRef(signal, fsPtr); return; } @@ -3209,9 +3230,7 @@ Dbdict::restartDropTab(Signal* signal, Uint32 tableId, case DictTabInfo::LogfileGroup: case DictTabInfo::Datafile: case DictTabInfo::Undofile: - warningEvent("Dont drop object: %d", tableId); - c_restartRecord.activeTable++; - checkSchemaStatus(signal); + restartDropObj(signal, tableId, old_entry); return; } @@ -3254,6 +3273,9 @@ Dbdict::restartDropTab_complete(Signal* signal, checkSchemaStatus(signal); } +/** + * Create Obj during NR/SR + */ void Dbdict::restartCreateObj(Signal* signal, Uint32 tableId, @@ -3482,6 +3504,170 @@ Dbdict::restartCreateObj_commit_complete_done(Signal* signal, checkSchemaStatus(signal); } +/** + * Drop object during NR/SR + */ +void +Dbdict::restartDropObj(Signal* signal, + Uint32 tableId, + const SchemaFile::TableEntry * entry) +{ + jam(); + + DropObjRecordPtr dropObjPtr; + ndbrequire(c_opDropObj.seize(dropObjPtr)); + + const Uint32 key = ++c_opRecordSequence; + dropObjPtr.p->key = key; + c_opDropObj.add(dropObjPtr); + dropObjPtr.p->m_errorCode = 0; + dropObjPtr.p->m_senderRef = reference(); + dropObjPtr.p->m_senderData = tableId; + dropObjPtr.p->m_clientRef = reference(); + dropObjPtr.p->m_clientData = tableId; + + dropObjPtr.p->m_obj_id = tableId; + dropObjPtr.p->m_obj_type = entry->m_tableType; + dropObjPtr.p->m_obj_version = entry->m_tableVersion; + + dropObjPtr.p->m_callback.m_callbackData = key; + dropObjPtr.p->m_callback.m_callbackFunction= + safe_cast(&Dbdict::restartDropObj_prepare_start_done); + + ndbout_c("Dropping %d %d", tableId, entry->m_tableType); + switch(entry->m_tableType){ + case DictTabInfo::Tablespace: + case DictTabInfo::LogfileGroup:{ + jam(); + Ptr<Filegroup> fg_ptr; + ndbrequire(c_filegroup_hash.find(fg_ptr, tableId)); + dropObjPtr.p->m_obj_ptr_i = fg_ptr.i; + dropObjPtr.p->m_vt_index = 3; + break; + } + case DictTabInfo::Datafile:{ + jam(); + Ptr<File> file_ptr; + dropObjPtr.p->m_vt_index = 2; + ndbrequire(c_file_hash.find(file_ptr, tableId)); + dropObjPtr.p->m_obj_ptr_i = file_ptr.i; + break; + } + case DictTabInfo::Undofile:{ + jam(); + Ptr<File> file_ptr; + dropObjPtr.p->m_vt_index = 4; + ndbrequire(c_file_hash.find(file_ptr, tableId)); + dropObjPtr.p->m_obj_ptr_i = file_ptr.i; + + /** + * Undofiles are only removed from logfile groups file list + * as drop undofile is currently not supported... + * file will be dropped by lgman when dropping filegroup + */ + dropObjPtr.p->m_callback.m_callbackFunction= + safe_cast(&Dbdict::restartDropObj_commit_complete_done); + + if (f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete) + (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete) + (signal, dropObjPtr.p); + else + execute(signal, dropObjPtr.p->m_callback, 0); + return; + } + default: + jamLine(entry->m_tableType); + ndbrequire(false); + } + + if (f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_start) + (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_start) + (signal, dropObjPtr.p); + else + execute(signal, dropObjPtr.p->m_callback, 0); +} + +void +Dbdict::restartDropObj_prepare_start_done(Signal* signal, + Uint32 callbackData, + Uint32 returnCode) +{ + jam(); + ndbrequire(returnCode == 0); + DropObjRecordPtr dropObjPtr; + ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); + ndbrequire(dropObjPtr.p->m_errorCode == 0); + + dropObjPtr.p->m_callback.m_callbackFunction = + safe_cast(&Dbdict::restartDropObj_prepare_complete_done); + + if (f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete) + (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete) + (signal, dropObjPtr.p); + else + execute(signal, dropObjPtr.p->m_callback, 0); +} + +void +Dbdict::restartDropObj_prepare_complete_done(Signal* signal, + Uint32 callbackData, + Uint32 returnCode) +{ + jam(); + ndbrequire(returnCode == 0); + DropObjRecordPtr dropObjPtr; + ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); + ndbrequire(dropObjPtr.p->m_errorCode == 0); + + dropObjPtr.p->m_callback.m_callbackFunction = + safe_cast(&Dbdict::restartDropObj_commit_start_done); + + if (f_dict_op[dropObjPtr.p->m_vt_index].m_commit_start) + (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_commit_start) + (signal, dropObjPtr.p); + else + execute(signal, dropObjPtr.p->m_callback, 0); +} + +void +Dbdict::restartDropObj_commit_start_done(Signal* signal, + Uint32 callbackData, + Uint32 returnCode) +{ + jam(); + ndbrequire(returnCode == 0); + DropObjRecordPtr dropObjPtr; + ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); + ndbrequire(dropObjPtr.p->m_errorCode == 0); + + dropObjPtr.p->m_callback.m_callbackFunction = + safe_cast(&Dbdict::restartDropObj_commit_complete_done); + + if (f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete) + (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete) + (signal, dropObjPtr.p); + else + execute(signal, dropObjPtr.p->m_callback, 0); +} + + +void +Dbdict::restartDropObj_commit_complete_done(Signal* signal, + Uint32 callbackData, + Uint32 returnCode) +{ + jam(); + ndbrequire(returnCode == 0); + DropObjRecordPtr dropObjPtr; + ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); + ndbrequire(dropObjPtr.p->m_errorCode == 0); + + c_opDropObj.release(dropObjPtr); + + c_restartRecord.activeTable++; + checkSchemaStatus(signal); +} + /* **************************************************************** */ /* ---------------------------------------------------------------- */ /* MODULE: NODE FAILURE HANDLING ------------------------- */ @@ -13968,7 +14154,8 @@ Dbdict::getTableEntry(XSchemaFile * xsf, Uint32 tableId) //****************************************** void -Dbdict::execCREATE_FILE_REQ(Signal* signal){ +Dbdict::execCREATE_FILE_REQ(Signal* signal) +{ jamEntry(); if(!assembleFragments(signal)){ @@ -14013,13 +14200,14 @@ Dbdict::execCREATE_FILE_REQ(Signal* signal){ Ptr<SchemaTransaction> trans_ptr; if (! c_Trans.seize(trans_ptr)){ + jam(); ref->errorCode = CreateFileRef::Busy; ref->status = 0; ref->errorKey = 0; ref->errorLine = __LINE__; break; } - + jam(); const Uint32 trans_key = ++c_opRecordSequence; trans_ptr.p->key = trans_key; trans_ptr.p->m_senderRef = senderRef; @@ -14048,6 +14236,7 @@ Dbdict::execCREATE_FILE_REQ(Signal* signal){ { Uint32 objId = getFreeObjId(0); if (objId == RNIL) { + jam(); ref->errorCode = CreateFileRef::NoMoreObjectRecords; ref->status = 0; ref->errorKey = 0; @@ -14072,7 +14261,6 @@ Dbdict::execCREATE_FILE_REQ(Signal* signal){ CreateObjReq::SignalLength, JBB); c_blockState = BS_CREATE_TAB; - return; } while(0); @@ -14083,7 +14271,8 @@ Dbdict::execCREATE_FILE_REQ(Signal* signal){ } void -Dbdict::execCREATE_FILEGROUP_REQ(Signal* signal){ +Dbdict::execCREATE_FILEGROUP_REQ(Signal* signal) +{ jamEntry(); if(!assembleFragments(signal)){ @@ -14127,13 +14316,14 @@ Dbdict::execCREATE_FILEGROUP_REQ(Signal* signal){ Ptr<SchemaTransaction> trans_ptr; if (! c_Trans.seize(trans_ptr)){ + jam(); ref->errorCode = CreateFilegroupRef::Busy; ref->status = 0; ref->errorKey = 0; ref->errorLine = __LINE__; break; } - + jam(); const Uint32 trans_key = ++c_opRecordSequence; trans_ptr.p->key = trans_key; trans_ptr.p->m_senderRef = senderRef; @@ -14159,6 +14349,7 @@ Dbdict::execCREATE_FILEGROUP_REQ(Signal* signal){ { Uint32 objId = getFreeObjId(0); if (objId == RNIL) { + jam(); ref->errorCode = CreateFilegroupRef::NoMoreObjectRecords; ref->status = 0; ref->errorKey = 0; @@ -14183,7 +14374,6 @@ Dbdict::execCREATE_FILEGROUP_REQ(Signal* signal){ CreateObjReq::SignalLength, JBB); c_blockState = BS_CREATE_TAB; - return; } while(0); @@ -14219,7 +14409,8 @@ Dbdict::execDROP_FILE_REQ(Signal* signal) break; } - if (c_blockState != BS_IDLE){ + if (c_blockState != BS_IDLE) + { jam(); ref->errorCode = DropFileRef::Busy; ref->errorKey = 0; @@ -14229,6 +14420,7 @@ Dbdict::execDROP_FILE_REQ(Signal* signal) if (checkSingleUserMode(senderRef)) { + jam(); ref->errorCode = DropFileRef::SingleUser; ref->errorKey = 0; ref->errorLine = __LINE__; @@ -14238,6 +14430,7 @@ Dbdict::execDROP_FILE_REQ(Signal* signal) Ptr<File> file_ptr; if (!c_file_hash.find(file_ptr, objId)) { + jam(); ref->errorCode = DropFileRef::NoSuchFile; ref->errorLine = __LINE__; break; @@ -14245,6 +14438,7 @@ Dbdict::execDROP_FILE_REQ(Signal* signal) if (file_ptr.p->m_version != version) { + jam(); ref->errorCode = DropFileRef::InvalidSchemaObjectVersion; ref->errorLine = __LINE__; break; @@ -14253,10 +14447,12 @@ Dbdict::execDROP_FILE_REQ(Signal* signal) Ptr<SchemaTransaction> trans_ptr; if (! c_Trans.seize(trans_ptr)) { + jam(); ref->errorCode = DropFileRef::Busy; ref->errorLine = __LINE__; break; } + jam(); const Uint32 trans_key = ++c_opRecordSequence; trans_ptr.p->key = trans_key; @@ -14292,7 +14488,6 @@ Dbdict::execDROP_FILE_REQ(Signal* signal) DropObjReq::SignalLength, JBB); c_blockState = BS_CREATE_TAB; - return; } while(0); @@ -14320,7 +14515,8 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) Uint32 version = req->filegroup_version; do { - if(getOwnNodeId() != c_masterNodeId){ + if(getOwnNodeId() != c_masterNodeId) + { jam(); ref->errorCode = DropFilegroupRef::NotMaster; ref->errorKey = 0; @@ -14328,7 +14524,8 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) break; } - if (c_blockState != BS_IDLE){ + if (c_blockState != BS_IDLE) + { jam(); ref->errorCode = DropFilegroupRef::Busy; ref->errorKey = 0; @@ -14338,6 +14535,7 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) if (checkSingleUserMode(senderRef)) { + jam(); ref->errorCode = DropFilegroupRef::SingleUser; ref->errorKey = 0; ref->errorLine = __LINE__; @@ -14347,6 +14545,7 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) Ptr<Filegroup> filegroup_ptr; if (!c_filegroup_hash.find(filegroup_ptr, objId)) { + jam(); ref->errorCode = DropFilegroupRef::NoSuchFilegroup; ref->errorLine = __LINE__; break; @@ -14354,6 +14553,7 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) if (filegroup_ptr.p->m_version != version) { + jam(); ref->errorCode = DropFilegroupRef::InvalidSchemaObjectVersion; ref->errorLine = __LINE__; break; @@ -14362,10 +14562,12 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) Ptr<SchemaTransaction> trans_ptr; if (! c_Trans.seize(trans_ptr)) { + jam(); ref->errorCode = DropFilegroupRef::Busy; ref->errorLine = __LINE__; break; } + jam(); const Uint32 trans_key = ++c_opRecordSequence; trans_ptr.p->key = trans_key; @@ -14401,7 +14603,6 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) DropObjReq::SignalLength, JBB); c_blockState = BS_CREATE_TAB; - return; } while(0); @@ -14412,15 +14613,15 @@ Dbdict::execDROP_FILEGROUP_REQ(Signal* signal) } void -Dbdict::execCREATE_OBJ_REF(Signal* signal){ - jamEntry(); - +Dbdict::execCREATE_OBJ_REF(Signal* signal) +{ CreateObjRef * const ref = (CreateObjRef*)signal->getDataPtr(); - Ptr<SchemaTransaction> trans_ptr; + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, ref->senderData)); - if(ref->errorCode != CreateObjRef::NF_FakeErrorREF){ + jam(); trans_ptr.p->setErrorCode(ref->errorCode); } Uint32 node = refToNode(ref->senderRef); @@ -14428,12 +14629,12 @@ Dbdict::execCREATE_OBJ_REF(Signal* signal){ } void -Dbdict::execCREATE_OBJ_CONF(Signal* signal){ - jamEntry(); - - CreateObjConf * const conf = (CreateObjConf*)signal->getDataPtr(); - +Dbdict::execCREATE_OBJ_CONF(Signal* signal) +{ Ptr<SchemaTransaction> trans_ptr; + CreateObjConf * const conf = (CreateObjConf*)signal->getDataPtr(); + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, conf->senderData)); schemaOp_reply(signal, trans_ptr.p, refToNode(conf->senderRef)); } @@ -14443,6 +14644,7 @@ Dbdict::schemaOp_reply(Signal* signal, SchemaTransaction * trans_ptr_p, Uint32 nodeId) { + jam(); { SafeCounter tmp(c_counterMgr, trans_ptr_p->m_counter); if(!tmp.clearWaitingFor(nodeId)){ @@ -14453,10 +14655,8 @@ Dbdict::schemaOp_reply(Signal* signal, switch(trans_ptr_p->m_op.m_state){ case DictObjOp::Preparing:{ - if(trans_ptr_p->m_errorCode != 0) { - jam(); /** * Failed to prepare on atleast one node -> abort on all */ @@ -14466,10 +14666,16 @@ Dbdict::schemaOp_reply(Signal* signal, safe_cast(&Dbdict::trans_abort_start_done); if(f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_abort_start) + { + jam(); (this->*f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_abort_start) (signal, trans_ptr_p); + } else + { + jam(); execute(signal, trans_ptr_p->m_callback, 0); + } return; } @@ -14479,14 +14685,19 @@ Dbdict::schemaOp_reply(Signal* signal, safe_cast(&Dbdict::trans_commit_start_done); if(f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_commit_start) + { + jam(); (this->*f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_commit_start) (signal, trans_ptr_p); + } else + { + jam(); execute(signal, trans_ptr_p->m_callback, 0); + } return; } case DictObjOp::Committing: { - jam(); ndbrequire(trans_ptr_p->m_errorCode == 0); trans_ptr_p->m_op.m_state = DictObjOp::Committed; @@ -14495,31 +14706,42 @@ Dbdict::schemaOp_reply(Signal* signal, safe_cast(&Dbdict::trans_commit_complete_done); if(f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_commit_complete) + { + jam(); (this->*f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_commit_complete) (signal, trans_ptr_p); + } else - execute(signal, trans_ptr_p->m_callback, 0); + { + jam(); + execute(signal, trans_ptr_p->m_callback, 0); + } return; } case DictObjOp::Aborting:{ - jam(); - trans_ptr_p->m_op.m_state = DictObjOp::Committed; trans_ptr_p->m_callback.m_callbackData = trans_ptr_p->key; trans_ptr_p->m_callback.m_callbackFunction= safe_cast(&Dbdict::trans_abort_complete_done); if(f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_abort_complete) + { + jam(); (this->*f_dict_op[trans_ptr_p->m_op.m_vt_index].m_trans_abort_complete) (signal, trans_ptr_p); + } else - execute(signal, trans_ptr_p->m_callback, 0); + { + jam(); + execute(signal, trans_ptr_p->m_callback, 0); + } return; } case DictObjOp::Defined: case DictObjOp::Prepared: case DictObjOp::Committed: case DictObjOp::Aborted: + jam(); break; } ndbrequire(false); @@ -14528,14 +14750,13 @@ Dbdict::schemaOp_reply(Signal* signal, void Dbdict::trans_commit_start_done(Signal* signal, Uint32 callbackData, - Uint32 retValue){ - jamEntry(); - - ndbrequire(retValue == 0); - + Uint32 retValue) +{ Ptr<SchemaTransaction> trans_ptr; + + jam(); + ndbrequire(retValue == 0); ndbrequire(c_Trans.find(trans_ptr, callbackData)); - NodeReceiverGroup rg(DBDICT, trans_ptr.p->m_nodes); SafeCounter tmp(c_counterMgr, trans_ptr.p->m_counter); tmp.init<DictCommitRef>(rg, GSN_DICT_COMMIT_REF, trans_ptr.p->key); @@ -14546,27 +14767,26 @@ Dbdict::trans_commit_start_done(Signal* signal, req->op_key = trans_ptr.p->m_op.m_key; sendSignal(rg, GSN_DICT_COMMIT_REQ, signal, DictCommitReq::SignalLength, JBB); - trans_ptr.p->m_op.m_state = DictObjOp::Committing; } void Dbdict::trans_commit_complete_done(Signal* signal, Uint32 callbackData, - Uint32 retValue){ - jamEntry(); - - ndbrequire(retValue == 0); - + Uint32 retValue) +{ Ptr<SchemaTransaction> trans_ptr; + + jam(); + ndbrequire(retValue == 0); ndbrequire(c_Trans.find(trans_ptr, callbackData)); switch(f_dict_op[trans_ptr.p->m_op.m_vt_index].m_gsn_user_req){ case GSN_CREATE_FILEGROUP_REQ:{ FilegroupPtr fg_ptr; + jam(); ndbrequire(c_filegroup_hash.find(fg_ptr, trans_ptr.p->m_op.m_obj_id)); - // CreateFilegroupConf * conf = (CreateFilegroupConf*)signal->getDataPtr(); conf->senderRef = reference(); conf->senderData = trans_ptr.p->m_senderData; @@ -14576,11 +14796,11 @@ Dbdict::trans_commit_complete_done(Signal* signal, //@todo check api failed sendSignal(trans_ptr.p->m_senderRef, GSN_CREATE_FILEGROUP_CONF, signal, CreateFilegroupConf::SignalLength, JBB); - break; } case GSN_CREATE_FILE_REQ:{ FilePtr f_ptr; + jam(); ndbrequire(c_file_hash.find(f_ptr, trans_ptr.p->m_op.m_obj_id)); CreateFileConf * conf = (CreateFileConf*)signal->getDataPtr(); conf->senderRef = reference(); @@ -14591,11 +14811,11 @@ Dbdict::trans_commit_complete_done(Signal* signal, //@todo check api failed sendSignal(trans_ptr.p->m_senderRef, GSN_CREATE_FILE_CONF, signal, CreateFileConf::SignalLength, JBB); - break; } case GSN_DROP_FILE_REQ:{ DropFileConf * conf = (DropFileConf*)signal->getDataPtr(); + jam(); conf->senderRef = reference(); conf->senderData = trans_ptr.p->m_senderData; conf->fileId = trans_ptr.p->m_op.m_obj_id; @@ -14607,6 +14827,7 @@ Dbdict::trans_commit_complete_done(Signal* signal, } case GSN_DROP_FILEGROUP_REQ:{ DropFilegroupConf * conf = (DropFilegroupConf*)signal->getDataPtr(); + jam(); conf->senderRef = reference(); conf->senderData = trans_ptr.p->m_senderData; conf->filegroupId = trans_ptr.p->m_op.m_obj_id; @@ -14629,12 +14850,12 @@ Dbdict::trans_commit_complete_done(Signal* signal, void Dbdict::trans_abort_start_done(Signal* signal, Uint32 callbackData, - Uint32 retValue){ - jamEntry(); - - ndbrequire(retValue == 0); - + Uint32 retValue) +{ Ptr<SchemaTransaction> trans_ptr; + + jam(); + ndbrequire(retValue == 0); ndbrequire(c_Trans.find(trans_ptr, callbackData)); NodeReceiverGroup rg(DBDICT, trans_ptr.p->m_nodes); @@ -14652,12 +14873,12 @@ Dbdict::trans_abort_start_done(Signal* signal, void Dbdict::trans_abort_complete_done(Signal* signal, Uint32 callbackData, - Uint32 retValue){ - jamEntry(); - - ndbrequire(retValue == 0); - + Uint32 retValue) +{ Ptr<SchemaTransaction> trans_ptr; + + jam(); + ndbrequire(retValue == 0); ndbrequire(c_Trans.find(trans_ptr, callbackData)); switch(f_dict_op[trans_ptr.p->m_op.m_vt_index].m_gsn_user_req){ @@ -14665,6 +14886,7 @@ Dbdict::trans_abort_complete_done(Signal* signal, { // CreateFilegroupRef * ref = (CreateFilegroupRef*)signal->getDataPtr(); + jam(); ref->senderRef = reference(); ref->senderData = trans_ptr.p->m_senderData; ref->masterNodeId = c_masterNodeId; @@ -14676,12 +14898,12 @@ Dbdict::trans_abort_complete_done(Signal* signal, //@todo check api failed sendSignal(trans_ptr.p->m_senderRef, GSN_CREATE_FILEGROUP_REF, signal, CreateFilegroupRef::SignalLength, JBB); - break; } case GSN_CREATE_FILE_REQ: { CreateFileRef * ref = (CreateFileRef*)signal->getDataPtr(); + jam(); ref->senderRef = reference(); ref->senderData = trans_ptr.p->m_senderData; ref->masterNodeId = c_masterNodeId; @@ -14693,12 +14915,12 @@ Dbdict::trans_abort_complete_done(Signal* signal, //@todo check api failed sendSignal(trans_ptr.p->m_senderRef, GSN_CREATE_FILE_REF, signal, CreateFileRef::SignalLength, JBB); - break; } case GSN_DROP_FILE_REQ: { DropFileRef * ref = (DropFileRef*)signal->getDataPtr(); + jam(); ref->senderRef = reference(); ref->senderData = trans_ptr.p->m_senderData; ref->masterNodeId = c_masterNodeId; @@ -14709,13 +14931,13 @@ Dbdict::trans_abort_complete_done(Signal* signal, //@todo check api failed sendSignal(trans_ptr.p->m_senderRef, GSN_DROP_FILE_REF, signal, DropFileRef::SignalLength, JBB); - break; } case GSN_DROP_FILEGROUP_REQ: { // DropFilegroupRef * ref = (DropFilegroupRef*)signal->getDataPtr(); + jam(); ref->senderRef = reference(); ref->senderData = trans_ptr.p->m_senderData; ref->masterNodeId = c_masterNodeId; @@ -14726,7 +14948,6 @@ Dbdict::trans_abort_complete_done(Signal* signal, //@todo check api failed sendSignal(trans_ptr.p->m_senderRef, GSN_DROP_FILEGROUP_REF, signal, DropFilegroupRef::SignalLength, JBB); - break; } default: @@ -14740,7 +14961,8 @@ Dbdict::trans_abort_complete_done(Signal* signal, } void -Dbdict::execCREATE_OBJ_REQ(Signal* signal){ +Dbdict::execCREATE_OBJ_REQ(Signal* signal) +{ jamEntry(); if(!assembleFragments(signal)){ @@ -14785,6 +15007,7 @@ Dbdict::execCREATE_OBJ_REQ(Signal* signal){ switch(objType){ case DictTabInfo::Tablespace: case DictTabInfo::LogfileGroup: + jam(); createObjPtr.p->m_vt_index = 0; break; case DictTabInfo::Datafile: @@ -14793,7 +15016,11 @@ Dbdict::execCREATE_OBJ_REQ(Signal* signal){ * Use restart code to impl. ForceCreateFile */ if (requestInfo & CreateFileReq::ForceCreateFile) - createObjPtr.p->m_restart= 2; + { + jam(); + createObjPtr.p->m_restart= 2; + } + jam(); createObjPtr.p->m_vt_index = 1; break; default: @@ -14809,10 +15036,10 @@ void Dbdict::execDICT_COMMIT_REQ(Signal* signal) { DictCommitReq* req = (DictCommitReq*)signal->getDataPtr(); - Ptr<SchemaOp> op; - ndbrequire(c_schemaOp.find(op, req->op_key)); + jamEntry(); + ndbrequire(c_schemaOp.find(op, req->op_key)); (this->*f_dict_op[op.p->m_vt_index].m_commit)(signal, op.p); } @@ -14820,23 +15047,23 @@ void Dbdict::execDICT_ABORT_REQ(Signal* signal) { DictAbortReq* req = (DictAbortReq*)signal->getDataPtr(); - Ptr<SchemaOp> op; - ndbrequire(c_schemaOp.find(op, req->op_key)); + jamEntry(); + ndbrequire(c_schemaOp.find(op, req->op_key)); (this->*f_dict_op[op.p->m_vt_index].m_abort)(signal, op.p); } void -Dbdict::execDICT_COMMIT_REF(Signal* signal){ - jamEntry(); - +Dbdict::execDICT_COMMIT_REF(Signal* signal) +{ DictCommitRef * const ref = (DictCommitRef*)signal->getDataPtr(); - Ptr<SchemaTransaction> trans_ptr; + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, ref->senderData)); - if(ref->errorCode != DictCommitRef::NF_FakeErrorREF){ + jam(); trans_ptr.p->setErrorCode(ref->errorCode); } Uint32 node = refToNode(ref->senderRef); @@ -14844,26 +15071,26 @@ Dbdict::execDICT_COMMIT_REF(Signal* signal){ } void -Dbdict::execDICT_COMMIT_CONF(Signal* signal){ - jamEntry(); - - DictCommitConf * const conf = (DictCommitConf*)signal->getDataPtr(); - +Dbdict::execDICT_COMMIT_CONF(Signal* signal) +{ Ptr<SchemaTransaction> trans_ptr; + DictCommitConf * const conf = (DictCommitConf*)signal->getDataPtr(); + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, conf->senderData)); schemaOp_reply(signal, trans_ptr.p, refToNode(conf->senderRef)); } void -Dbdict::execDICT_ABORT_REF(Signal* signal){ - jamEntry(); - +Dbdict::execDICT_ABORT_REF(Signal* signal) +{ DictAbortRef * const ref = (DictAbortRef*)signal->getDataPtr(); - Ptr<SchemaTransaction> trans_ptr; + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, ref->senderData)); - if(ref->errorCode != DictAbortRef::NF_FakeErrorREF){ + jam(); trans_ptr.p->setErrorCode(ref->errorCode); } Uint32 node = refToNode(ref->senderRef); @@ -14871,31 +15098,28 @@ Dbdict::execDICT_ABORT_REF(Signal* signal){ } void -Dbdict::execDICT_ABORT_CONF(Signal* signal){ - jamEntry(); - +Dbdict::execDICT_ABORT_CONF(Signal* signal) +{ DictAbortConf * const conf = (DictAbortConf*)signal->getDataPtr(); - Ptr<SchemaTransaction> trans_ptr; + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, conf->senderData)); schemaOp_reply(signal, trans_ptr.p, refToNode(conf->senderRef)); } - - void Dbdict::createObj_prepare_start_done(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + SegmentedSectionPtr objInfoPtr; ndbrequire(returnCode == 0); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); - - SegmentedSectionPtr objInfoPtr; + jam(); getSection(objInfoPtr, createObjPtr.p->m_obj_info_ptr_i); - if(createObjPtr.p->m_errorCode != 0){ jam(); createObjPtr.p->m_obj_info_ptr_i= RNIL; @@ -14923,19 +15147,19 @@ Dbdict::createObj_prepare_start_done(Signal* signal, void Dbdict::createObj_writeSchemaConf1(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ - jam(); + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + Callback callback; + SegmentedSectionPtr objInfoPtr; + jam(); ndbrequire(returnCode == 0); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); - Callback callback; callback.m_callbackData = createObjPtr.p->key; callback.m_callbackFunction = safe_cast(&Dbdict::createObj_writeObjConf); - SegmentedSectionPtr objInfoPtr; getSection(objInfoPtr, createObjPtr.p->m_obj_info_ptr_i); writeTableFile(signal, createObjPtr.p->m_obj_id, objInfoPtr, &callback); @@ -14947,14 +15171,13 @@ Dbdict::createObj_writeSchemaConf1(Signal* signal, void Dbdict::createObj_writeObjConf(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ - jam(); + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + jam(); ndbrequire(returnCode == 0); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); - createObjPtr.p->m_callback.m_callbackFunction = safe_cast(&Dbdict::createObj_prepare_complete_done); (this->*f_dict_op[createObjPtr.p->m_vt_index].m_prepare_complete) @@ -14964,12 +15187,12 @@ Dbdict::createObj_writeObjConf(Signal* signal, void Dbdict::createObj_prepare_complete_done(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + jam(); - ndbrequire(returnCode == 0); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); //@todo check for master failed @@ -14998,28 +15221,33 @@ Dbdict::createObj_prepare_complete_done(Signal* signal, } void -Dbdict::createObj_commit(Signal * signal, SchemaOp * op){ - jam(); - +Dbdict::createObj_commit(Signal * signal, SchemaOp * op) +{ OpCreateObj * createObj = (OpCreateObj*)op; + createObj->m_callback.m_callbackFunction = safe_cast(&Dbdict::createObj_commit_start_done); if (f_dict_op[createObj->m_vt_index].m_commit_start) + { + jam(); (this->*f_dict_op[createObj->m_vt_index].m_commit_start)(signal, createObj); + } else + { + jam(); execute(signal, createObj->m_callback, 0); + } } void Dbdict::createObj_commit_start_done(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; jam(); - ndbrequire(returnCode == 0); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); Uint32 objId = createObjPtr.p->m_obj_id; @@ -15039,29 +15267,35 @@ Dbdict::createObj_commit_start_done(Signal* signal, void Dbdict::createObj_writeSchemaConf2(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ - jam(); - - CreateObjRecordPtr createObjPtr; - ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); createObjPtr.p->m_callback.m_callbackFunction = safe_cast(&Dbdict::createObj_commit_complete_done); if (f_dict_op[createObjPtr.p->m_vt_index].m_commit_complete) + { + jam(); (this->*f_dict_op[createObjPtr.p->m_vt_index].m_commit_complete) (signal, createObjPtr.p); + } else + { + jam(); execute(signal, createObjPtr.p->m_callback, 0); + } } void Dbdict::createObj_commit_complete_done(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + jam(); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); //@todo check error @@ -15079,27 +15313,31 @@ Dbdict::createObj_commit_complete_done(Signal* signal, void Dbdict::createObj_abort(Signal* signal, SchemaOp* op) { - jam(); - OpCreateObj * createObj = (OpCreateObj*)op; createObj->m_callback.m_callbackFunction = safe_cast(&Dbdict::createObj_abort_start_done); if (f_dict_op[createObj->m_vt_index].m_abort_start) + { + jam(); (this->*f_dict_op[createObj->m_vt_index].m_abort_start)(signal, createObj); + } else + { + jam(); execute(signal, createObj->m_callback, 0); + } } void Dbdict::createObj_abort_start_done(Signal* signal, Uint32 callbackData, - Uint32 returnCode){ + Uint32 returnCode) +{ + CreateObjRecordPtr createObjPtr; + jam(); - - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); - XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0]; SchemaFile::TableEntry objEntry = * getTableEntry(xsf, createObjPtr.p->m_obj_id); @@ -15118,19 +15356,23 @@ Dbdict::createObj_abort_writeSchemaConf(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - jam(); + CreateObjRecordPtr createObjPtr; - CreateObjRecordPtr createObjPtr; ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); - createObjPtr.p->m_callback.m_callbackFunction = safe_cast(&Dbdict::createObj_abort_complete_done); if (f_dict_op[createObjPtr.p->m_vt_index].m_abort_complete) + { + jam(); (this->*f_dict_op[createObjPtr.p->m_vt_index].m_abort_complete) (signal, createObjPtr.p); + } else + { + jam(); execute(signal, createObjPtr.p->m_callback, 0); + } } void @@ -15138,9 +15380,9 @@ Dbdict::createObj_abort_complete_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - jam(); + CreateObjRecordPtr createObjPtr; - CreateObjRecordPtr createObjPtr; + jam(); ndbrequire(c_opCreateObj.find(createObjPtr, callbackData)); DictAbortConf * const conf = (DictAbortConf*)signal->getDataPtr(); @@ -15153,7 +15395,8 @@ Dbdict::createObj_abort_complete_done(Signal* signal, } void -Dbdict::execDROP_OBJ_REQ(Signal* signal){ +Dbdict::execDROP_OBJ_REQ(Signal* signal) +{ jamEntry(); if(!assembleFragments(signal)){ @@ -15191,8 +15434,9 @@ Dbdict::execDROP_OBJ_REQ(Signal* signal){ case DictTabInfo::Tablespace: case DictTabInfo::LogfileGroup: { - dropObjPtr.p->m_vt_index = 3; Ptr<Filegroup> fg_ptr; + jam(); + dropObjPtr.p->m_vt_index = 3; ndbrequire(c_filegroup_hash.find(fg_ptr, objId)); dropObjPtr.p->m_obj_ptr_i = fg_ptr.i; break; @@ -15200,15 +15444,19 @@ Dbdict::execDROP_OBJ_REQ(Signal* signal){ } case DictTabInfo::Datafile: { - dropObjPtr.p->m_vt_index = 2; Ptr<File> file_ptr; + jam(); + dropObjPtr.p->m_vt_index = 2; ndbrequire(c_file_hash.find(file_ptr, objId)); dropObjPtr.p->m_obj_ptr_i = file_ptr.i; break; } case DictTabInfo::Undofile: + { + jam(); dropObjPtr.p->m_vt_index = 4; return; + } default: ndbrequire(false); } @@ -15223,12 +15471,12 @@ Dbdict::dropObj_prepare_start_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - ndbrequire(returnCode == 0); + DropObjRecordPtr dropObjPtr; + Callback cb; - DropObjRecordPtr dropObjPtr; + ndbrequire(returnCode == 0); ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); - Callback cb; cb.m_callbackData = callbackData; cb.m_callbackFunction = safe_cast(&Dbdict::dropObj_prepare_writeSchemaConf); @@ -15239,7 +15487,7 @@ Dbdict::dropObj_prepare_start_done(Signal* signal, dropObj_prepare_complete_done(signal, callbackData, 0); return; } - + jam(); Uint32 objId = dropObjPtr.p->m_obj_id; XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0]; SchemaFile::TableEntry objEntry = *getTableEntry(xsf, objId); @@ -15252,19 +15500,23 @@ Dbdict::dropObj_prepare_writeSchemaConf(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - ndbrequire(returnCode == 0); + DropObjRecordPtr dropObjPtr; - DropObjRecordPtr dropObjPtr; + ndbrequire(returnCode == 0); ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); - dropObjPtr.p->m_callback.m_callbackFunction = safe_cast(&Dbdict::dropObj_prepare_complete_done); - if(f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete) + { + jam(); (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_prepare_complete) (signal, dropObjPtr.p); + } else + { + jam(); execute(signal, dropObjPtr.p->m_callback, 0); + } } void @@ -15272,10 +15524,11 @@ Dbdict::dropObj_prepare_complete_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { + DropObjRecordPtr dropObjPtr; + ndbrequire(returnCode == 0); - - DropObjRecordPtr dropObjPtr; ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); + jam(); //@todo check for master failed @@ -15301,16 +15554,22 @@ Dbdict::dropObj_prepare_complete_done(Signal* signal, } void -Dbdict::dropObj_commit(Signal * signal, SchemaOp * op){ - jam(); - +Dbdict::dropObj_commit(Signal * signal, SchemaOp * op) +{ OpDropObj * dropObj = (OpDropObj*)op; + dropObj->m_callback.m_callbackFunction = safe_cast(&Dbdict::dropObj_commit_start_done); if (f_dict_op[dropObj->m_vt_index].m_commit_start) + { + jam(); (this->*f_dict_op[dropObj->m_vt_index].m_commit_start)(signal, dropObj); + } else + { + jam(); execute(signal, dropObj->m_callback, 0); + } } void @@ -15318,10 +15577,10 @@ Dbdict::dropObj_commit_start_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { + DropObjRecordPtr dropObjPtr; + jam(); ndbrequire(returnCode == 0); - - DropObjRecordPtr dropObjPtr; ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); Uint32 objId = dropObjPtr.p->m_obj_id; @@ -15342,20 +15601,25 @@ Dbdict::dropObj_commit_writeSchemaConf(Signal* signal, Uint32 callbackData, Uint32 returnCode) { + DropObjRecordPtr dropObjPtr; + jam(); ndbrequire(returnCode == 0); - - DropObjRecordPtr dropObjPtr; ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); - dropObjPtr.p->m_callback.m_callbackFunction = safe_cast(&Dbdict::dropObj_commit_complete_done); if(f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete) + { + jam(); (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_commit_complete) (signal, dropObjPtr.p); + } else + { + jam(); execute(signal, dropObjPtr.p->m_callback, 0); + } } void @@ -15363,7 +15627,9 @@ Dbdict::dropObj_commit_complete_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - DropObjRecordPtr dropObjPtr; + DropObjRecordPtr dropObjPtr; + + jam(); ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); //@todo check error @@ -15374,22 +15640,26 @@ Dbdict::dropObj_commit_complete_done(Signal* signal, conf->senderData = dropObjPtr.p->m_senderData; sendSignal(dropObjPtr.p->m_senderRef, GSN_DICT_COMMIT_CONF, signal, DictCommitConf::SignalLength, JBB); - c_opDropObj.release(dropObjPtr); } void -Dbdict::dropObj_abort(Signal * signal, SchemaOp * op){ - jam(); - +Dbdict::dropObj_abort(Signal * signal, SchemaOp * op) +{ OpDropObj * dropObj = (OpDropObj*)op; + dropObj->m_callback.m_callbackFunction = safe_cast(&Dbdict::dropObj_abort_start_done); - if (f_dict_op[dropObj->m_vt_index].m_abort_start) + { + jam(); (this->*f_dict_op[dropObj->m_vt_index].m_abort_start)(signal, dropObj); + } else + { + jam(); execute(signal, dropObj->m_callback, 0); + } } void @@ -15397,10 +15667,10 @@ Dbdict::dropObj_abort_start_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { + DropObjRecordPtr dropObjPtr; + jam(); ndbrequire(returnCode == 0); - - DropObjRecordPtr dropObjPtr; ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0]; @@ -15421,6 +15691,7 @@ Dbdict::dropObj_abort_start_done(Signal* signal, } else { + jam(); execute(signal, callback, 0); } } @@ -15430,20 +15701,24 @@ Dbdict::dropObj_abort_writeSchemaConf(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - jam(); + DropObjRecordPtr dropObjPtr; + ndbrequire(returnCode == 0); - - DropObjRecordPtr dropObjPtr; ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); - dropObjPtr.p->m_callback.m_callbackFunction = safe_cast(&Dbdict::dropObj_abort_complete_done); if(f_dict_op[dropObjPtr.p->m_vt_index].m_abort_complete) + { + jam(); (this->*f_dict_op[dropObjPtr.p->m_vt_index].m_abort_complete) (signal, dropObjPtr.p); + } else + { + jam(); execute(signal, dropObjPtr.p->m_callback, 0); + } } void @@ -15451,24 +15726,26 @@ Dbdict::dropObj_abort_complete_done(Signal* signal, Uint32 callbackData, Uint32 returnCode) { - DropObjRecordPtr dropObjPtr; - ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); - + DropObjRecordPtr dropObjPtr; DictAbortConf * const conf = (DictAbortConf*)signal->getDataPtr(); + + ndbrequire(c_opDropObj.find(dropObjPtr, callbackData)); + jam(); conf->senderRef = reference(); conf->senderData = dropObjPtr.p->m_senderData; sendSignal(dropObjPtr.p->m_senderRef, GSN_DICT_ABORT_CONF, signal, DictAbortConf::SignalLength, JBB); - c_opDropObj.release(dropObjPtr); } void -Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ +Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op) +{ /** * Put data into table record */ SegmentedSectionPtr objInfoPtr; + jam(); getSection(objInfoPtr, ((OpCreateObj*)op)->m_obj_info_ptr_i); SimplePropertiesSectionReader it(objInfoPtr, getSectionSegmentPool()); @@ -15485,6 +15762,7 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ if(status != SimpleProperties::Eof) { + jam(); op->m_errorCode = CreateTableRef::InvalidFormat; break; } @@ -15493,6 +15771,7 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ { if(!fg.TS_ExtentSize) { + jam(); op->m_errorCode = CreateFilegroupRef::InvalidExtentSize; break; } @@ -15504,6 +15783,7 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ */ if(fg.LF_UndoBufferSize < 3 * File_formats::NDB_PAGE_SIZE) { + jam(); op->m_errorCode = CreateFilegroupRef::InvalidUndoBufferSize; break; } @@ -15512,16 +15792,19 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ Uint32 len = strlen(fg.FilegroupName) + 1; Uint32 hash = Rope::hash(fg.FilegroupName, len); if(get_object(fg.FilegroupName, len, hash) != 0){ + jam(); op->m_errorCode = CreateTableRef::TableAlreadyExist; break; } if(!c_obj_pool.seize(obj_ptr)){ + jam(); op->m_errorCode = CreateTableRef::NoMoreTableRecords; break; } if(!c_filegroup_pool.seize(fg_ptr)){ + jam(); op->m_errorCode = CreateTableRef::NoMoreTableRecords; break; } @@ -15531,6 +15814,7 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ { Rope name(c_rope_pool, obj_ptr.p->m_name); if(!name.assign(fg.FilegroupName, len, hash)){ + jam(); op->m_errorCode = CreateTableRef::OutOfStringBuffer; break; } @@ -15544,6 +15828,7 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ switch(fg.FilegroupType){ case DictTabInfo::Tablespace: + { //fg.TS_DataGrow = group.m_grow_spec; fg_ptr.p->m_tablespace.m_extent_size = fg.TS_ExtentSize; fg_ptr.p->m_tablespace.m_default_logfile_group_id = fg.TS_LogfileGroupId; @@ -15551,22 +15836,28 @@ Dbdict::create_fg_prepare_start(Signal* signal, SchemaOp* op){ Ptr<Filegroup> lg_ptr; if (!c_filegroup_hash.find(lg_ptr, fg.TS_LogfileGroupId)) { + jam(); op->m_errorCode = CreateFilegroupRef::NoSuchLogfileGroup; goto error; } if (lg_ptr.p->m_version != fg.TS_LogfileGroupVersion) { + jam(); op->m_errorCode = CreateFilegroupRef::InvalidFilegroupVersion; goto error; } increase_ref_count(lg_ptr.p->m_obj_ptr_i); break; + } case DictTabInfo::LogfileGroup: + { + jam(); fg_ptr.p->m_logfilegroup.m_undo_buffer_size = fg.LF_UndoBufferSize; fg_ptr.p->m_logfilegroup.m_files.init(); //fg.LF_UndoGrow = ; break; + } default: ndbrequire(false); } @@ -15601,13 +15892,14 @@ error: } void -Dbdict::create_fg_prepare_complete(Signal* signal, SchemaOp* op){ +Dbdict::create_fg_prepare_complete(Signal* signal, SchemaOp* op) +{ /** * CONTACT TSMAN LGMAN PGMAN */ CreateFilegroupImplReq* req = (CreateFilegroupImplReq*)signal->getDataPtrSend(); - + jam(); req->senderData = op->key; req->senderRef = reference(); req->filegroup_id = op->m_obj_id; @@ -15620,18 +15912,24 @@ Dbdict::create_fg_prepare_complete(Signal* signal, SchemaOp* op){ Uint32 len= 0; switch(op->m_obj_type){ case DictTabInfo::Tablespace: + { + jam(); ref = TSMAN_REF; len = CreateFilegroupImplReq::TablespaceLength; req->tablespace.extent_size = fg_ptr.p->m_tablespace.m_extent_size; req->tablespace.logfile_group_id = fg_ptr.p->m_tablespace.m_default_logfile_group_id; break; + } case DictTabInfo::LogfileGroup: + { + jam(); ref = LGMAN_REF; len = CreateFilegroupImplReq::LogfileGroupLength; req->logfile_group.buffer_size = fg_ptr.p->m_logfilegroup.m_undo_buffer_size; break; + } default: ndbrequire(false); } @@ -15640,12 +15938,11 @@ Dbdict::create_fg_prepare_complete(Signal* signal, SchemaOp* op){ } void -Dbdict::execCREATE_FILEGROUP_REF(Signal* signal){ - jamEntry(); - +Dbdict::execCREATE_FILEGROUP_REF(Signal* signal) +{ CreateFilegroupImplRef * ref = (CreateFilegroupImplRef*)signal->getDataPtr(); - CreateObjRecordPtr op_ptr; + jamEntry(); ndbrequire(c_opCreateObj.find(op_ptr, ref->senderData)); op_ptr.p->m_errorCode = ref->errorCode; @@ -15653,13 +15950,12 @@ Dbdict::execCREATE_FILEGROUP_REF(Signal* signal){ } void -Dbdict::execCREATE_FILEGROUP_CONF(Signal* signal){ - jamEntry(); - +Dbdict::execCREATE_FILEGROUP_CONF(Signal* signal) +{ CreateFilegroupImplConf * rep = (CreateFilegroupImplConf*)signal->getDataPtr(); - CreateObjRecordPtr op_ptr; + jamEntry(); ndbrequire(c_opCreateObj.find(op_ptr, rep->senderData)); execute(signal, op_ptr.p->m_callback, 0); @@ -15675,13 +15971,13 @@ Dbdict::create_fg_abort_start(Signal* signal, SchemaOp* op){ send_drop_fg(signal, op, DropFilegroupImplReq::Commit); return; } - + jam(); execute(signal, op->m_callback, 0); } void -Dbdict::create_fg_abort_complete(Signal* signal, SchemaOp* op){ - +Dbdict::create_fg_abort_complete(Signal* signal, SchemaOp* op) +{ if (op->m_obj_ptr_i != RNIL) { jam(); @@ -15691,12 +15987,13 @@ Dbdict::create_fg_abort_complete(Signal* signal, SchemaOp* op){ release_object(fg_ptr.p->m_obj_ptr_i); c_filegroup_hash.release(fg_ptr); } - + jam(); execute(signal, op->m_callback, 0); } void -Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ +Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op) +{ /** * Put data into table record */ @@ -15716,6 +16013,7 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ do { if(status != SimpleProperties::Eof){ + jam(); op->m_errorCode = CreateFileRef::InvalidFormat; break; } @@ -15723,34 +16021,53 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ // Get Filegroup FilegroupPtr fg_ptr; if(!c_filegroup_hash.find(fg_ptr, f.FilegroupId)){ + jam(); op->m_errorCode = CreateFileRef::NoSuchFilegroup; break; } if(fg_ptr.p->m_version != f.FilegroupVersion){ + jam(); op->m_errorCode = CreateFileRef::InvalidFilegroupVersion; break; } switch(f.FileType){ case DictTabInfo::Datafile: + { if(fg_ptr.p->m_type != DictTabInfo::Tablespace) + { + jam(); op->m_errorCode = CreateFileRef::InvalidFileType; + } + jam(); break; + } case DictTabInfo::Undofile: + { if(fg_ptr.p->m_type != DictTabInfo::LogfileGroup) + { + jam(); op->m_errorCode = CreateFileRef::InvalidFileType; + } + jam(); break; + } default: + jam(); op->m_errorCode = CreateFileRef::InvalidFileType; } if(op->m_errorCode) + { + jam(); break; + } Uint32 len = strlen(f.FileName) + 1; Uint32 hash = Rope::hash(f.FileName, len); if(get_object(f.FileName, len, hash) != 0){ + jam(); op->m_errorCode = CreateFileRef::FilenameAlreadyExists; break; } @@ -15761,6 +16078,7 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ m_ctx.m_config.getOwnConfigIterator(); if(!ndb_mgm_get_int_parameter(p, CFG_DB_DISCLESS, &dl) && dl) { + jam(); op->m_errorCode = CreateFileRef::NotSupportedWhenDiskless; break; } @@ -15768,11 +16086,13 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ // Loop through all filenames... if(!c_obj_pool.seize(obj_ptr)){ + jam(); op->m_errorCode = CreateTableRef::NoMoreTableRecords; break; } if (! c_file_pool.seize(filePtr)){ + jam(); op->m_errorCode = CreateFileRef::OutOfFileRecords; break; } @@ -15782,6 +16102,7 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ { Rope name(c_rope_pool, obj_ptr.p->m_name); if(!name.assign(f.FileName, len, hash)){ + jam(); op->m_errorCode = CreateTableRef::OutOfStringBuffer; break; } @@ -15789,10 +16110,14 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ switch(fg_ptr.p->m_type){ case DictTabInfo::Tablespace: + { + jam(); increase_ref_count(fg_ptr.p->m_obj_ptr_i); break; + } case DictTabInfo::LogfileGroup: { + jam(); Local_file_list list(c_file_pool, fg_ptr.p->m_logfilegroup.m_files); list.add(filePtr); break; @@ -15836,37 +16161,46 @@ Dbdict::create_file_prepare_start(Signal* signal, SchemaOp* op){ c_obj_pool.release(obj_ptr); } } - execute(signal, op->m_callback, 0); } void -Dbdict::create_file_prepare_complete(Signal* signal, SchemaOp* op){ +Dbdict::create_file_prepare_complete(Signal* signal, SchemaOp* op) +{ /** * CONTACT TSMAN LGMAN PGMAN */ CreateFileImplReq* req = (CreateFileImplReq*)signal->getDataPtrSend(); - FilePtr f_ptr; - c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); - FilegroupPtr fg_ptr; + + jam(); + c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); req->senderData = op->key; req->senderRef = reference(); switch(((OpCreateObj*)op)->m_restart){ case 0: + { + jam(); req->requestInfo = CreateFileImplReq::Create; break; + } case 1: + { + jam(); req->requestInfo = CreateFileImplReq::Open; break; + } case 2: + { + jam(); req->requestInfo = CreateFileImplReq::CreateForce; break; } + } req->file_id = f_ptr.p->key; req->filegroup_id = f_ptr.p->m_filegroup_id; @@ -15878,14 +16212,20 @@ Dbdict::create_file_prepare_complete(Signal* signal, SchemaOp* op){ Uint32 len= 0; switch(op->m_obj_type){ case DictTabInfo::Datafile: + { + jam(); ref = TSMAN_REF; len = CreateFileImplReq::DatafileLength; req->tablespace.extent_size = fg_ptr.p->m_tablespace.m_extent_size; break; + } case DictTabInfo::Undofile: + { + jam(); ref = LGMAN_REF; len = CreateFileImplReq::UndofileLength; break; + } default: ndbrequire(false); } @@ -15900,42 +16240,41 @@ Dbdict::create_file_prepare_complete(Signal* signal, SchemaOp* op){ } void -Dbdict::execCREATE_FILE_REF(Signal* signal){ - jamEntry(); - +Dbdict::execCREATE_FILE_REF(Signal* signal) +{ CreateFileImplRef * ref = (CreateFileImplRef*)signal->getDataPtr(); - CreateObjRecordPtr op_ptr; + + jamEntry(); ndbrequire(c_opCreateObj.find(op_ptr, ref->senderData)); op_ptr.p->m_errorCode = ref->errorCode; - execute(signal, op_ptr.p->m_callback, 0); } void -Dbdict::execCREATE_FILE_CONF(Signal* signal){ - jamEntry(); - +Dbdict::execCREATE_FILE_CONF(Signal* signal) +{ CreateFileImplConf * rep = (CreateFileImplConf*)signal->getDataPtr(); - CreateObjRecordPtr op_ptr; + + jamEntry(); ndbrequire(c_opCreateObj.find(op_ptr, rep->senderData)); - execute(signal, op_ptr.p->m_callback, 0); } void -Dbdict::create_file_commit_start(Signal* signal, SchemaOp* op){ +Dbdict::create_file_commit_start(Signal* signal, SchemaOp* op) +{ /** * CONTACT TSMAN LGMAN PGMAN */ CreateFileImplReq* req = (CreateFileImplReq*)signal->getDataPtrSend(); - FilePtr f_ptr; - c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); - FilegroupPtr fg_ptr; + + jam(); + c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); req->senderData = op->key; @@ -15949,15 +16288,20 @@ Dbdict::create_file_commit_start(Signal* signal, SchemaOp* op){ Uint32 ref= 0; switch(op->m_obj_type){ case DictTabInfo::Datafile: + { + jam(); ref = TSMAN_REF; break; + } case DictTabInfo::Undofile: + { + jam(); ref = LGMAN_REF; break; + } default: ndbrequire(false); } - sendSignal(ref, GSN_CREATE_FILE_REQ, signal, CreateFileImplReq::CommitLength, JBB); } @@ -15970,9 +16314,11 @@ Dbdict::create_file_abort_start(Signal* signal, SchemaOp* op) if (op->m_obj_ptr_i != RNIL) { FilePtr f_ptr; + FilegroupPtr fg_ptr; + + jam(); c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); - FilegroupPtr fg_ptr; ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); req->senderData = op->key; @@ -15986,20 +16332,24 @@ Dbdict::create_file_abort_start(Signal* signal, SchemaOp* op) Uint32 ref= 0; switch(op->m_obj_type){ case DictTabInfo::Datafile: + { + jam(); ref = TSMAN_REF; break; + } case DictTabInfo::Undofile: + { + jam(); ref = LGMAN_REF; break; + } default: ndbrequire(false); } - sendSignal(ref, GSN_CREATE_FILE_REQ, signal, CreateFileImplReq::AbortLength, JBB); return; } - execute(signal, op->m_callback, 0); } @@ -16009,17 +16359,21 @@ Dbdict::create_file_abort_complete(Signal* signal, SchemaOp* op) if (op->m_obj_ptr_i != RNIL) { FilePtr f_ptr; - c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); - FilegroupPtr fg_ptr; + + jam(); + c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); - switch(fg_ptr.p->m_type){ case DictTabInfo::Tablespace: + { + jam(); decrease_ref_count(fg_ptr.p->m_obj_ptr_i); break; + } case DictTabInfo::LogfileGroup: { + jam(); Local_file_list list(c_file_pool, fg_ptr.p->m_logfilegroup.m_files); list.remove(f_ptr); break; @@ -16031,19 +16385,20 @@ Dbdict::create_file_abort_complete(Signal* signal, SchemaOp* op) release_object(f_ptr.p->m_obj_ptr_i); c_file_hash.release(f_ptr); } - execute(signal, op->m_callback, 0); } void Dbdict::drop_file_prepare_start(Signal* signal, SchemaOp* op) { + jam(); send_drop_file(signal, op, DropFileImplReq::Prepare); } void Dbdict::drop_undofile_prepare_start(Signal* signal, SchemaOp* op) { + jam(); op->m_errorCode = DropFileRef::DropUndoFileNotSupported; execute(signal, op->m_callback, 0); } @@ -16051,6 +16406,7 @@ Dbdict::drop_undofile_prepare_start(Signal* signal, SchemaOp* op) void Dbdict::drop_file_commit_start(Signal* signal, SchemaOp* op) { + jam(); send_drop_file(signal, op, DropFileImplReq::Commit); } @@ -16058,21 +16414,37 @@ void Dbdict::drop_file_commit_complete(Signal* signal, SchemaOp* op) { FilePtr f_ptr; - c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); - FilegroupPtr fg_ptr; - ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); + jam(); + c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); + ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); decrease_ref_count(fg_ptr.p->m_obj_ptr_i); release_object(f_ptr.p->m_obj_ptr_i); c_file_hash.release(f_ptr); + execute(signal, op->m_callback, 0); +} + +void +Dbdict::drop_undofile_commit_complete(Signal* signal, SchemaOp* op) +{ + FilePtr f_ptr; + FilegroupPtr fg_ptr; + jam(); + c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); + ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); + Local_file_list list(c_file_pool, fg_ptr.p->m_logfilegroup.m_files); + list.remove(f_ptr); + release_object(f_ptr.p->m_obj_ptr_i); + c_file_hash.release(f_ptr); execute(signal, op->m_callback, 0); } void Dbdict::drop_file_abort_start(Signal* signal, SchemaOp* op) { + jam(); send_drop_file(signal, op, DropFileImplReq::Abort); } @@ -16081,11 +16453,11 @@ Dbdict::send_drop_file(Signal* signal, SchemaOp* op, DropFileImplReq::RequestInfo type) { DropFileImplReq* req = (DropFileImplReq*)signal->getDataPtrSend(); - FilePtr f_ptr; - c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); - FilegroupPtr fg_ptr; + + jam(); + c_file_pool.getPtr(f_ptr, op->m_obj_ptr_i); ndbrequire(c_filegroup_hash.find(fg_ptr, f_ptr.p->m_filegroup_id)); req->senderData = op->key; @@ -16099,29 +16471,34 @@ Dbdict::send_drop_file(Signal* signal, SchemaOp* op, Uint32 ref= 0; switch(op->m_obj_type){ case DictTabInfo::Datafile: + { + jam(); ref = TSMAN_REF; break; + } case DictTabInfo::Undofile: + { + jam(); ref = LGMAN_REF; break; + } default: ndbrequire(false); } - sendSignal(ref, GSN_DROP_FILE_REQ, signal, DropFileImplReq::SignalLength, JBB); } void -Dbdict::execDROP_OBJ_REF(Signal* signal){ - jamEntry(); - +Dbdict::execDROP_OBJ_REF(Signal* signal) +{ DropObjRef * const ref = (DropObjRef*)signal->getDataPtr(); - Ptr<SchemaTransaction> trans_ptr; + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, ref->senderData)); - if(ref->errorCode != DropObjRef::NF_FakeErrorREF){ + jam(); trans_ptr.p->setErrorCode(ref->errorCode); } Uint32 node = refToNode(ref->senderRef); @@ -16129,65 +16506,61 @@ Dbdict::execDROP_OBJ_REF(Signal* signal){ } void -Dbdict::execDROP_OBJ_CONF(Signal* signal){ - jamEntry(); - +Dbdict::execDROP_OBJ_CONF(Signal* signal) +{ DropObjConf * const conf = (DropObjConf*)signal->getDataPtr(); - Ptr<SchemaTransaction> trans_ptr; + + jamEntry(); ndbrequire(c_Trans.find(trans_ptr, conf->senderData)); schemaOp_reply(signal, trans_ptr.p, refToNode(conf->senderRef)); } void -Dbdict::execDROP_FILE_REF(Signal* signal){ - jamEntry(); - +Dbdict::execDROP_FILE_REF(Signal* signal) +{ DropFileImplRef * ref = (DropFileImplRef*)signal->getDataPtr(); - DropObjRecordPtr op_ptr; + + jamEntry(); ndbrequire(c_opDropObj.find(op_ptr, ref->senderData)); op_ptr.p->m_errorCode = ref->errorCode; - execute(signal, op_ptr.p->m_callback, 0); } void -Dbdict::execDROP_FILE_CONF(Signal* signal){ - jamEntry(); - +Dbdict::execDROP_FILE_CONF(Signal* signal) +{ DropFileImplConf * rep = (DropFileImplConf*)signal->getDataPtr(); - DropObjRecordPtr op_ptr; + + jamEntry(); ndbrequire(c_opDropObj.find(op_ptr, rep->senderData)); - execute(signal, op_ptr.p->m_callback, 0); } void -Dbdict::execDROP_FILEGROUP_REF(Signal* signal){ - jamEntry(); - +Dbdict::execDROP_FILEGROUP_REF(Signal* signal) +{ DropFilegroupImplRef * ref = (DropFilegroupImplRef*)signal->getDataPtr(); - DropObjRecordPtr op_ptr; + + jamEntry(); ndbrequire(c_opDropObj.find(op_ptr, ref->senderData)); op_ptr.p->m_errorCode = ref->errorCode; - execute(signal, op_ptr.p->m_callback, 0); } void -Dbdict::execDROP_FILEGROUP_CONF(Signal* signal){ - jamEntry(); - +Dbdict::execDROP_FILEGROUP_CONF(Signal* signal) +{ DropFilegroupImplConf * rep = (DropFilegroupImplConf*)signal->getDataPtr(); - DropObjRecordPtr op_ptr; + + jamEntry(); ndbrequire(c_opDropObj.find(op_ptr, rep->senderData)); - execute(signal, op_ptr.p->m_callback, 0); } @@ -16200,11 +16573,13 @@ Dbdict::drop_fg_prepare_start(Signal* signal, SchemaOp* op) DictObject * obj = c_obj_pool.getPtr(fg_ptr.p->m_obj_ptr_i); if (obj->m_ref_count) { + jam(); op->m_errorCode = DropFilegroupRef::FilegroupInUse; execute(signal, op->m_callback, 0); } else { + jam(); send_drop_fg(signal, op, DropFilegroupImplReq::Prepare); } } @@ -16216,7 +16591,7 @@ Dbdict::drop_fg_commit_start(Signal* signal, SchemaOp* op) c_filegroup_pool.getPtr(fg_ptr, op->m_obj_ptr_i); if (op->m_obj_type == DictTabInfo::LogfileGroup) { - + jam(); /** * Mark all undofiles as dropped */ @@ -16225,6 +16600,7 @@ Dbdict::drop_fg_commit_start(Signal* signal, SchemaOp* op) XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0]; for(list.first(filePtr); !filePtr.isNull(); list.next(filePtr)) { + jam(); Uint32 objId = filePtr.p->key; SchemaFile::TableEntry * tableEntry = getTableEntry(xsf, objId); tableEntry->m_tableState = SchemaFile::DROP_TABLE_COMMITTED; @@ -16237,13 +16613,14 @@ Dbdict::drop_fg_commit_start(Signal* signal, SchemaOp* op) else if(op->m_obj_type == DictTabInfo::Tablespace) { FilegroupPtr lg_ptr; + jam(); ndbrequire(c_filegroup_hash. find(lg_ptr, fg_ptr.p->m_tablespace.m_default_logfile_group_id)); decrease_ref_count(lg_ptr.p->m_obj_ptr_i); } - + jam(); send_drop_fg(signal, op, DropFilegroupImplReq::Commit); } @@ -16252,16 +16629,17 @@ Dbdict::drop_fg_commit_complete(Signal* signal, SchemaOp* op) { FilegroupPtr fg_ptr; c_filegroup_pool.getPtr(fg_ptr, op->m_obj_ptr_i); - + + jam(); release_object(fg_ptr.p->m_obj_ptr_i); c_filegroup_hash.release(fg_ptr); - execute(signal, op->m_callback, 0); } void Dbdict::drop_fg_abort_start(Signal* signal, SchemaOp* op) { + jam(); send_drop_fg(signal, op, DropFilegroupImplReq::Abort); } diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp index e5b918ca270..3fff330d699 100644 --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp @@ -2565,6 +2565,12 @@ private: const SchemaFile::TableEntry *, const SchemaFile::TableEntry *); void restartDropTab_complete(Signal*, Uint32 callback, Uint32); + + void restartDropObj(Signal*, Uint32, const SchemaFile::TableEntry *); + void restartDropObj_prepare_start_done(Signal*, Uint32, Uint32); + void restartDropObj_prepare_complete_done(Signal*, Uint32, Uint32); + void restartDropObj_commit_start_done(Signal*, Uint32, Uint32); + void restartDropObj_commit_complete_done(Signal*, Uint32, Uint32); void restart_checkSchemaStatusComplete(Signal*, Uint32 callback, Uint32); void restart_writeSchemaConf(Signal*, Uint32 callbackData, Uint32); @@ -2657,7 +2663,8 @@ public: void send_drop_fg(Signal*, SchemaOp*, DropFilegroupImplReq::RequestInfo); void drop_undofile_prepare_start(Signal* signal, SchemaOp*); - + void drop_undofile_commit_complete(Signal* signal, SchemaOp*); + int checkSingleUserMode(Uint32 senderRef); }; diff --git a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp index ff4c5b2648b..2ffed9749b8 100644 --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp @@ -8507,9 +8507,32 @@ void Dblqh::continueAfterReceivingAllAiLab(Signal* signal) AccScanReq::setLockMode(req->requestInfo, scanptr.p->scanLockMode); AccScanReq::setReadCommittedFlag(req->requestInfo, scanptr.p->readCommitted); AccScanReq::setDescendingFlag(req->requestInfo, scanptr.p->descending); - AccScanReq::setNoDiskScanFlag(req->requestInfo, - !tcConnectptr.p->m_disk_table); - AccScanReq::setLcpScanFlag(req->requestInfo, scanptr.p->lcpScan); + + if (refToBlock(tcConnectptr.p->clientBlockref) == BACKUP) + { + if (scanptr.p->lcpScan) + { + AccScanReq::setNoDiskScanFlag(req->requestInfo, 1); + AccScanReq::setLcpScanFlag(req->requestInfo, 1); + } + else + { + /* If backup scan disktables in disk order */ + AccScanReq::setNoDiskScanFlag(req->requestInfo, + !tcConnectptr.p->m_disk_table); + AccScanReq::setLcpScanFlag(req->requestInfo, 0); + } + } + else + { +#if BUG_27776_FIXED + AccScanReq::setNoDiskScanFlag(req->requestInfo, + !tcConnectptr.p->m_disk_table); +#else + AccScanReq::setNoDiskScanFlag(req->requestInfo, 1); +#endif + AccScanReq::setLcpScanFlag(req->requestInfo, 0); + } req->transId1 = tcConnectptr.p->transid[0]; req->transId2 = tcConnectptr.p->transid[1]; diff --git a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp index 4577671202c..5c0972148dd 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp +++ b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp @@ -1053,6 +1053,8 @@ ArrayPool<TupTriggerData> c_triggerPool; struct { Uint32 tabUserPtr; Uint32 tabUserRef; + Uint32 m_lcpno; + Uint32 m_fragPtrI; } m_dropTable; State tableStatus; }; @@ -1614,6 +1616,11 @@ private: void execACCKEYREF(Signal* signal); void execACC_ABORTCONF(Signal* signal); + + // Drop table + void execFSREMOVEREF(Signal*); + void execFSREMOVECONF(Signal*); + //------------------------------------------------------------------ //------------------------------------------------------------------ // Methods to handle execution of TUPKEYREQ + ATTRINFO. @@ -2505,7 +2512,9 @@ private: void drop_fragment_free_extent_log_buffer_callback(Signal*, Uint32, Uint32); void drop_fragment_unmap_pages(Signal*, TablerecPtr, FragrecordPtr, Uint32); void drop_fragment_unmap_page_callback(Signal* signal, Uint32, Uint32); - + void drop_fragment_fsremove(Signal*, TablerecPtr, FragrecordPtr); + void drop_fragment_fsremove_done(Signal*, TablerecPtr, FragrecordPtr); + // Initialisation void initData(); void initRecords(); diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp index 1c3986afbbd..87705232de2 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupDiskAlloc.cpp @@ -317,6 +317,7 @@ Dbtup::restart_setup_page(Disk_alloc_info& alloc, PagePtr pagePtr) unsigned uncommitted, committed; uncommitted = committed = ~(unsigned)0; (void) tsman.get_page_free_bits(&page, &uncommitted, &committed); + jamEntry(); idx = alloc.calc_page_free_bits(real_free); ddassert(idx == committed); @@ -427,12 +428,12 @@ Dbtup::disk_page_prealloc(Signal* signal, c_extent_pool.getPtr(ext); if ((pageBits= tsman.alloc_page_from_extent(&ext.p->m_key, bits)) >= 0) { - jam(); + jamEntry(); found= true; } else { - jam(); + jamEntry(); /** * The current extent is not in a free list * and since it couldn't accomadate the request @@ -489,7 +490,7 @@ Dbtup::disk_page_prealloc(Signal* signal, if ((err= tsman.alloc_extent(&ext.p->m_key)) < 0) { - jam(); + jamEntry(); #if NOT_YET_UNDO_ALLOC_EXTENT c_lgman->free_log_space(logfile_group_id, sizeof(Disk_undo::AllocExtent)>>2); @@ -541,6 +542,7 @@ Dbtup::disk_page_prealloc(Signal* signal, alloc.m_curr_extent_info_ptr_i= ext.i; ext.p->m_free_matrix_pos= RNIL; pageBits= tsman.alloc_page_from_extent(&ext.p->m_key, bits); + jamEntry(); ddassert(pageBits >= 0); } @@ -600,6 +602,7 @@ Dbtup::disk_page_prealloc(Signal* signal, } int res= m_pgman.get_page(signal, preq, flags); + jamEntry(); switch(res) { case 0: @@ -896,6 +899,7 @@ Dbtup::disk_page_set_dirty(PagePtr pagePtr) // Make sure no one will allocate it... tsman.unmap_page(&key, MAX_FREE_LIST - 1); + jamEntry(); } void @@ -947,6 +951,7 @@ Dbtup::disk_page_unmap_callback(Uint32 page_id, Uint32 dirty_count) fragPtr.p->m_tablespace_id); tsman.unmap_page(&key, idx); + jamEntry(); pagePtr.p->list_index = idx | 0x8000; } @@ -995,6 +1000,7 @@ Dbtup::disk_page_alloc(Signal* signal, fragPtrP->m_tablespace_id); tsman.update_page_free_bits(key, new_bits, lsn); + jamEntry(); } } @@ -1047,6 +1053,7 @@ Dbtup::disk_page_free(Signal *signal, fragPtrP->m_tablespace_id); tsman.update_page_free_bits(key, new_bits, lsn); + jamEntry(); } Uint32 ext = pagePtr.p->m_extent_info_ptr; @@ -1100,6 +1107,7 @@ Dbtup::disk_page_abort_prealloc(Signal *signal, Fragrecord* fragPtrP, memcpy(&req.m_page, key, sizeof(Local_key)); int res= m_pgman.get_page(signal, req, flags); + jamEntry(); switch(res) { case 0: @@ -1228,6 +1236,7 @@ Dbtup::disk_page_alloc_extent_log_buffer_callback(Signal* signal, Uint64 lsn= lgman.add_entry(c, 1); tsman.update_lsn(&key, lsn); + jamEntry(); } #endif @@ -1246,6 +1255,7 @@ Dbtup::disk_page_undo_alloc(Page* page, const Local_key* key, Uint64 lsn= lgman.add_entry(c, 1); m_pgman.update_lsn(* key, lsn); + jamEntry(); return lsn; } @@ -1275,6 +1285,7 @@ Dbtup::disk_page_undo_update(Page* page, const Local_key* key, Uint64 lsn= lgman.add_entry(c, 3); m_pgman.update_lsn(* key, lsn); + jamEntry(); return lsn; } @@ -1304,6 +1315,7 @@ Dbtup::disk_page_undo_free(Page* page, const Local_key* key, Uint64 lsn= lgman.add_entry(c, 3); m_pgman.update_lsn(* key, lsn); + jamEntry(); return lsn; } @@ -1398,6 +1410,7 @@ Dbtup::disk_restart_undo(Signal* signal, Uint64 lsn, int flags = 0; int res= m_pgman.get_page(signal, preq, flags); + jamEntry(); switch(res) { case 0: @@ -1541,6 +1554,7 @@ Dbtup::disk_restart_undo_callback(Signal* signal, lsn = undo->m_lsn - 1; // make sure undo isn't run again... m_pgman.update_lsn(undo->m_key, lsn); + jamEntry(); } else if (DBG_UNDO) { @@ -1633,6 +1647,7 @@ Dbtup::disk_restart_undo_page_bits(Signal* signal, Apply_undo* undo) fragPtrP->m_tablespace_id); tsman.restart_undo_page_free_bits(&undo->m_key, new_bits, undo->m_lsn, lsn); + jamEntry(); } int diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp index ef242da2a43..a9f0083a2b6 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupGen.cpp @@ -99,6 +99,10 @@ Dbtup::Dbtup(Block_context& ctx, Pgman* pgman) addRecSignal(GSN_ACCKEYREF, &Dbtup::execACCKEYREF); addRecSignal(GSN_ACC_ABORTCONF, &Dbtup::execACC_ABORTCONF); + // Drop table + addRecSignal(GSN_FSREMOVEREF, &Dbtup::execFSREMOVEREF, true); + addRecSignal(GSN_FSREMOVECONF, &Dbtup::execFSREMOVECONF, true); + attrbufrec = 0; fragoperrec = 0; fragrecord = 0; diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp index 81e678d0f6f..6866236f15e 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupMeta.cpp @@ -21,6 +21,7 @@ #include <ndb_limits.h> #include <pc.hpp> #include <signaldata/TupFrag.hpp> +#include <signaldata/FsRef.hpp> #include <signaldata/FsConf.hpp> #include <signaldata/FsRemoveReq.hpp> #include <signaldata/DropTab.hpp> @@ -1283,6 +1284,24 @@ Dbtup::drop_fragment_free_var_pages(Signal* signal) sendSignal(cownref, GSN_CONTINUEB, signal, 3, JBB); return; } + + /** + * Remove LCP's for fragment + */ + tabPtr.p->m_dropTable.m_lcpno = 0; + tabPtr.p->m_dropTable.m_fragPtrI = fragPtr.i; + drop_fragment_fsremove(signal, tabPtr, fragPtr); +} + +void +Dbtup::drop_fragment_fsremove_done(Signal* signal, + TablerecPtr tabPtr, + FragrecordPtr fragPtr) +{ + /** + * LCP's removed... + * now continue with "next" + */ Uint32 logfile_group_id = fragPtr.p->m_logfile_group_id ; releaseFragPages(fragPtr.p); Uint32 i; @@ -1302,6 +1321,74 @@ Dbtup::drop_fragment_free_var_pages(Signal* signal) return; } +// Remove LCP + +void +Dbtup::drop_fragment_fsremove(Signal* signal, + TablerecPtr tabPtr, + FragrecordPtr fragPtr) +{ + FsRemoveReq* req = (FsRemoveReq*)signal->getDataPtrSend(); + req->userReference = reference(); + req->userPointer = tabPtr.i; + req->directory = 0; + req->ownDirectory = 0; + + Uint32 lcpno = tabPtr.p->m_dropTable.m_lcpno; + Uint32 fragId = fragPtr.p->fragmentId; + Uint32 tableId = fragPtr.p->fragTableId; + + FsOpenReq::setVersion(req->fileNumber, 5); + FsOpenReq::setSuffix(req->fileNumber, FsOpenReq::S_DATA); + FsOpenReq::v5_setLcpNo(req->fileNumber, lcpno); + FsOpenReq::v5_setTableId(req->fileNumber, tableId); + FsOpenReq::v5_setFragmentId(req->fileNumber, fragId); + sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, + FsRemoveReq::SignalLength, JBB); +} + +void +Dbtup::execFSREMOVEREF(Signal* signal) +{ + jamEntry(); + FsRef* ref = (FsRef*)signal->getDataPtr(); + Uint32 userPointer = ref->userPointer; + FsConf* conf = (FsConf*)signal->getDataPtrSend(); + conf->userPointer = userPointer; + execFSREMOVECONF(signal); +} + +void +Dbtup::execFSREMOVECONF(Signal* signal) +{ + jamEntry(); + FsConf* conf = (FsConf*)signal->getDataPtrSend(); + + TablerecPtr tabPtr; + FragrecordPtr fragPtr; + + tabPtr.i = conf->userPointer; + ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec); + + ndbrequire(tabPtr.p->tableStatus == DROPPING); + + fragPtr.i = tabPtr.p->m_dropTable.m_fragPtrI; + ptrCheckGuard(fragPtr, cnoOfFragrec, fragrecord); + + tabPtr.p->m_dropTable.m_lcpno++; + if (tabPtr.p->m_dropTable.m_lcpno < 3) + { + jam(); + drop_fragment_fsremove(signal, tabPtr, fragPtr); + } + else + { + jam(); + drop_fragment_fsremove_done(signal, tabPtr, fragPtr); + } +} +// End remove LCP + void Dbtup::start_restore_lcp(Uint32 tableId, Uint32 fragId) { diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp index 56bac8868b8..948cd77b437 100644 --- a/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp +++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupScan.cpp @@ -63,13 +63,11 @@ Dbtup::execACC_SCANREQ(Signal* signal) break; } -#if BUG_27776_FIXED if (!AccScanReq::getNoDiskScanFlag(req->requestInfo) && tablePtr.p->m_no_of_disk_attributes) { bits |= ScanOp::SCAN_DD; } -#endif bool mm = (bits & ScanOp::SCAN_DD); if (tablePtr.p->m_attributes[mm].m_no_of_varsize > 0) { diff --git a/storage/ndb/src/kernel/blocks/lgman.cpp b/storage/ndb/src/kernel/blocks/lgman.cpp index 82fed94f62e..25cdac89737 100644 --- a/storage/ndb/src/kernel/blocks/lgman.cpp +++ b/storage/ndb/src/kernel/blocks/lgman.cpp @@ -436,7 +436,6 @@ Lgman::drop_filegroup_drop_files(Signal* signal, { jam(); ndbrequire(! (ptr.p->m_state & Logfile_group::LG_THREAD_MASK)); - ndbrequire(ptr.p->m_meta_files.isEmpty()); ndbrequire(ptr.p->m_outstanding_fs == 0); Local_undofile_list list(m_file_pool, ptr.p->m_files); @@ -452,6 +451,18 @@ Lgman::drop_filegroup_drop_files(Signal* signal, return; } + Local_undofile_list metalist(m_file_pool, ptr.p->m_meta_files); + if (metalist.first(file_ptr)) + { + jam(); + metalist.remove(file_ptr); + list.add(file_ptr); + file_ptr.p->m_create.m_senderRef = ref; + file_ptr.p->m_create.m_senderData = data; + create_file_abort(signal, ptr, file_ptr); + return; + } + free_logbuffer_memory(ptr); m_logfile_group_hash.release(ptr); DropFilegroupImplConf *conf = (DropFilegroupImplConf*)signal->getDataPtr(); @@ -462,7 +473,8 @@ Lgman::drop_filegroup_drop_files(Signal* signal, } void -Lgman::execCREATE_FILE_REQ(Signal* signal){ +Lgman::execCREATE_FILE_REQ(Signal* signal) +{ jamEntry(); CreateFileImplReq* req= (CreateFileImplReq*)signal->getDataPtr(); @@ -491,6 +503,7 @@ Lgman::execCREATE_FILE_REQ(Signal* signal){ switch(requestInfo){ case CreateFileImplReq::Commit: { + jam(); ndbrequire(find_file_by_id(file_ptr, ptr.p->m_meta_files, req->file_id)); file_ptr.p->m_create.m_senderRef = req->senderRef; file_ptr.p->m_create.m_senderData = req->senderData; @@ -503,6 +516,7 @@ Lgman::execCREATE_FILE_REQ(Signal* signal){ Uint32 senderData = req->senderData; if (find_file_by_id(file_ptr, ptr.p->m_meta_files, req->file_id)) { + jam(); file_ptr.p->m_create.m_senderRef = senderRef; file_ptr.p->m_create.m_senderData = senderData; create_file_abort(signal, ptr, file_ptr); @@ -510,11 +524,11 @@ Lgman::execCREATE_FILE_REQ(Signal* signal){ else { CreateFileImplConf* conf= (CreateFileImplConf*)signal->getDataPtr(); + jam(); conf->senderData = senderData; conf->senderRef = reference(); sendSignal(senderRef, GSN_CREATE_FILE_CONF, signal, CreateFileImplConf::SignalLength, JBB); - return; } return; } diff --git a/storage/ndb/src/kernel/blocks/pgman.cpp b/storage/ndb/src/kernel/blocks/pgman.cpp index 4e1d1c29ab8..57563d3c6d4 100644 --- a/storage/ndb/src/kernel/blocks/pgman.cpp +++ b/storage/ndb/src/kernel/blocks/pgman.cpp @@ -1559,6 +1559,7 @@ Pgman::execFSWRITEREF(Signal* signal) int Pgman::get_page(Signal* signal, Ptr<Page_entry> ptr, Page_request page_req) { + jamEntry(); #ifdef VM_TRACE Ptr<Page_request> tmp = { &page_req, RNIL}; debugOut << "PGMAN: >get_page" << endl; @@ -1706,6 +1707,7 @@ Pgman::get_page(Signal* signal, Ptr<Page_entry> ptr, Page_request page_req) void Pgman::update_lsn(Ptr<Page_entry> ptr, Uint32 block, Uint64 lsn) { + jamEntry(); #ifdef VM_TRACE const char* bname = getBlockName(block, "?"); debugOut << "PGMAN: >update_lsn: block=" << bname << " lsn=" << lsn << endl; diff --git a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp index 4b4fba01889..52045fd63cd 100644 --- a/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp +++ b/storage/ndb/src/kernel/blocks/qmgr/QmgrMain.cpp @@ -3052,7 +3052,7 @@ void Qmgr::failReportLab(Signal* signal, Uint16 aFailedNode, if (failedNodePtr.i == getOwnNodeId()) { jam(); - Uint32 code = 0; + Uint32 code = NDBD_EXIT_NODE_DECLARED_DEAD; const char * msg = 0; char extra[100]; switch(aFailCause){ diff --git a/storage/ndb/src/kernel/blocks/tsman.cpp b/storage/ndb/src/kernel/blocks/tsman.cpp index 62aa80a67fe..8f61ec0cf7b 100644 --- a/storage/ndb/src/kernel/blocks/tsman.cpp +++ b/storage/ndb/src/kernel/blocks/tsman.cpp @@ -1309,6 +1309,12 @@ Tsman::execDROP_FILE_REQ(Signal* signal) Local_datafile_list free(m_file_pool, fg_ptr.p->m_free_files); free.remove(file_ptr); } + else if(find_file_by_id(file_ptr, fg_ptr.p->m_meta_files, req.file_id)) + { + jam(); + Local_datafile_list meta(m_file_pool, fg_ptr.p->m_meta_files); + meta.remove(file_ptr); + } else { errorCode = DropFileImplRef::NoSuchFile; diff --git a/storage/ndb/src/kernel/error/ndbd_exit_codes.c b/storage/ndb/src/kernel/error/ndbd_exit_codes.c index 9987f9e0ecb..b36ea3af8ee 100644 --- a/storage/ndb/src/kernel/error/ndbd_exit_codes.c +++ b/storage/ndb/src/kernel/error/ndbd_exit_codes.c @@ -57,6 +57,8 @@ static const ErrStruct errArray[] = "error(s) on other node(s)"}, {NDBD_EXIT_PARTITIONED_SHUTDOWN, XAE, "Partitioned cluster detected. " "Please check if cluster is already running"}, + {NDBD_EXIT_NODE_DECLARED_DEAD, XAE, + "Node declared dead. See error log for details"}, {NDBD_EXIT_POINTER_NOTINRANGE, XIE, "Pointer too large"}, {NDBD_EXIT_SR_OTHERNODEFAILED, XRE, "Another node failed during system " "restart, please investigate error(s) on other node(s)"}, diff --git a/storage/ndb/test/ndbapi/testDict.cpp b/storage/ndb/test/ndbapi/testDict.cpp index 9828cb768df..13c071f968e 100644 --- a/storage/ndb/test/ndbapi/testDict.cpp +++ b/storage/ndb/test/ndbapi/testDict.cpp @@ -2204,6 +2204,159 @@ runBug21755(NDBT_Context* ctx, NDBT_Step* step) return NDBT_OK; } +static +int +create_tablespace(NdbDictionary::Dictionary* pDict, + const char * lgname, + const char * tsname, + const char * dfname) +{ + NdbDictionary::Tablespace ts; + ts.setName(tsname); + ts.setExtentSize(1024*1024); + ts.setDefaultLogfileGroup(lgname); + + if(pDict->createTablespace(ts) != 0) + { + g_err << "Failed to create tablespace:" + << endl << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + + NdbDictionary::Datafile df; + df.setPath(dfname); + df.setSize(1*1024*1024); + df.setTablespace(tsname); + + if(pDict->createDatafile(df) != 0) + { + g_err << "Failed to create datafile:" + << endl << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + return 0; +} + +int +runBug24631(NDBT_Context* ctx, NDBT_Step* step) +{ + char tsname[256]; + char dfname[256]; + char lgname[256]; + char ufname[256]; + NdbRestarter res; + + if (res.getNumDbNodes() < 2) + return NDBT_OK; + + Ndb* pNdb = GETNDB(step); + NdbDictionary::Dictionary* pDict = pNdb->getDictionary(); + + NdbDictionary::Dictionary::List list; + if (pDict->listObjects(list) == -1) + return NDBT_FAILED; + + const char * lgfound = 0; + + for (Uint32 i = 0; i<list.count; i++) + { + switch(list.elements[i].type){ + case NdbDictionary::Object::LogfileGroup: + lgfound = list.elements[i].name; + break; + default: + break; + } + if (lgfound) + break; + } + + if (lgfound == 0) + { + BaseString::snprintf(lgname, sizeof(lgname), "LG-%u", rand()); + NdbDictionary::LogfileGroup lg; + + lg.setName(lgname); + lg.setUndoBufferSize(8*1024*1024); + if(pDict->createLogfileGroup(lg) != 0) + { + g_err << "Failed to create logfilegroup:" + << endl << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + + NdbDictionary::Undofile uf; + BaseString::snprintf(ufname, sizeof(ufname), "%s-%u", lgname, rand()); + uf.setPath(ufname); + uf.setSize(2*1024*1024); + uf.setLogfileGroup(lgname); + + if(pDict->createUndofile(uf) != 0) + { + g_err << "Failed to create undofile:" + << endl << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + } + else + { + BaseString::snprintf(lgname, sizeof(lgname), "%s", lgfound); + } + + BaseString::snprintf(tsname, sizeof(tsname), "TS-%u", rand()); + BaseString::snprintf(dfname, sizeof(dfname), "%s-%u.dat", tsname, rand()); + + if (create_tablespace(pDict, lgname, tsname, dfname)) + return NDBT_FAILED; + + + int node = res.getRandomNotMasterNodeId(rand()); + res.restartOneDbNode(node, false, true, true); + NdbSleep_SecSleep(3); + + if (pDict->dropDatafile(pDict->getDatafile(0, dfname)) != 0) + { + g_err << "Failed to drop datafile: " << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + + if (pDict->dropTablespace(pDict->getTablespace(tsname)) != 0) + { + g_err << "Failed to drop tablespace: " << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + + if (res.waitNodesNoStart(&node, 1)) + return NDBT_FAILED; + + res.startNodes(&node, 1); + if (res.waitClusterStarted()) + return NDBT_FAILED; + + if (create_tablespace(pDict, lgname, tsname, dfname)) + return NDBT_FAILED; + + if (pDict->dropDatafile(pDict->getDatafile(0, dfname)) != 0) + { + g_err << "Failed to drop datafile: " << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + + if (pDict->dropTablespace(pDict->getTablespace(tsname)) != 0) + { + g_err << "Failed to drop tablespace: " << pDict->getNdbError() << endl; + return NDBT_FAILED; + } + + if (lgfound == 0) + { + if (pDict->dropLogfileGroup(pDict->getLogfileGroup(lgname)) != 0) + return NDBT_FAILED; + } + + return NDBT_OK; +} + struct RandSchemaOp { struct Obj @@ -2707,6 +2860,10 @@ TESTCASE("DictRestart", ""){ INITIALIZER(runDictRestart); } +TESTCASE("Bug24631", + ""){ + INITIALIZER(runBug24631); +} NDBT_TESTSUITE_END(testDict); int main(int argc, const char** argv){ diff --git a/storage/ndb/test/ndbapi/testNdbApi.cpp b/storage/ndb/test/ndbapi/testNdbApi.cpp index f731dc3601f..c05a2417bca 100644 --- a/storage/ndb/test/ndbapi/testNdbApi.cpp +++ b/storage/ndb/test/ndbapi/testNdbApi.cpp @@ -1588,6 +1588,36 @@ int runTestExecuteAsynch(NDBT_Context* ctx, NDBT_Step* step){ template class Vector<NdbScanOperation*>; +int +runBug28443(NDBT_Context* ctx, NDBT_Step* step) +{ + int result = NDBT_OK; + int records = ctx->getNumRecords(); + + NdbRestarter restarter; + + restarter.insertErrorInAllNodes(9003); + + for (Uint32 i = 0; i<ctx->getNumLoops(); i++) + { + HugoTransactions hugoTrans(*ctx->getTab()); + if (hugoTrans.loadTable(GETNDB(step), records, 2048) != 0) + { + result = NDBT_FAILED; + goto done; + } + if (runClearTable(ctx, step) != 0) + { + result = NDBT_FAILED; + goto done; + } + } + +done: + restarter.insertErrorInAllNodes(9003); + + return result; +} NDBT_TESTSUITE(testNdbApi); TESTCASE("MaxNdb", @@ -1689,6 +1719,10 @@ TESTCASE("ExecuteAsynch", "Check that executeAsync() works (BUG#27495)\n"){ INITIALIZER(runTestExecuteAsynch); } +TESTCASE("Bug28443", + ""){ + INITIALIZER(runBug28443); +} NDBT_TESTSUITE_END(testNdbApi); int main(int argc, const char** argv){ diff --git a/storage/ndb/test/run-test/daily-basic-tests.txt b/storage/ndb/test/run-test/daily-basic-tests.txt index e080536dad9..2cd3942bf07 100644 --- a/storage/ndb/test/run-test/daily-basic-tests.txt +++ b/storage/ndb/test/run-test/daily-basic-tests.txt @@ -619,6 +619,10 @@ max-time: 1500 cmd: testDict args: -l 25 -n DictRestart T1 +max-time: 500 +cmd: testDict +args: -n Bug24631 T1 + # # TEST NDBAPI # @@ -700,6 +704,10 @@ max-time: 500 cmd: testNdbApi args: -n ExecuteAsynch T1 +max-time: 1000 +cmd: testNdbApi +args: -n BugBug28443 + #max-time: 500 #cmd: testInterpreter #args: T1 |