Vlad,
Thanks for the updated patch. It looks very good.
Ok to push.
Olav
Vladislav Vaintroub wrote:
> #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
> };
>
>
>
>