From 53f760a05d830c72b0dcc31c27365504d785e17f Mon Sep 17 00:00:00 2001 From: "stewart@mysql.com" <> Date: Wed, 14 Jun 2006 00:21:46 +1000 Subject: [PATCH] BUG#17928 testBackup fails in error handling testcases Reproduced failure of NFMaster on my laptop, this is the fix with some added debug information to help people in the future when they trigger asserts in AsyncFile (ndbfs helper threads). --- .../ndb/src/kernel/blocks/backup/Backup.cpp | 51 ++++++++++++------- .../ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp | 8 ++- 2 files changed, 41 insertions(+), 18 deletions(-) diff --git a/storage/ndb/src/kernel/blocks/backup/Backup.cpp b/storage/ndb/src/kernel/blocks/backup/Backup.cpp index 07df1db862b..e593b5ff044 100644 --- a/storage/ndb/src/kernel/blocks/backup/Backup.cpp +++ b/storage/ndb/src/kernel/blocks/backup/Backup.cpp @@ -3819,19 +3819,37 @@ Backup::checkFile(Signal* signal, BackupFilePtr filePtr) FsAppendReq::SignalLength, JBA); return; }//if - - filePtr.p->fileRunning = 0; - filePtr.p->fileClosing = 1; - - FsCloseReq * req = (FsCloseReq *)signal->getDataPtrSend(); - req->filePointer = filePtr.p->filePointer; - req->userPointer = filePtr.i; - req->userReference = reference(); - req->fileFlag = 0; + +#ifdef DEBUG_ABORT + Uint32 running= filePtr.p->fileRunning; + Uint32 closing= filePtr.p->fileClosing; +#endif + + if(!filePtr.p->fileClosing) + { + filePtr.p->fileRunning = 0; + filePtr.p->fileClosing = 1; + + FsCloseReq * req = (FsCloseReq *)signal->getDataPtrSend(); + req->filePointer = filePtr.p->filePointer; + req->userPointer = filePtr.i; + req->userReference = reference(); + req->fileFlag = 0; +#ifdef DEBUG_ABORT + ndbout_c("***** a FSCLOSEREQ filePtr.i = %u run=%d cl=%d", filePtr.i, + running, closing); +#endif + sendSignal(NDBFS_REF, GSN_FSCLOSEREQ, signal, FsCloseReq::SignalLength, JBA); + } + else + { #ifdef DEBUG_ABORT - ndbout_c("***** a FSCLOSEREQ filePtr.i = %u", filePtr.i); + ndbout_c("***** a NOT SENDING FSCLOSEREQ filePtr.i = %u run=%d cl=%d", + filePtr.i, + running, closing); #endif - sendSignal(NDBFS_REF, GSN_FSCLOSEREQ, signal, FsCloseReq::SignalLength, JBA); + + } } @@ -4082,9 +4100,7 @@ Backup::closeFiles(Signal* sig, BackupRecordPtr ptr) jam(); continue; }//if - - filePtr.p->fileClosing = 1; - + if(filePtr.p->fileRunning == 1){ jam(); #ifdef DEBUG_ABORT @@ -4093,7 +4109,10 @@ Backup::closeFiles(Signal* sig, BackupRecordPtr ptr) filePtr.p->operation.dataBuffer.eof(); } else { jam(); - + filePtr.p->fileClosing = 1; + filePtr.p->operation.dataBuffer.eof(); + checkFile(sig, filePtr); // make sure we write everything before closing + FsCloseReq * req = (FsCloseReq *)sig->getDataPtrSend(); req->filePointer = filePtr.p->filePointer; req->userPointer = filePtr.i; @@ -4555,7 +4574,6 @@ Backup::execLCP_PREPARE_REQ(Signal* signal) jam(); BackupFilePtr filePtr; c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr); - filePtr.p->fileClosing = 1; filePtr.p->operation.dataBuffer.eof(); } @@ -4647,7 +4665,6 @@ Backup::execEND_LCPREQ(Signal* signal) BackupFilePtr filePtr; c_backupFilePool.getPtr(filePtr, ptr.p->dataFilePtr); - filePtr.p->fileClosing = 1; filePtr.p->operation.dataBuffer.eof(); return; } diff --git a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp index b0a4d6264fb..a3b6104a059 100644 --- a/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp +++ b/storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp @@ -228,6 +228,7 @@ AsyncFile::run() endReq(); return; default: + DEBUG(ndbout_c("Invalid Request")); abort(); break; }//switch @@ -676,6 +677,7 @@ AsyncFile::extendfile(Request* request) { return 0; #else request = request; + DEBUG(ndbout_c("no pwrite")); abort(); return -1; #endif @@ -792,6 +794,7 @@ AsyncFile::writeBuffer(const char * buf, size_t size, off_t offset, bytes_written = return_value; if(bytes_written == 0){ + DEBUG(ndbout_c("no bytes written")); abort(); } @@ -830,8 +833,10 @@ AsyncFile::closeReq(Request * request) #else if (-1 == ::close(theFd)) { #ifndef DBUG_OFF - if (theFd == -1) + if (theFd == -1) { + DEBUG(ndbout_c("close on fd = -1")); abort(); + } #endif request->error = errno; } @@ -899,6 +904,7 @@ AsyncFile::appendReq(Request * request){ return; } if(n == 0){ + DEBUG(ndbout_c("append with n=0")); abort(); } size -= n;