From d67ce2a9fea5eace8c67df9a5c13c48feb022ded Mon Sep 17 00:00:00 2001
From: unknown <jonas@eel.(none)>
Date: Fri, 2 Sep 2005 11:47:24 +0200
Subject: [PATCH] ndb - bug #10987   make sure not to cut log to early  
 (specificly not use LCP with maxGciStarted that has not yet completed)

ndb/include/kernel/signaldata/SignalData.hpp:
  Add signal data printer for START_FRAG_REQ
ndb/include/kernel/signaldata/StartFragReq.hpp:
  Add signal data printer for START_FRAG_REQ
ndb/src/common/debugger/signaldata/SignalDataPrint.cpp:
  Add signal data printer for START_FRAG_REQ
ndb/src/common/debugger/signaldata/StartRec.cpp:
  Add signal data printer for START_FRAG_REQ
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp:
  Add maxGciStarted/Completed to event report
  bug: dont use LCP for calcKeepGci in maxGciSTarted is not completed
---
 ndb/include/kernel/signaldata/SignalData.hpp  |  1 +
 .../kernel/signaldata/StartFragReq.hpp        |  2 ++
 .../debugger/signaldata/SignalDataPrint.cpp   |  1 +
 .../common/debugger/signaldata/StartRec.cpp   | 25 +++++++++++++++++++
 ndb/src/kernel/blocks/dbdih/DbdihMain.cpp     | 12 ++++++---
 5 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/ndb/include/kernel/signaldata/SignalData.hpp b/ndb/include/kernel/signaldata/SignalData.hpp
index f9d3a6faa64..b0cfbc1540c 100644
--- a/ndb/include/kernel/signaldata/SignalData.hpp
+++ b/ndb/include/kernel/signaldata/SignalData.hpp
@@ -215,5 +215,6 @@ GSN_PRINT_SIGNATURE(printSCAN_FRAGREQ);
 
 GSN_PRINT_SIGNATURE(printCONTINUEB_NDBFS);
 GSN_PRINT_SIGNATURE(printCONTINUEB_DBDIH);
+GSN_PRINT_SIGNATURE(printSTART_FRAG_REQ);
 
 #endif
diff --git a/ndb/include/kernel/signaldata/StartFragReq.hpp b/ndb/include/kernel/signaldata/StartFragReq.hpp
index ec05c1ee366..ab17a147195 100644
--- a/ndb/include/kernel/signaldata/StartFragReq.hpp
+++ b/ndb/include/kernel/signaldata/StartFragReq.hpp
@@ -32,6 +32,8 @@ class StartFragReq {
 public:
   STATIC_CONST( SignalLength = 19 );
 
+  friend bool printSTART_FRAG_REQ(FILE *, const Uint32 *, Uint32, Uint16);
+  
 private:
   Uint32 userPtr;
   Uint32 userRef;
diff --git a/ndb/src/common/debugger/signaldata/SignalDataPrint.cpp b/ndb/src/common/debugger/signaldata/SignalDataPrint.cpp
index a4cee38e06f..bd1dff074f9 100644
--- a/ndb/src/common/debugger/signaldata/SignalDataPrint.cpp
+++ b/ndb/src/common/debugger/signaldata/SignalDataPrint.cpp
@@ -195,6 +195,7 @@ SignalDataPrintFunctions[] = {
   ,{ GSN_ACC_LOCKREQ, printACC_LOCKREQ }
   ,{ GSN_LQH_TRANSCONF, printLQH_TRANSCONF }
   ,{ GSN_SCAN_FRAGREQ, printSCAN_FRAGREQ }
+  ,{ GSN_START_FRAGREQ, printSTART_FRAG_REQ }
   ,{ 0, 0 }
 };
 
diff --git a/ndb/src/common/debugger/signaldata/StartRec.cpp b/ndb/src/common/debugger/signaldata/StartRec.cpp
index 482e3cb0728..54830e533c5 100644
--- a/ndb/src/common/debugger/signaldata/StartRec.cpp
+++ b/ndb/src/common/debugger/signaldata/StartRec.cpp
@@ -17,6 +17,7 @@
 
 #include <RefConvert.hpp>
 #include <signaldata/StartRec.hpp>
+#include <signaldata/StartFragReq.hpp>
 
 bool
 printSTART_REC_REQ(FILE * output, 
@@ -50,3 +51,27 @@ printSTART_REC_CONF(FILE * output,
 
   return true;
 }
+
+bool 
+printSTART_FRAG_REQ(FILE * output, 
+		    const Uint32 * theData, 
+		    Uint32 len, 
+		    Uint16 recBlockNo)
+{
+  StartFragReq* sig = (StartFragReq*)theData;
+
+  fprintf(output, " table: %d frag: %d lcpId: %d lcpNo: %d #nodes: %d \n",
+	  sig->tableId, sig->fragId, sig->lcpId, sig->lcpNo, 
+	  sig->noOfLogNodes);
+
+  for(Uint32 i = 0; i<sig->noOfLogNodes; i++)
+  {
+    fprintf(output, " (node: %d startGci: %d lastGci: %d)",
+	    sig->lqhLogNode[i],
+	    sig->startGci[i],
+	    sig->lastGci[i]);
+  }
+    
+  fprintf(output, "\n");
+  return true; 
+}
diff --git a/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp b/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
index 669be2b48f0..ca066b588e7 100644
--- a/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
+++ b/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
@@ -9640,6 +9640,9 @@ void Dbdih::execLCP_FRAG_REP(Signal* signal)
   }
 
   bool tableDone = reportLcpCompletion(lcpReport);
+  
+  Uint32 started = lcpReport->maxGciStarted;
+  Uint32 completed = lcpReport->maxGciCompleted;
 
   if(tableDone){
     jam();
@@ -9673,7 +9676,9 @@ void Dbdih::execLCP_FRAG_REP(Signal* signal)
   signal->theData[1] = nodeId;
   signal->theData[2] = tableId;
   signal->theData[3] = fragId;
-  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB);
+  signal->theData[4] = started;
+  signal->theData[5] = completed;
+  sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 6, JBB);
 #endif
   
   bool ok = false;
@@ -10790,7 +10795,9 @@ void Dbdih::findMinGci(ReplicaRecordPtr fmgReplicaPtr,
   lcpNo = fmgReplicaPtr.p->nextLcp;
   do {
     ndbrequire(lcpNo < MAX_LCP_STORED);
-    if (fmgReplicaPtr.p->lcpStatus[lcpNo] == ZVALID) {
+    if (fmgReplicaPtr.p->lcpStatus[lcpNo] == ZVALID &&
+	fmgReplicaPtr.p->maxGciStarted[lcpNo] <= coldgcp)
+    {
       jam();
       keepGci = fmgReplicaPtr.p->maxGciCompleted[lcpNo];
       oldestRestorableGci = fmgReplicaPtr.p->maxGciStarted[lcpNo];
@@ -10798,7 +10805,6 @@ void Dbdih::findMinGci(ReplicaRecordPtr fmgReplicaPtr,
       return;
     } else {
       jam();
-      ndbrequire(fmgReplicaPtr.p->lcpStatus[lcpNo] == ZINVALID);
       if (fmgReplicaPtr.p->createGci[0] == fmgReplicaPtr.p->initialGci) {
         jam();
 	/*-------------------------------------------------------------------
-- 
2.30.9