diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-11-08 09:50:56 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-11-08 10:19:55 +0200 |
commit | c761b43451d54eeeecdf3c102906fcce88d4e9d9 (patch) | |
tree | c00b07bf4b36108f1ecbfc3015b5594899e0e248 /mysys | |
parent | 07e4853c232726a639b30d4718bef9914ea42d24 (diff) | |
parent | bac2ec3a5b28ed590826b20a4cf27fd788903bbd (diff) | |
download | mariadb-git-c761b43451d54eeeecdf3c102906fcce88d4e9d9.tar.gz |
Merge 10.3 into 10.4mariadb-10.4.0
Diffstat (limited to 'mysys')
-rw-r--r-- | mysys/mf_iocache.c | 4 | ||||
-rw-r--r-- | mysys/my_pread.c | 26 |
2 files changed, 23 insertions, 7 deletions
diff --git a/mysys/mf_iocache.c b/mysys/mf_iocache.c index 0f93b2303b3..6150473c2f0 100644 --- a/mysys/mf_iocache.c +++ b/mysys/mf_iocache.c @@ -297,6 +297,10 @@ int init_io_cache(IO_CACHE *info, File file, size_t cachesize, } info->inited=info->aio_result.pending=0; #endif + if (type == READ_CACHE || type == WRITE_CACHE || type == SEQ_READ_APPEND) + info->myflags|= MY_FULL_IO; + else + info->myflags&= ~MY_FULL_IO; DBUG_RETURN(0); } /* init_io_cache */ diff --git a/mysys/my_pread.c b/mysys/my_pread.c index edf7fb56918..2b7ce4bc0d6 100644 --- a/mysys/my_pread.c +++ b/mysys/my_pread.c @@ -47,8 +47,7 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, myf MyFlags) { - size_t readbytes; - int error= 0; + size_t readbytes, save_count= 0; DBUG_ENTER("my_pread"); @@ -66,11 +65,10 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, #else readbytes= pread(Filedes, Buffer, Count, offset); #endif - error = (readbytes != Count); - if (error) + if (readbytes != Count) { - my_errno= errno ? errno : -1; + my_errno= errno; if (errno == 0 || (readbytes != (size_t) -1 && (MyFlags & (MY_NABP | MY_FNABP)))) my_errno= HA_ERR_FILE_TOO_SHORT; @@ -82,6 +80,18 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, (int) readbytes)); continue; /* Interrupted */ } + + /* Do a read retry if we didn't get enough data on first read */ + if (readbytes != (size_t) -1 && readbytes != 0 && + (MyFlags & MY_FULL_IO)) + { + Buffer+= readbytes; + Count-= readbytes; + save_count+= readbytes; + offset+= readbytes; + continue; + } + if (MyFlags & (MY_WME | MY_FAE | MY_FNABP)) { if (readbytes == (size_t) -1) @@ -97,8 +107,10 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset, DBUG_RETURN(MY_FILE_ERROR); /* Return with error */ } if (MyFlags & (MY_NABP | MY_FNABP)) - DBUG_RETURN(0); /* Read went ok; Return 0 */ - DBUG_RETURN(readbytes); /* purecov: inspected */ + readbytes= 0; /* Read went ok; Return 0 */ + else + readbytes+= save_count; + DBUG_RETURN(readbytes); } } /* my_pread */ |