summaryrefslogtreecommitdiff
path: root/ndb/src/kernel/blocks/dbtup
diff options
context:
space:
mode:
authorunknown <pekka@mysql.com>2005-04-23 17:55:21 +0200
committerunknown <pekka@mysql.com>2005-04-23 17:55:21 +0200
commit49fa63df903aec0aa10b2219618ad1c60b1959ca (patch)
tree1a55eec21fda0dc253e85866c82e0b2433e5aca9 /ndb/src/kernel/blocks/dbtup
parentf5c3843c377db422b6cf597ba7be25719b78b855 (diff)
parentffb64880b7b5381d29341ec7d5cb07da2e81b77f (diff)
downloadmariadb-git-49fa63df903aec0aa10b2219618ad1c60b1959ca.tar.gz
Merge
ndb/include/kernel/signaldata/TuxMaint.hpp: Auto merged ndb/src/kernel/blocks/dbtup/Dbtup.hpp: Auto merged ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp: Auto merged ndb/src/kernel/blocks/dbtux/DbtuxNode.cpp: Auto merged ndb/src/ndbapi/ndberror.c: merge from 4.1 ndb/test/ndbapi/testOIBasic.cpp: merge from 4.1
Diffstat (limited to 'ndb/src/kernel/blocks/dbtup')
-rw-r--r--ndb/src/kernel/blocks/dbtup/Dbtup.hpp8
-rw-r--r--ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp80
-rw-r--r--ndb/src/kernel/blocks/dbtup/Notes.txt25
3 files changed, 69 insertions, 44 deletions
diff --git a/ndb/src/kernel/blocks/dbtup/Dbtup.hpp b/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
index 6d169d20d16..a0103f56add 100644
--- a/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
+++ b/ndb/src/kernel/blocks/dbtup/Dbtup.hpp
@@ -1779,6 +1779,10 @@ private:
Operationrec* const regOperPtr,
Tablerec* const regTabPtr);
+ int addTuxEntries(Signal* signal,
+ Operationrec* regOperPtr,
+ Tablerec* regTabPtr);
+
// these crash the node on error
void executeTuxCommitTriggers(Signal* signal,
@@ -1789,6 +1793,10 @@ private:
Operationrec* regOperPtr,
Tablerec* const regTabPtr);
+ void removeTuxEntries(Signal* signal,
+ Operationrec* regOperPtr,
+ Tablerec* regTabPtr);
+
// *****************************************************************
// Error Handling routines.
// *****************************************************************
diff --git a/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp b/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
index 476a4b5724b..2b65a8402c2 100644
--- a/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
+++ b/ndb/src/kernel/blocks/dbtup/DbtupTrigger.cpp
@@ -973,25 +973,7 @@ Dbtup::executeTuxInsertTriggers(Signal* signal,
req->pageOffset = regOperPtr->pageOffset;
req->tupVersion = tupVersion;
req->opInfo = TuxMaintReq::OpAdd;
- // loop over index list
- const ArrayList<TupTriggerData>& triggerList = regTabPtr->tuxCustomTriggers;
- TriggerPtr triggerPtr;
- triggerList.first(triggerPtr);
- while (triggerPtr.i != RNIL) {
- ljam();
- req->indexId = triggerPtr.p->indexId;
- req->errorCode = RNIL;
- EXECUTE_DIRECT(DBTUX, GSN_TUX_MAINT_REQ,
- signal, TuxMaintReq::SignalLength);
- ljamEntry();
- if (req->errorCode != 0) {
- ljam();
- terrorCode = req->errorCode;
- return -1;
- }
- triggerList.next(triggerPtr);
- }
- return 0;
+ return addTuxEntries(signal, regOperPtr, regTabPtr);
}
int
@@ -1012,9 +994,18 @@ Dbtup::executeTuxUpdateTriggers(Signal* signal,
req->pageOffset = regOperPtr->pageOffset;
req->tupVersion = tupVersion;
req->opInfo = TuxMaintReq::OpAdd;
- // loop over index list
+ return addTuxEntries(signal, regOperPtr, regTabPtr);
+}
+
+int
+Dbtup::addTuxEntries(Signal* signal,
+ Operationrec* regOperPtr,
+ Tablerec* regTabPtr)
+{
+ TuxMaintReq* const req = (TuxMaintReq*)signal->getDataPtrSend();
const ArrayList<TupTriggerData>& triggerList = regTabPtr->tuxCustomTriggers;
TriggerPtr triggerPtr;
+ Uint32 failPtrI;
triggerList.first(triggerPtr);
while (triggerPtr.i != RNIL) {
ljam();
@@ -1026,11 +1017,29 @@ Dbtup::executeTuxUpdateTriggers(Signal* signal,
if (req->errorCode != 0) {
ljam();
terrorCode = req->errorCode;
- return -1;
+ failPtrI = triggerPtr.i;
+ goto fail;
}
triggerList.next(triggerPtr);
}
return 0;
+fail:
+ req->opInfo = TuxMaintReq::OpRemove;
+ triggerList.first(triggerPtr);
+ while (triggerPtr.i != failPtrI) {
+ ljam();
+ req->indexId = triggerPtr.p->indexId;
+ req->errorCode = RNIL;
+ EXECUTE_DIRECT(DBTUX, GSN_TUX_MAINT_REQ,
+ signal, TuxMaintReq::SignalLength);
+ ljamEntry();
+ ndbrequire(req->errorCode == 0);
+ triggerList.next(triggerPtr);
+ }
+#ifdef VM_TRACE
+ ndbout << "aborted partial tux update: op " << hex << regOperPtr << endl;
+#endif
+ return -1;
}
int
@@ -1049,7 +1058,6 @@ Dbtup::executeTuxCommitTriggers(Signal* signal,
{
TuxMaintReq* const req = (TuxMaintReq*)signal->getDataPtrSend();
// get version
- // XXX could add prevTupVersion to Operationrec
Uint32 tupVersion;
if (regOperPtr->optype == ZINSERT) {
if (! regOperPtr->deleteInsertFlag)
@@ -1087,21 +1095,7 @@ Dbtup::executeTuxCommitTriggers(Signal* signal,
req->pageOffset = regOperPtr->pageOffset;
req->tupVersion = tupVersion;
req->opInfo = TuxMaintReq::OpRemove;
- // loop over index list
- const ArrayList<TupTriggerData>& triggerList = regTabPtr->tuxCustomTriggers;
- TriggerPtr triggerPtr;
- triggerList.first(triggerPtr);
- while (triggerPtr.i != RNIL) {
- ljam();
- req->indexId = triggerPtr.p->indexId;
- req->errorCode = RNIL;
- EXECUTE_DIRECT(DBTUX, GSN_TUX_MAINT_REQ,
- signal, TuxMaintReq::SignalLength);
- ljamEntry();
- // commit must succeed
- ndbrequire(req->errorCode == 0);
- triggerList.next(triggerPtr);
- }
+ removeTuxEntries(signal, regOperPtr, regTabPtr);
}
void
@@ -1132,7 +1126,15 @@ Dbtup::executeTuxAbortTriggers(Signal* signal,
req->pageOffset = regOperPtr->pageOffset;
req->tupVersion = tupVersion;
req->opInfo = TuxMaintReq::OpRemove;
- // loop over index list
+ removeTuxEntries(signal, regOperPtr, regTabPtr);
+}
+
+void
+Dbtup::removeTuxEntries(Signal* signal,
+ Operationrec* regOperPtr,
+ Tablerec* regTabPtr)
+{
+ TuxMaintReq* const req = (TuxMaintReq*)signal->getDataPtrSend();
const ArrayList<TupTriggerData>& triggerList = regTabPtr->tuxCustomTriggers;
TriggerPtr triggerPtr;
triggerList.first(triggerPtr);
@@ -1143,7 +1145,7 @@ Dbtup::executeTuxAbortTriggers(Signal* signal,
EXECUTE_DIRECT(DBTUX, GSN_TUX_MAINT_REQ,
signal, TuxMaintReq::SignalLength);
ljamEntry();
- // abort must succeed
+ // must succeed
ndbrequire(req->errorCode == 0);
triggerList.next(triggerPtr);
}
diff --git a/ndb/src/kernel/blocks/dbtup/Notes.txt b/ndb/src/kernel/blocks/dbtup/Notes.txt
index 9d47c591fe8..c2973bb0a76 100644
--- a/ndb/src/kernel/blocks/dbtup/Notes.txt
+++ b/ndb/src/kernel/blocks/dbtup/Notes.txt
@@ -135,6 +135,24 @@ abort DELETE none -
1) alternatively, store prevTupVersion in operation record.
+Abort from ordered index error
+------------------------------
+
+Obviously, index update failure causes operation failure.
+The operation is then aborted later by TC.
+
+The problem here is with multiple indexes. Some may have been
+updated successfully before the one that failed. Therefore
+the trigger code aborts the successful ones already in
+the prepare phase.
+
+In other words, multiple indexes are treated as one.
+
+Abort from any cause
+--------------------
+
+[ hairy stuff ]
+
Read attributes, query status
-----------------------------
@@ -170,14 +188,11 @@ used to decide if the scan can see the tuple.
This signal may also be called during any phase since commit/abort
of all operations is not done in one time-slice.
-Commit and abort
-----------------
-
-[ hairy stuff ]
-
Problems
--------
Current abort code can destroy a tuple version too early. This
happens in test case "ticuur" (insert-commit-update-update-rollback),
if abort of first update arrives before abort of second update.
+
+vim: set textwidth=68: