Then it looks OK.
>-----Original Message-----
>From: Vladislav Vaintroub [mailto:vaintroub@stripped]
>Sent: Wednesday, June 25, 2008 4:28 PM
>To: 'Kevin Lewis'; 'Vladislav Vaintroub'; commits@stripped
>Subject: RE: bzr commit into mysql-6.0-falcon branch (vvaintroub:2715)
>WL#4172
>
>Kevin, file pointer can be past the file of file, it is not an error
>(neither on Windows, nor on Posix systems).
>I reset the position to so it has the same behavior as Posix ftruncate()
>implementation that does not modify the file offset.
>
>
>> -----Original Message-----
>> From: Kevin Lewis [mailto:klewis@stripped]
>> Sent: Wednesday, June 25, 2008 7:00 PM
>> To: 'Vladislav Vaintroub'; commits@stripped
>> Subject: RE: bzr commit into mysql-6.0-falcon branch (vvaintroub:2715)
>> WL#4172
>>
>> Vlad,
>>
>> I looked again at this code and agree with the changes you made. But
>> this
>> time, I noticed that the Windows implementation of truncate() will try
>> to
>> reset the current file pointer to where it was before the truncation,
>> even
>> if it is greater than falcon_serial_log_file_size.
>>
>> I could not find what would happen if SetFilePointerEx() is set to an
>> offset
>> passed the end of the file. Do you know? Will it return an error?
>>
>> Kevin
>>
>> >-----Original Message-----
>> >From: Vladislav Vaintroub [mailto:vvaintroub@stripped]
>> >Sent: Monday, June 23, 2008 5:23 AM
>> >To: commits@stripped
>> >Subject: bzr commit into mysql-6.0-falcon branch (vvaintroub:2715)
>> WL#4172
>> >
>> >#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
>> > };
>> >
>> >
>> >
>> >--
>> >MySQL Code Commits Mailing List
>> >For list archives: http://lists.mysql.com/commits
>> >To unsubscribe:
>> http://lists.mysql.com/commits?unsub=1