summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2003-11-02 15:55:02 +0200
committerunknown <monty@mysql.com>2003-11-02 15:55:02 +0200
commitc97a38c4d3b2afd4c93771fca61eede965fe71cf (patch)
treecb9bb7181d68f8c4f3d892367e08536d2f609a19
parent116cf0102464ce330a758fa3bec2239bfc5872d5 (diff)
downloadmariadb-git-c97a38c4d3b2afd4c93771fca61eede965fe71cf.tar.gz
Call my_sync() after all data is written to .frm file
Added my_sync() to mysys which will do fsync/fdatasync/_commit() on a file. VC++Files/mysys/mysys.dsp: Added my_sync.c configure.in: Added testing of fsync and fdatasync include/my_sys.h: Added my_sync() include/mysys_err.h: Added my_sync() isam/extra.c: Added my_sync() myisam/mi_extra.c: Added my_sync() myisam/mi_locking.c: Added my_sync() mysql-test/mysql-test-run.sh: Added option --valgrind-all mysys/Makefile.am: Added my_sync.c mysys/errors.c: Added my_sync() mysys/my_symlink.c: Removed compiler warning mysys/thr_alarm.c: Fix for link error on windows sql/unireg.cc: Call my_sync() after all data is written to .frm file BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
-rw-r--r--BitKeeper/etc/logging_ok1
-rw-r--r--VC++Files/mysys/mysys.dsp4
-rw-r--r--configure.in2
-rw-r--r--include/my_sys.h1
-rw-r--r--include/mysys_err.h3
-rw-r--r--isam/extra.c10
-rw-r--r--myisam/mi_extra.c20
-rw-r--r--myisam/mi_locking.c20
-rw-r--r--mysql-test/mysql-test-run.sh3
-rw-r--r--mysys/Makefile.am2
-rw-r--r--mysys/errors.c8
-rw-r--r--mysys/my_symlink.c3
-rw-r--r--mysys/my_sync.c60
-rw-r--r--mysys/thr_alarm.c7
-rw-r--r--sql/unireg.cc9
15 files changed, 105 insertions, 48 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index afb9c5cff5c..f642821747f 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -66,6 +66,7 @@ monty@hundin.mysql.fi
monty@mashka.(none)
monty@mashka.mysql.fi
monty@mishka.mysql.fi
+monty@mysql.com
monty@narttu.
monty@narttu.mysql.fi
monty@rescue.
diff --git a/VC++Files/mysys/mysys.dsp b/VC++Files/mysys/mysys.dsp
index 695e2cb2638..b410d0a7465 100644
--- a/VC++Files/mysys/mysys.dsp
+++ b/VC++Files/mysys/mysys.dsp
@@ -426,6 +426,10 @@ SOURCE=.\my_symlink2.c
# End Source File
# Begin Source File
+SOURCE=.\my_sync.c
+# End Source File
+# Begin Source File
+
SOURCE=.\my_tempnam.c
# End Source File
# Begin Source File
diff --git a/configure.in b/configure.in
index 02825ce1424..a4fe75ce896 100644
--- a/configure.in
+++ b/configure.in
@@ -1817,7 +1817,7 @@ AC_CHECK_FUNCS(alarm bmove \
pthread_attr_create pthread_getsequence_np pthread_attr_setstacksize \
pthread_attr_getstacksize \
pthread_condattr_create rwlock_init pthread_rwlock_rdlock \
- fchmod getpass getpassphrase initgroups mlockall)
+ fsync fdatasync fchmod getpass getpassphrase initgroups mlockall)
CFLAGS="$ORG_CFLAGS"
diff --git a/include/my_sys.h b/include/my_sys.h
index 7a3d22f3304..df8b9759e5d 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -566,6 +566,7 @@ extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
extern int my_fclose(FILE *fd,myf MyFlags);
extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
+extern int my_sync(File fd, myf my_flags);
extern int my_error _VARARGS((int nr,myf MyFlags, ...));
extern int my_printf_error _VARARGS((uint my_err, const char *format,
myf MyFlags, ...)
diff --git a/include/mysys_err.h b/include/mysys_err.h
index a86765c74fd..0ee89e91ee4 100644
--- a/include/mysys_err.h
+++ b/include/mysys_err.h
@@ -21,7 +21,7 @@ extern "C" {
#endif
#define GLOB 0 /* Error maps */
-#define GLOBERRS 27 /* Max number of error messages in map's */
+#define GLOBERRS 28 /* Max number of error messages in map's */
#define EE(X) globerrs[ X ] /* Defines to add error to right map */
extern const char * NEAR globerrs[]; /* my_error_messages is here */
@@ -53,6 +53,7 @@ extern const char * NEAR globerrs[]; /* my_error_messages is here */
#define EE_CANT_READLINK 24
#define EE_CANT_SYMLINK 25
#define EE_REALPATH 26
+#define EE_SYNC 27
/* exit codes for all MySQL programs */
diff --git a/isam/extra.c b/isam/extra.c
index e2f13532ddf..3bf1dd012ed 100644
--- a/isam/extra.c
+++ b/isam/extra.c
@@ -250,17 +250,15 @@ int nisam_extra(N_INFO *info, enum ha_extra_function function)
pthread_mutex_unlock(&THR_LOCK_isam);
break;
case HA_EXTRA_FLUSH:
-#ifdef __WIN__
if (info->s->not_flushed)
{
info->s->not_flushed=0;
- if (_commit(info->s->kfile))
- error=errno;
- if (_commit(info->dfile))
- error=errno;
+ if (my_sync(info->s->kfile, MYF(0)))
+ error= my_errno;
+ if (my_sync(info->dfile, MYF(0)))
+ error= my_errno;
}
break;
-#endif
case HA_EXTRA_NORMAL: /* Theese isn't in use */
case HA_EXTRA_QUICK:
case HA_EXTRA_KEY_CACHE:
diff --git a/myisam/mi_extra.c b/myisam/mi_extra.c
index ef82a6ef61f..1d45fd300e7 100644
--- a/myisam/mi_extra.c
+++ b/myisam/mi_extra.c
@@ -336,22 +336,10 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
if (share->not_flushed)
{
share->not_flushed=0;
-#if defined(__WIN__)
- if (_commit(share->kfile))
- error=errno;
- if (_commit(info->dfile))
- error=errno;
-#elif defined(HAVE_FDATASYNC)
- if (fdatasync(share->kfile))
- error=errno;
- if (fdatasync(share->dfile))
- error=errno;
-#elif defined(HAVE_FSYNC)
- if ( fsync(share->kfile))
- error=errno;
- if (fsync(share->dfile))
- error=errno;
-#endif
+ if (my_sync(share->kfile, MYF(0)))
+ error= my_errno;
+ if (my_sync(info->dfile, MYF(0)))
+ error= my_errno;
if (error)
{
share->changed=1;
diff --git a/myisam/mi_locking.c b/myisam/mi_locking.c
index a707eb294a9..f3bfa8deb90 100644
--- a/myisam/mi_locking.c
+++ b/myisam/mi_locking.c
@@ -88,22 +88,10 @@ int mi_lock_database(MI_INFO *info, int lock_type)
share->changed=0;
if (myisam_flush)
{
-#if defined(__WIN__)
- if (_commit(share->kfile))
- error=errno;
- if (_commit(info->dfile))
- error=errno;
-#elif defined(HAVE_FDATASYNC)
- if (fdatasync(share->kfile))
- error=errno;
- if (fdatasync(share->dfile))
- error=errno;
-#elif defined(HAVE_FSYNC)
- if (fsync(share->kfile))
- error=errno;
- if (fsync(share->dfile))
- error=errno;
-#endif
+ if (my_sync(share->kfile, MYF(0)))
+ error= my_errno;
+ if (my_sync(info->dfile, MYF(0)))
+ error= my_errno;
}
else
share->not_flushed=1;
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index cd409e1ace5..a298701dc7f 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -353,6 +353,9 @@ while test $# -gt 0; do
TMP=`$ECHO "$1" | $SED -e "s;--valgrind-options=;;"`
VALGRIND="$VALGRIND $TMP"
;;
+ --valgrind-all)
+ VALGRIND="$VALGRIND -v --show-reachable=yes"
+ ;;
--skip-*)
EXTRA_MASTER_MYSQLD_OPT="$EXTRA_MASTER_MYSQLD_OPT $1"
EXTRA_SLAVE_MYSQLD_OPT="$EXTRA_SLAVE_MYSQLD_OPT $1"
diff --git a/mysys/Makefile.am b/mysys/Makefile.am
index a927fa5e3a0..5dc54817fd7 100644
--- a/mysys/Makefile.am
+++ b/mysys/Makefile.am
@@ -47,7 +47,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
my_delete.c my_rename.c my_redel.c my_tempnam.c \
my_chsize.c my_lread.c my_lwrite.c my_clock.c \
my_quick.c my_lockmem.c my_static.c \
- my_getopt.c my_mkdir.c \
+ my_sync.c my_getopt.c my_mkdir.c \
default.c my_compress.c checksum.c raid.cc \
my_net.c my_semaphore.c my_port.c my_sleep.c \
my_vsnprintf.c charset.c my_bitmap.c my_bit.c md5.c \
diff --git a/mysys/errors.c b/mysys/errors.c
index 8a120e0e869..7d755718b16 100644
--- a/mysys/errors.c
+++ b/mysys/errors.c
@@ -48,6 +48,7 @@ const char * NEAR globerrs[GLOBERRS]=
"Can't read value for symlink '%s' (Error %d)",
"Can't create symlink '%s' pointing at '%s' (Error %d)",
"Error on realpath() on '%s' (Error %d)",
+ "Can't sync file '%s' to disk (Errcode: %d)",
};
void init_glob_errs(void)
@@ -84,8 +85,9 @@ void init_glob_errs()
EE(EE_CANT_MKDIR) ="Can't create directory '%s' (Errcode: %d)";
EE(EE_UNKNOWN_CHARSET)= "Character set is not a compiled character set and is not specified in the %s file";
EE(EE_OUT_OF_FILERESOURCES)="Out of resources when opening file '%s' (Errcode: %d)";
- EE(EE_CANT_READLINK)="Can't read value for symlink '%s' (Error %d)";
- EE(EE_CANT_SYMLINK)="Can't create symlink '%s' pointing at '%s' (Error %d)";
- EE(EE_REALPATH)="Error on realpath() on '%s' (Error %d)";
+ EE(EE_CANT_READLINK)= "Can't read value for symlink '%s' (Error %d)";
+ EE(EE_CANT_SYMLINK)= "Can't create symlink '%s' pointing at '%s' (Error %d)";
+ EE(EE_REALPATH)= "Error on realpath() on '%s' (Error %d)";
+ EE(EE_SYNC)= "Can't sync file '%s' to disk (Errcode: %d)";
}
#endif
diff --git a/mysys/my_symlink.c b/mysys/my_symlink.c
index e287930ff06..abef0096e28 100644
--- a/mysys/my_symlink.c
+++ b/mysys/my_symlink.c
@@ -103,7 +103,8 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags)
#define BUFF_LEN FN_LEN
#endif
-int my_realpath(char *to, const char *filename, myf MyFlags)
+int my_realpath(char *to, const char *filename,
+ myf MyFlags __attribute__((unused)))
{
#if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)
int result=0;
diff --git a/mysys/my_sync.c b/mysys/my_sync.c
new file mode 100644
index 00000000000..317ca039346
--- /dev/null
+++ b/mysys/my_sync.c
@@ -0,0 +1,60 @@
+/* Copyright (C) 2003 MySQL AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include "mysys_priv.h"
+#include "mysys_err.h"
+#include <errno.h>
+
+/*
+ Sync data in file to disk
+
+ SYNOPSIS
+ my_sync()
+ fd File descritor to sync
+ my_flags Flags (now only MY_WME is supported)
+
+ NOTE
+ If file system supports its, only file data is synced, not inode date
+
+ RETURN
+ 0 ok
+ -1 error
+*/
+
+int my_sync(File fd, myf my_flags)
+{
+ int res;
+ DBUG_ENTER("my_sync");
+ DBUG_PRINT("my",("Fd: %d my_flags: %d", fd, my_flags));
+
+#if defined(HAVE_FDATASYNC)
+ res= fdatasync(fd);
+#elif defined(HAVE_FSYNC)
+ res=fsync(fd);
+#elif defined(__WIN__)
+ res= _commit(fd);
+#else
+ res= 0; /* No sync (strange OS) */
+#endif
+ if (res)
+ {
+ if (!(my_errno= errno))
+ my_errno= -1; /* Unknown error */
+ if (my_flags & MY_WME)
+ my_error(EE_SYNC, MYF(ME_BELL+ME_WAITTANG), my_filename(fd), my_errno);
+ }
+ DBUG_RETURN(res);
+} /* my_read */
diff --git a/mysys/thr_alarm.c b/mysys/thr_alarm.c
index 36bbac16fef..bf40ffc5b4d 100644
--- a/mysys/thr_alarm.c
+++ b/mysys/thr_alarm.c
@@ -714,6 +714,9 @@ void thr_alarm_info(ALARM_INFO *info)
bzero((char*) info, sizeof(*info));
}
+void resize_thr_alarm(uint max_alarms)
+{
+}
/*****************************************************************************
thr_alarm for win95
@@ -793,6 +796,10 @@ void thr_alarm_info(ALARM_INFO *info)
bzero((char*) info, sizeof(*info));
}
+void resize_thr_alarm(uint max_alarms)
+{
+}
+
#endif /* __WIN__ */
#endif /* THREAD */
diff --git a/sql/unireg.cc b/sql/unireg.cc
index 5183f471fa2..ff42bfae0f0 100644
--- a/sql/unireg.cc
+++ b/sql/unireg.cc
@@ -150,16 +150,19 @@ int rea_create_table(my_string file_name,
my_free((gptr) screen_buff,MYF(0));
my_afree((gptr) keybuff);
- VOID(my_close(file,MYF(MY_WME)));
- if (ha_create_table(file_name,create_info,0))
+ if (my_sync(file, MYF(MY_WME)))
goto err2;
+ if (my_close(file,MYF(MY_WME)) ||
+ ha_create_table(file_name,create_info,0))
+ goto err3;
DBUG_RETURN(0);
err:
my_free((gptr) screen_buff,MYF(0));
my_afree((gptr) keybuff);
+err2:
VOID(my_close(file,MYF(MY_WME)));
- err2:
+err3:
my_delete(file_name,MYF(0));
DBUG_RETURN(1);
} /* rea_create_table */