From: Olav.Sandstaa Date: June 26 2009 11:13am Subject: bzr commit into mysql-6.0-falcon-team branch (Olav.Sandstaa:2748) Bug#43490 List-Archive: http://lists.mysql.com/commits/77310 X-Bug: 43490 Message-Id: <200906261114.n5QBE1ov000315@dm-uk-02.uk.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0540011695==" --===============0540011695== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/olav/mysql/develop/falcon-elog/ based on revid:john.embretsen@stripped 2748 Olav.Sandstaa@stripped 2009-06-26 Bug#43490 Falcon internal thread terminate after throwing an instance of 'SQLError' The thrown exception contains the error string "can't continue after fatal error ". This exception is only thrown by the Falcon IO system. It is thrown after a fatal IO error has occurred. Unfortunately it gives very little information about what the actual error was. This patch improves the logging of "fatal" IO errors by writing to the error log file information about the error when it occurs. With this patch a message similar to this example will be written when IO::declareFatalError() is called: Falcon: Fatal IO error occurred in "IO::writePages": file "/home/olav/mysql/develop/falcon-elog/mysql-test/var/mysqld.1/data/falcon_user.fts", page 21: No space left on device (28) Note that this patch does not fix the problem but only improves the logging when the actually error occurs, hopefully making it easier to find the real error. modified: storage/falcon/IO.cpp storage/falcon/IOx.h === modified file 'storage/falcon/IO.cpp' --- a/storage/falcon/IO.cpp 2009-04-07 20:16:05 +0000 +++ b/storage/falcon/IO.cpp 2009-06-26 11:13:44 +0000 @@ -109,6 +109,8 @@ static const int TRACE_SYNC_END = -2; static const uint16 NON_ZERO_CHECKSUM_MAGIC = 0xAFFE; +static const int NO_VALID_PAGE_NUMBER = -2; + #ifdef SIMULATE_DISK_FULL static int simulateDiskFull = SIMULATE_DISK_FULL; #endif @@ -289,7 +291,7 @@ void IO::readPage(Bdb * bdb) if (length != pageSize) { - declareFatalError(); + declareFatalError("IO::readPage", bdb->pageNumber, errno); if (length == -1) { throw SQLError(IO_ERROR, "read error on page %d of \"%s\": %s (%d)", @@ -390,7 +392,7 @@ void IO::writePages(int32 pageNumber, in if (errno == ENOSPC) throw SQLError(DEVICE_FULL, "device full error on %s, page %d\n", (const char*) fileName, pageNumber); - declareFatalError(); + declareFatalError("IO::writePages", pageNumber, errno); throw SQLError(IO_ERROR, "write error on page %d (%d/%d/%d) of \"%s\": %s (%d)", pageNumber, length, pageSize, fileId, @@ -452,9 +454,27 @@ void IO::longSeek(int64 offset) Error::error ("long seek failed on \"%s\"", (const char*) fileName); } -void IO::declareFatalError() +void IO::declareFatalError(const char *methodName, int pageNumber, int errorNumber) { + // Update status about that a fatal IO error has occured + fatalError = true; + + // Convert the page number to a string. Note that we use + // NO_VALID_PAGE_NUMBER to indicate that this error is not related + // to a specific page. + + char pageNumberStr[40]; + pageNumberStr[0] = 0; + + if (pageNumber != NO_VALID_PAGE_NUMBER) + { + sprintf(pageNumberStr, ", page %d", pageNumber); + } + + Log::fatal("Falcon: Fatal IO error occurred in \"%s\": file \"%s\"%s: %s (%d)\n", + methodName, (const char*) fileName, pageNumberStr, + strerror(errorNumber), errorNumber); } @@ -705,7 +725,7 @@ void IO::sync(void) #ifdef _WIN32 if (_commit(fileId)) { - declareFatalError(); + declareFatalError("IO::sync", NO_VALID_PAGE_NUMBER, errno); throw SQLError(IO_ERROR, "_commit failed on \"%s\": %s (%d)", (const char*) fileName, strerror (errno), errno); } === modified file 'storage/falcon/IOx.h' --- a/storage/falcon/IOx.h 2008-09-11 10:56:00 +0000 +++ b/storage/falcon/IOx.h 2009-06-26 11:13:44 +0000 @@ -56,7 +56,6 @@ public: void write(uint32 length, const UCHAR *data); static bool doesFileExist(const char *fileName); static int fileStat(const char *fileName, struct stat *stats = NULL, int *errnum = NULL); - void declareFatalError(); void seek (int pageNumber); void closeFile(); void readHeader (Hdr *header); @@ -88,6 +87,10 @@ public: static void deleteFile(const char* fileName); static int getWriteMode(int attempt); +private: + void declareFatalError(const char *methodName, int PageNumber, int errorNumber); + +public: JString fileName; SyncObject syncObject; int fileId; --===============0540011695== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/olav.sandstaa@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: olav.sandstaa@stripped # target_branch: file:///home/olav/mysql/develop/falcon-elog/ # testament_sha1: 5bab04ce95f439b24c12ebf0b6997d22803e0563 # timestamp: 2009-06-26 13:14:00 +0200 # base_revision_id: john.embretsen@stripped\ # xyeuhyhkmt8z7b03 # # Begin bundle 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 kinChIUb2YSQ --===============0540011695==--