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