diff options
-rw-r--r-- | innobase/configure.in | 2 | ||||
-rw-r--r-- | innobase/os/os0file.c | 25 | ||||
-rw-r--r-- | innobase/os/os0thread.c | 20 |
3 files changed, 47 insertions, 0 deletions
diff --git a/innobase/configure.in b/innobase/configure.in index e4e5d839246..51782579720 100644 --- a/innobase/configure.in +++ b/innobase/configure.in @@ -89,6 +89,8 @@ case "$target_os" in CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE -DUNIV_HPUX -DUNIV_HPUX10";; hp*) CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE -DUNIV_HPUX";; + aix*) + CFLAGS="$CFLAGS -DUNIV_AIX";; irix*) CFLAGS="$CFLAGS -DUNIV_MUST_NOT_INLINE";; osf*) diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 10bb9bb66d7..c37b0585dd3 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -11,6 +11,7 @@ Created 10/21/1995 Heikki Tuuri #include "ut0mem.h" #include "srv0srv.h" #include "fil0fil.h" +#include "buf0buf.h" #undef HAVE_FDATASYNC @@ -2108,6 +2109,7 @@ os_aio_simulated_handle( ibool ret; ulint n; ulint i; + ulint len2; segment = os_aio_get_array_and_local_segment(&array, global_segment); @@ -2263,6 +2265,29 @@ consecutive_loop: /* Do the i/o with ordinary, synchronous i/o functions: */ if (slot->type == OS_FILE_WRITE) { + if (array == os_aio_write_array) { + + /* Do a 'last millisecond' check that the page end + is sensible; reported page checksum errors from + Linux seem to wipe over the page end */ + + for (len2 = 0; len2 + UNIV_PAGE_SIZE <= total_len; + len2 += UNIV_PAGE_SIZE) { + if (mach_read_from_4(combined_buf + len2 + + FIL_PAGE_LSN + 4) + != mach_read_from_4(combined_buf + len2 + + UNIV_PAGE_SIZE + - FIL_PAGE_END_LSN + 4)) { + ut_print_timestamp(stderr); + fprintf(stderr, +" InnoDB: ERROR: The page to be written seems corrupt!\n"); + page_print(combined_buf + len2); + fprintf(stderr, +"InnoDB: ERROR: The page to be written seems corrupt!\n"); + } + } + } + ret = os_file_write(slot->name, slot->file, combined_buf, slot->offset, slot->offset_high, total_len); } else { diff --git a/innobase/os/os0thread.c b/innobase/os/os0thread.c index d137014a6af..ad6b66a1dc2 100644 --- a/innobase/os/os0thread.c +++ b/innobase/os/os0thread.c @@ -128,8 +128,28 @@ os_thread_create( pthread_attr_init(&attr); +#ifdef UNIV_AIX + /* We must make sure a thread stack is at least 32 kB, otherwise + InnoDB might crash; we do not know if the default stack size on + AIX is always big enough. An empirical test on AIX-4.3 suggested + the size was 96 kB, though. */ + + ret = pthread_attr_setstacksize(&attr, + (size_t)(PTHREAD_STACK_MIN + 32 * 1024)); + if (ret) { + fprintf(stderr, + "InnoDB: Error: pthread_attr_setstacksize returned %d\n", ret); + exit(1); + } +#endif ret = pthread_create(&pthread, &attr, start_f, arg); + if (ret) { + fprintf(stderr, + "InnoDB: Error: pthread_create returned %d\n", ret); + exit(1); + } + pthread_attr_destroy(&attr); if (srv_set_thread_priorities) { |