Commit 51679e5c authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-14132 InnoDB page corruption

On some old GNU/Linux systems, invoking posix_fallocate() with
offset=0 would sometimes cause already allocated bytes in the
data file to be overwritten.

Fix a correctness regression that was introduced in
commit 420798a8
by invoking posix_fallocate() in a safer way.
A similar change was made in MDEV-5746 earlier.

os_file_get_size(): Avoid changing the state of the file handle,
by invoking fstat() instead of lseek().

os_file_set_size(): Determine the current size of the file
by os_file_get_size(), and then extend the file from that point
onwards.
parent 30a8764b
...@@ -2335,8 +2335,8 @@ os_file_get_size( ...@@ -2335,8 +2335,8 @@ os_file_get_size(
return(offset); return(offset);
#else #else
return((os_offset_t) lseek(file, 0, SEEK_END)); struct stat statbuf;
return fstat(file, &statbuf) ? os_offset_t(-1) : statbuf.st_size;
#endif /* __WIN__ */ #endif /* __WIN__ */
} }
...@@ -2390,7 +2390,10 @@ os_file_set_size( ...@@ -2390,7 +2390,10 @@ os_file_set_size(
if (srv_use_posix_fallocate) { if (srv_use_posix_fallocate) {
int err; int err;
do { do {
err = posix_fallocate(file, 0, size); os_offset_t current_size = os_file_get_size(file);
err = current_size >= size
? 0 : posix_fallocate(file, current_size,
size - current_size);
} while (err == EINTR } while (err == EINTR
&& srv_shutdown_state == SRV_SHUTDOWN_NONE); && srv_shutdown_state == SRV_SHUTDOWN_NONE);
......
...@@ -2570,8 +2570,8 @@ os_file_get_size( ...@@ -2570,8 +2570,8 @@ os_file_get_size(
return(offset); return(offset);
#else #else
return((os_offset_t) lseek(file, 0, SEEK_END)); struct stat statbuf;
return fstat(file, &statbuf) ? os_offset_t(-1) : statbuf.st_size;
#endif /* __WIN__ */ #endif /* __WIN__ */
} }
...@@ -2625,7 +2625,10 @@ os_file_set_size( ...@@ -2625,7 +2625,10 @@ os_file_set_size(
if (srv_use_posix_fallocate) { if (srv_use_posix_fallocate) {
int err; int err;
do { do {
err = posix_fallocate(file, 0, size); os_offset_t current_size = os_file_get_size(file);
err = current_size >= size
? 0 : posix_fallocate(file, current_size,
size - current_size);
} while (err == EINTR } while (err == EINTR
&& srv_shutdown_state == SRV_SHUTDOWN_NONE); && srv_shutdown_state == SRV_SHUTDOWN_NONE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment