summaryrefslogtreecommitdiff
path: root/storage
diff options
context:
space:
mode:
authorunknown <pekka@orca.ndb.mysql.com>2006-07-26 20:40:20 +0200
committerunknown <pekka@orca.ndb.mysql.com>2006-07-26 20:40:20 +0200
commita9f0f11671acfd6f31404ecc34b63177a93a1801 (patch)
treecea09c7f551b40d054e4c039bbfb459ad96fa329 /storage
parentbf1f1ea8d813057c786dbc7caa163ce75fd675e9 (diff)
parent743c4d99739b7c5097abe3757cd30ebc8b853b8a (diff)
downloadmariadb-git-a9f0f11671acfd6f31404ecc34b63177a93a1801.tar.gz
Merge orca.ndb.mysql.com:/space/pekka/ndb/version/my51
into orca.ndb.mysql.com:/space_old/pekka/ndb/version/my51-bug14935 storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp: Auto merged storage/ndb/src/kernel/blocks/ERROR_codes.txt: manual
Diffstat (limited to 'storage')
-rw-r--r--storage/ndb/src/kernel/blocks/ERROR_codes.txt5
-rw-r--r--storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp3
-rw-r--r--storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp13
-rw-r--r--storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp19
-rw-r--r--storage/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp14
5 files changed, 50 insertions, 4 deletions
diff --git a/storage/ndb/src/kernel/blocks/ERROR_codes.txt b/storage/ndb/src/kernel/blocks/ERROR_codes.txt
index 3c220912064..fc22118e113 100644
--- a/storage/ndb/src/kernel/blocks/ERROR_codes.txt
+++ b/storage/ndb/src/kernel/blocks/ERROR_codes.txt
@@ -2,7 +2,7 @@ Next QMGR 1
Next NDBCNTR 1000
Next NDBFS 2000
Next DBACC 3002
-Next DBTUP 4014
+Next DBTUP 4024
Next DBLQH 5043
Next DBDICT 6007
Next DBDIH 7177
@@ -486,3 +486,6 @@ Dbtup:
4019 - handleInsert - Alloc rowid error
4020 - handleInsert - Size change error
4021 - handleInsert - Out of disk space
+
+4022 - addTuxEntries - fail before add of first entry
+4023 - addTuxEntries - fail add of last entry (the entry for last index)
diff --git a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
index 3396ca1332f..e19e43f6d47 100644
--- a/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
+++ b/storage/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
@@ -254,6 +254,8 @@ inline const Uint32* ALIGN_WORD(const void* ptr)
#define ZSTORED_PROCEDURE_FREE 0xffff
#define ZMIN_PAGE_LIMIT_TUP_COMMITREQ 2
+#define ZSKIP_TUX_TRIGGERS 0x1 // flag for TUP_ABORTREQ
+
#endif
class Dbtup: public SimulatedBlock {
@@ -2155,6 +2157,7 @@ private:
//------------------------------------------------------------------
//------------------------------------------------------------------
void tupkeyErrorLab(Signal* signal);
+ void do_tup_abortreq(Signal*, Uint32 flags);
//------------------------------------------------------------------
//------------------------------------------------------------------
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp
index aa55985c1f2..16c51f7aa6e 100644
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupAbort.cpp
@@ -63,11 +63,16 @@ void Dbtup::freeAttrinbufrec(Uint32 anAttrBuf)
*/
void Dbtup::execTUP_ABORTREQ(Signal* signal)
{
+ ljamEntry();
+ do_tup_abortreq(signal, 0);
+}
+
+void Dbtup::do_tup_abortreq(Signal* signal, Uint32 flags)
+{
OperationrecPtr regOperPtr;
FragrecordPtr regFragPtr;
TablerecPtr regTabPtr;
- ljamEntry();
regOperPtr.i = signal->theData[0];
c_operation_pool.getPtr(regOperPtr);
TransState trans_state= get_trans_state(regOperPtr.p);
@@ -91,7 +96,8 @@ void Dbtup::execTUP_ABORTREQ(Signal* signal)
if (get_tuple_state(regOperPtr.p) == TUPLE_PREPARED)
{
ljam();
- if (!regTabPtr.p->tuxCustomTriggers.isEmpty())
+ if (!regTabPtr.p->tuxCustomTriggers.isEmpty() &&
+ (flags & ZSKIP_TUX_TRIGGERS) == 0)
executeTuxAbortTriggers(signal,
regOperPtr.p,
regFragPtr.p,
@@ -103,7 +109,8 @@ void Dbtup::execTUP_ABORTREQ(Signal* signal)
ljam();
c_operation_pool.getPtr(loopOpPtr);
if (get_tuple_state(loopOpPtr.p) != TUPLE_ALREADY_ABORTED &&
- !regTabPtr.p->tuxCustomTriggers.isEmpty()) {
+ !regTabPtr.p->tuxCustomTriggers.isEmpty() &&
+ (flags & ZSKIP_TUX_TRIGGERS) == 0) {
ljam();
executeTuxAbortTriggers(signal,
loopOpPtr.p,
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
index 3021799fd11..6cde3e51e5a 100644
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
@@ -747,6 +747,20 @@ void Dbtup::execTUPKEYREQ(Signal* signal)
regFragPtr,
regTabPtr) != 0) {
jam();
+ /*
+ * TUP insert succeeded but add of TUX entries failed. All
+ * TUX changes have been rolled back at this point.
+ *
+ * We will abort via tupkeyErrorLab() as usual. This routine
+ * however resets the operation to ZREAD. The TUP_ABORTREQ
+ * arriving later cannot then undo the insert.
+ *
+ * Therefore we call TUP_ABORTREQ already now. Diskdata etc
+ * should be in memory and timeslicing cannot occur. We must
+ * skip TUX abort triggers since TUX is already aborted.
+ */
+ signal->theData[0] = operPtr.i;
+ do_tup_abortreq(signal, ZSKIP_TUX_TRIGGERS);
tupkeyErrorLab(signal);
return;
}
@@ -775,6 +789,11 @@ void Dbtup::execTUPKEYREQ(Signal* signal)
regFragPtr,
regTabPtr) != 0) {
jam();
+ /*
+ * See insert case.
+ */
+ signal->theData[0] = operPtr.i;
+ do_tup_abortreq(signal, ZSKIP_TUX_TRIGGERS);
tupkeyErrorLab(signal);
return;
}
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
index 62cd1f06157..0e1b251d8a5 100644
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
@@ -1111,6 +1111,12 @@ Dbtup::addTuxEntries(Signal* signal,
Operationrec* regOperPtr,
Tablerec* regTabPtr)
{
+ if (ERROR_INSERTED(4022)) {
+ ljam();
+ CLEAR_ERROR_INSERT_VALUE;
+ terrorCode = 9999;
+ return -1;
+ }
TuxMaintReq* const req = (TuxMaintReq*)signal->getDataPtrSend();
const DLList<TupTriggerData>& triggerList = regTabPtr->tuxCustomTriggers;
TriggerPtr triggerPtr;
@@ -1120,6 +1126,14 @@ Dbtup::addTuxEntries(Signal* signal,
ljam();
req->indexId = triggerPtr.p->indexId;
req->errorCode = RNIL;
+ if (ERROR_INSERTED(4023) &&
+ ! triggerList.hasNext(triggerPtr)) {
+ ljam();
+ CLEAR_ERROR_INSERT_VALUE;
+ terrorCode = 9999;
+ failPtrI = triggerPtr.i;
+ goto fail;
+ }
EXECUTE_DIRECT(DBTUX, GSN_TUX_MAINT_REQ,
signal, TuxMaintReq::SignalLength);
ljamEntry();