From: Date: June 23 2008 12:22pm Subject: bzr commit into mysql-6.0-falcon branch (vvaintroub:2715) WL#4172 List-Archive: http://lists.mysql.com/commits/48322 Message-Id: <200806231022.m5NAMojJ005852@u64> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit #At bzr+ssh://bk-internal.mysql.com/bzrroot/server/mysql-6.0-falcon/ 2715 Vladislav Vaintroub 2008-06-23 WL#4172 : Truncate Falcon Log Files Introduce a new parameter falcon_serial_log_file_size for maximum size of a serial log file before it gets truncated. During the log switch, check the file size. Truncate, if file is too big. modified: mysql-test/suite/falcon/r/falcon_options.result mysql-test/suite/falcon/r/falcon_options2.result storage/falcon/SerialLog.cpp storage/falcon/SerialLogFile.cpp storage/falcon/SerialLogFile.h storage/falcon/ha_falcon.cpp per-file messages: mysql-test/suite/falcon/r/falcon_options.result New parameter falcon_serial_log_file_size mysql-test/suite/falcon/r/falcon_options2.result New parameter falcon_serial_log_file_size storage/falcon/SerialLog.cpp During the log switch, check the file size. Truncate, if file is too big. storage/falcon/SerialLogFile.cpp New functions truncate() and size() storage/falcon/SerialLogFile.h New functions truncate() and size() storage/falcon/ha_falcon.cpp New parameter falcon_serial_log_file_size === modified file 'mysql-test/suite/falcon/r/falcon_options.result' --- a/mysql-test/suite/falcon/r/falcon_options.result 2008-03-11 16:15:47 +0000 +++ b/mysql-test/suite/falcon/r/falcon_options.result 2008-06-23 10:22:43 +0000 @@ -23,6 +23,7 @@ falcon_scavenge_schedule 15,45 * * * * * falcon_serial_log_block_size 0 falcon_serial_log_buffers 20 falcon_serial_log_dir +falcon_serial_log_file_size 10485760 falcon_serial_log_priority 1 falcon_support_xa OFF falcon_use_deferred_index_hash OFF @@ -111,6 +112,7 @@ FALCON_SCAVENGE_SCHEDULE 15,45 * * * * * FALCON_SERIAL_LOG_BLOCK_SIZE 0 FALCON_SERIAL_LOG_BUFFERS 20 FALCON_SERIAL_LOG_DIR +FALCON_SERIAL_LOG_FILE_SIZE 10485760 FALCON_SERIAL_LOG_PRIORITY 1 FALCON_SUPPORT_XA OFF FALCON_USE_DEFERRED_INDEX_HASH OFF === modified file 'mysql-test/suite/falcon/r/falcon_options2.result' --- a/mysql-test/suite/falcon/r/falcon_options2.result 2008-03-11 16:15:47 +0000 +++ b/mysql-test/suite/falcon/r/falcon_options2.result 2008-06-23 10:22:43 +0000 @@ -24,6 +24,7 @@ FALCON_SCAVENGE_SCHEDULE 15,45 * * * * * FALCON_SERIAL_LOG_BLOCK_SIZE 0 FALCON_SERIAL_LOG_BUFFERS 20 FALCON_SERIAL_LOG_DIR +FALCON_SERIAL_LOG_FILE_SIZE 10485760 FALCON_SERIAL_LOG_PRIORITY 1 FALCON_SUPPORT_XA OFF FALCON_USE_DEFERRED_INDEX_HASH OFF === modified file 'storage/falcon/SerialLog.cpp' --- a/storage/falcon/SerialLog.cpp 2008-04-12 02:22:50 +0000 +++ b/storage/falcon/SerialLog.cpp 2008-06-23 10:22:43 +0000 @@ -53,6 +53,7 @@ static const char THIS_FILE[]=__FILE__; static const int TRACE_PAGE = 0; extern uint falcon_gopher_threads; +extern uint64 falcon_serial_log_file_size; //static const int windowBuffers = 10; static bool debug; @@ -597,8 +598,19 @@ void SerialLog::createNewWindow(void) break; } - if (fileOffset == 0 && Log::isActive(LogInfo)) - Log::log(LogInfo, "%d: Switching log files (%d used)\n", database->deltaTime, file->highWater); + if (fileOffset == 0) + { + // Logfile switch, truncate file if required + + if (Log::isActive(LogInfo)) + Log::log(LogInfo, "%d: Switching log files (%d used)\n", + database->deltaTime, file->highWater); + + if((uint64)file->size() > falcon_serial_log_file_size) + file->truncate((int64)falcon_serial_log_file_size); + } + + writeWindow->deactivateWindow(); writeWindow = allocWindow(file, fileOffset); === modified file 'storage/falcon/SerialLogFile.cpp' --- a/storage/falcon/SerialLogFile.cpp 2008-05-09 20:14:24 +0000 +++ b/storage/falcon/SerialLogFile.cpp 2008-06-23 10:22:43 +0000 @@ -305,6 +305,57 @@ uint32 SerialLogFile::read(int64 positio #endif } +void SerialLogFile::truncate(int64 size) +{ +#ifdef _WIN32 + LARGE_INTEGER oldPos, distance; + distance.QuadPart = 0; + + // Get current position in file + if (!SetFilePointerEx(handle, distance ,&oldPos,FILE_CURRENT)) + throw SQLError(IO_ERROR, "SetFilePointerEx failed with %d", + GetLastError()); + + // Position to the new end of file , set EOF marker there + distance.QuadPart = size; + if (!SetFilePointerEx(handle, distance, 0, FILE_BEGIN)) + throw SQLError(IO_ERROR, "SetFilePointerEx failed with %d", + GetLastError()); + + if (!SetEndOfFile(handle)) + throw SQLError(IO_ERROR, "SetEndOfFile failed with %d", + GetLastError()); + + + // Restore file pointer + if (!SetFilePointerEx(handle, oldPos ,0,FILE_BEGIN)) + throw SQLError(IO_ERROR, "SetFilePointerEx failed with %d", + GetLastError()); +#else + if (ftruncate(handle, size)) + throw SQLError(IO_ERROR, "ftruncate failed with %d", + errno); +#endif +} + +int64 SerialLogFile::size(void) +{ +#ifdef _WIN32 + LARGE_INTEGER size; + + if (!GetFileSizeEx(handle, &size)) + throw SQLError(IO_ERROR, "GetFileSizeEx failed with %u", + GetLastError()); + + return size.QuadPart; +#else + struct stat buf; + if (fstat(handle, &buf)) + throw SQLError(IO_ERROR, "stat failed with %d", + errno); + return buf.st_size; +#endif +} void SerialLogFile::zap() { === modified file 'storage/falcon/SerialLogFile.h' --- a/storage/falcon/SerialLogFile.h 2008-03-11 16:15:47 +0000 +++ b/storage/falcon/SerialLogFile.h 2008-06-23 10:22:43 +0000 @@ -38,6 +38,8 @@ public: void write(int64 position, uint32 length, const SerialLogBlock *data); void close(); void open (JString filename, bool creat); + void truncate(int64 size); + int64 size(void); SerialLogFile(Database *db); virtual ~SerialLogFile(); === modified file 'storage/falcon/ha_falcon.cpp' --- a/storage/falcon/ha_falcon.cpp 2008-06-19 12:39:21 +0000 +++ b/storage/falcon/ha_falcon.cpp 2008-06-23 10:22:43 +0000 @@ -80,6 +80,7 @@ static StorageHandler *storageHandler; ulonglong falcon_record_memory_max; ulonglong falcon_initial_allocation; +ulonglong falcon_serial_log_file_size; uint falcon_allocation_extent; ulonglong falcon_page_cache_size; char* falcon_serial_log_dir; @@ -3510,6 +3511,11 @@ static MYSQL_SYSVAR_ULONGLONG(initial_al "Initial allocation (in bytes) of falcon user tablespace.", NULL, NULL, 0, 0, LL(4000000000), LL(1)<<20); +static MYSQL_SYSVAR_ULONGLONG(serial_log_file_size, falcon_serial_log_file_size, + PLUGIN_VAR_RQCMDARG, + "If serial log file grows larger than this value, it will be truncated when it is reused", + NULL, NULL , LL(10)<<20, LL(1)<<20,LL(0x7fffffffffffffff), LL(1)<<20); + /*** static MYSQL_SYSVAR_UINT(allocation_extent, falcon_allocation_extent, PLUGIN_VAR_OPCMDARG | PLUGIN_VAR_READONLY, @@ -3557,6 +3563,7 @@ static struct st_mysql_sys_var* falconVa //MYSQL_SYSVAR(allocation_extent), MYSQL_SYSVAR(page_cache_size), MYSQL_SYSVAR(consistent_read), + MYSQL_SYSVAR(serial_log_file_size), NULL };