summaryrefslogtreecommitdiff
path: root/mysys
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-11-08 09:50:56 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2018-11-08 10:19:55 +0200
commitc761b43451d54eeeecdf3c102906fcce88d4e9d9 (patch)
treec00b07bf4b36108f1ecbfc3015b5594899e0e248 /mysys
parent07e4853c232726a639b30d4718bef9914ea42d24 (diff)
parentbac2ec3a5b28ed590826b20a4cf27fd788903bbd (diff)
downloadmariadb-git-c761b43451d54eeeecdf3c102906fcce88d4e9d9.tar.gz
Merge 10.3 into 10.4mariadb-10.4.0
Diffstat (limited to 'mysys')
-rw-r--r--mysys/mf_iocache.c4
-rw-r--r--mysys/my_pread.c26
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 */