stream_file: use fstat() instead of lseek() to determine file size

It appears using lseek() to seek to the end and back to determine file
size is inefficient in some cases.

With CIFS, this restores the performance regression that happened when
the stream cache was removed (which called read() from a thread). This
is probably faster than the old code too, because it's the seeking that
was slowing down CIFS.

According to the user who tested this, the size caching does not help
with fstat() (although it did with the old method).

Fixes: #7408, #7152
This commit is contained in:
wm4 2020-02-16 23:36:05 +01:00
parent 249bb091d4
commit 20eead1813
1 changed files with 8 additions and 3 deletions

View File

@ -77,9 +77,14 @@ static int64_t get_size(stream_t *s)
{
struct priv *p = s->priv;
if (p->cached_size == -2) {
off_t size = lseek(p->fd, 0, SEEK_END);
lseek(p->fd, s->pos, SEEK_SET);
p->cached_size = size < 0 ? -1 : size;
int64_t size = -1;
struct stat st;
if (fstat(p->fd, &st) == 0) {
if (st.st_size <= 0 && !s->seekable)
st.st_size = -1;
size = st.st_size < 0 ? -1 : st.st_size;
}
p->cached_size = size;
}
return p->cached_size;
}