mirror of
https://github.com/borgbackup/borg.git
synced 2024-12-25 17:27:31 +00:00
Merge branch '1.0-maint' of github.com:borgbackup/borg into 1.0-maint
This commit is contained in:
commit
813dbc4d25
1 changed files with 23 additions and 2 deletions
|
@ -41,6 +41,7 @@ static uint32_t table_base[] =
|
||||||
|
|
||||||
#define BARREL_SHIFT(v, shift) ( ((v) << shift) | ((v) >> (32 - shift)) )
|
#define BARREL_SHIFT(v, shift) ( ((v) << shift) | ((v) >> (32 - shift)) )
|
||||||
|
|
||||||
|
size_t pagemask;
|
||||||
|
|
||||||
static uint32_t *
|
static uint32_t *
|
||||||
buzhash_init_table(uint32_t seed)
|
buzhash_init_table(uint32_t seed)
|
||||||
|
@ -130,6 +131,7 @@ chunker_fill(Chunker *c)
|
||||||
{
|
{
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
off_t offset, length;
|
off_t offset, length;
|
||||||
|
int overshoot;
|
||||||
PyObject *data;
|
PyObject *data;
|
||||||
memmove(c->data, c->data + c->last, c->position + c->remaining - c->last);
|
memmove(c->data, c->data + c->last, c->position + c->remaining - c->last);
|
||||||
c->position -= c->last;
|
c->position -= c->last;
|
||||||
|
@ -157,14 +159,33 @@ chunker_fill(Chunker *c)
|
||||||
}
|
}
|
||||||
length = c->bytes_read - offset;
|
length = c->bytes_read - offset;
|
||||||
#if ( ( _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L ) && defined(POSIX_FADV_DONTNEED) )
|
#if ( ( _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L ) && defined(POSIX_FADV_DONTNEED) )
|
||||||
|
|
||||||
|
// Only do it once per run.
|
||||||
|
if (pagemask == 0)
|
||||||
|
pagemask = getpagesize() - 1;
|
||||||
|
|
||||||
// We tell the OS that we do not need the data that we just have read any
|
// We tell the OS that we do not need the data that we just have read any
|
||||||
// more (that it maybe has in the cache). This avoids that we spoil the
|
// more (that it maybe has in the cache). This avoids that we spoil the
|
||||||
// complete cache with data that we only read once and (due to cache
|
// complete cache with data that we only read once and (due to cache
|
||||||
// size limit) kick out data from the cache that might be still useful
|
// size limit) kick out data from the cache that might be still useful
|
||||||
// for the OS or other processes.
|
// for the OS or other processes.
|
||||||
|
// We rollback the initial offset back to the start of the page,
|
||||||
|
// to avoid it not being truncated as a partial page request.
|
||||||
if (length > 0) {
|
if (length > 0) {
|
||||||
posix_fadvise(c->fh, offset, length, POSIX_FADV_DONTNEED);
|
// Linux kernels prior to 4.7 have a bug where they truncate
|
||||||
|
// last partial page of POSIX_FADV_DONTNEED request, so we need
|
||||||
|
// to page-align it ourselves. We'll need the rest of this page
|
||||||
|
// on the next read (assuming this was not EOF)
|
||||||
|
overshoot = (offset + length) & pagemask;
|
||||||
|
} else {
|
||||||
|
// For length == 0 we set overshoot 0, so the below
|
||||||
|
// length - overshoot is 0, which means till end of file for
|
||||||
|
// fadvise. This will cancel the final page and is not part
|
||||||
|
// of the above workaround.
|
||||||
|
overshoot = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
posix_fadvise(c->fh, offset & ~pagemask, length - overshoot, POSIX_FADV_DONTNEED);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Reference in a new issue