mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
1a26057428
which is wrong now that slave recovers gracefully from a crashed binlog (thx Serg). stat -> my_stat in my_copy.c so that failing stat() does not hang client connection. BitKeeper/deleted/.del-rpl_trunc_binlog.test~961b1f6ac73d37c8: Delete: mysql-test/t/rpl_trunc_binlog.test BitKeeper/deleted/.del-rpl_trunc_binlog.result~14b4a61886a332e8: Delete: mysql-test/r/rpl_trunc_binlog.result mysql-test/std_data/trunc_binlog.000001: Rename: BitKeeper/deleted/.del-trunc_binlog.000001~b504d840c7efde25 -> mysql-test/std_data/trunc_binlog.000001 mysql-test/t/rpl_until.test: making test more robust if machine is slow. We still need to sleep before testing if slave SQL thread stopped, because otherwise it may not have started yet when we test for stop, then we would return too early. When we have "START SLAVE" wait a few secs until slave threads actually started well (WL#2688) these "sleep 2" could be removed. mysys/my_copy.c: Using my_stat() instead of stat(). Reason is that my_stat() reports an error message if wanted (MY_WME), which is critical for an error being sent to the client. Before this patch, a failing stat() caused the client connection to hang (because error was not set because my_error was never called). Adding an assertion to match the comment at the start of the function.
118 lines
3.7 KiB
C
118 lines
3.7 KiB
C
/* Copyright (C) 2000 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 */
|
|
|
|
#define USES_TYPES /* sys/types is included */
|
|
#include "mysys_priv.h"
|
|
#include <my_dir.h> /* for stat */
|
|
#include <m_string.h>
|
|
#if defined(HAVE_UTIME_H)
|
|
#include <utime.h>
|
|
#elif defined(HAVE_SYS_UTIME_H)
|
|
#include <sys/utime.h>
|
|
#elif !defined(HPUX10)
|
|
#include <time.h>
|
|
struct utimbuf {
|
|
time_t actime;
|
|
time_t modtime;
|
|
};
|
|
#endif
|
|
|
|
|
|
/*
|
|
int my_copy(const char *from, const char *to, myf MyFlags)
|
|
|
|
NOTES
|
|
Ordinary ownership and accesstimes are copied from 'from-file'
|
|
If MyFlags & MY_HOLD_ORIGINAL_MODES is set and to-file exists then
|
|
the modes of to-file isn't changed
|
|
If MyFlags & MY_DONT_OVERWRITE_FILE is set, we will give an error
|
|
if the file existed.
|
|
|
|
WARNING
|
|
Don't set MY_FNABP or MY_NABP bits on when calling this function !
|
|
|
|
RETURN
|
|
0 ok
|
|
# Error
|
|
|
|
*/
|
|
|
|
int my_copy(const char *from, const char *to, myf MyFlags)
|
|
{
|
|
uint Count;
|
|
my_bool new_file_stat; /* 1 if we could stat "to" */
|
|
int create_flag;
|
|
File from_file,to_file;
|
|
char buff[IO_SIZE];
|
|
MY_STAT stat_buff,new_stat_buff;
|
|
DBUG_ENTER("my_copy");
|
|
DBUG_PRINT("my",("from %s to %s MyFlags %d", from, to, MyFlags));
|
|
|
|
from_file=to_file= -1;
|
|
LINT_INIT(new_file_stat);
|
|
DBUG_ASSERT(!(MyFlags & (MY_FNABP | MY_NABP))); /* for my_read/my_write */
|
|
if (MyFlags & MY_HOLD_ORIGINAL_MODES) /* Copy stat if possible */
|
|
new_file_stat= test(my_stat((char*) to, &new_stat_buff, MYF(0)));
|
|
|
|
if ((from_file=my_open(from,O_RDONLY | O_SHARE,MyFlags)) >= 0)
|
|
{
|
|
if (!my_stat(from, &stat_buff, MyFlags))
|
|
{
|
|
my_errno=errno;
|
|
goto err;
|
|
}
|
|
if (MyFlags & MY_HOLD_ORIGINAL_MODES && new_file_stat)
|
|
stat_buff=new_stat_buff;
|
|
create_flag= (MyFlags & MY_DONT_OVERWRITE_FILE) ? O_EXCL : O_TRUNC;
|
|
|
|
if ((to_file= my_create(to,(int) stat_buff.st_mode,
|
|
O_WRONLY | create_flag | O_BINARY | O_SHARE,
|
|
MyFlags)) < 0)
|
|
goto err;
|
|
|
|
while ((Count=my_read(from_file,buff,IO_SIZE,MyFlags)) != 0)
|
|
if (Count == (uint) -1 ||
|
|
my_write(to_file,buff,Count,MYF(MyFlags | MY_NABP)))
|
|
goto err;
|
|
|
|
if (my_close(from_file,MyFlags) | my_close(to_file,MyFlags))
|
|
DBUG_RETURN(-1); /* Error on close */
|
|
|
|
/* Copy modes if possible */
|
|
|
|
if (MyFlags & MY_HOLD_ORIGINAL_MODES && !new_file_stat)
|
|
DBUG_RETURN(0); /* File copyed but not stat */
|
|
VOID(chmod(to, stat_buff.st_mode & 07777)); /* Copy modes */
|
|
#if !defined(MSDOS) && !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) && !defined(__NETWARE__)
|
|
VOID(chown(to, stat_buff.st_uid,stat_buff.st_gid)); /* Copy ownership */
|
|
#endif
|
|
#if !defined(VMS) && !defined(__ZTC__)
|
|
if (MyFlags & MY_COPYTIME)
|
|
{
|
|
struct utimbuf timep;
|
|
timep.actime = stat_buff.st_atime;
|
|
timep.modtime = stat_buff.st_mtime;
|
|
VOID(utime((char*) to, &timep)); /* last accessed and modified times */
|
|
}
|
|
#endif
|
|
DBUG_RETURN(0);
|
|
}
|
|
|
|
err:
|
|
if (from_file >= 0) VOID(my_close(from_file,MyFlags));
|
|
if (to_file >= 0) VOID(my_close(to_file,MyFlags));
|
|
DBUG_RETURN(-1);
|
|
} /* my_copy */
|