mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
journal-file: don't use pread() when determining where to append, use mmap as before
This partially undoes the effect ofab6e257b3e
. Originally, we always used the mmap logic to determine the current end of the file.ab6e257b3e
changed this so that we always used pread(). With this change we'll use pread() from the synchronization thread and mmap otherwise.
This commit is contained in:
parent
e5d8473335
commit
e6d4a1106c
@ -23,7 +23,7 @@ static int journald_file_truncate(JournalFile *f) {
|
||||
int r;
|
||||
|
||||
/* truncate excess from the end of archives */
|
||||
r = journal_file_tail_end(f, &p);
|
||||
r = journal_file_tail_end_by_pread(f, &p);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to determine end of tail object: %m");
|
||||
|
||||
|
@ -91,8 +91,7 @@
|
||||
# pragma GCC diagnostic ignored "-Waddress-of-packed-member"
|
||||
#endif
|
||||
|
||||
int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset) {
|
||||
Object tail;
|
||||
int journal_file_tail_end_by_pread(JournalFile *f, uint64_t *ret_offset) {
|
||||
uint64_t p;
|
||||
int r;
|
||||
|
||||
@ -100,10 +99,14 @@ int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset) {
|
||||
assert(f->header);
|
||||
assert(ret_offset);
|
||||
|
||||
/* Same as journal_file_tail_end_by_mmap() below, but operates with pread() to avoid the mmap cache
|
||||
* (and thus is thread safe) */
|
||||
|
||||
p = le64toh(f->header->tail_object_offset);
|
||||
if (p == 0)
|
||||
p = le64toh(f->header->header_size);
|
||||
else {
|
||||
Object tail;
|
||||
uint64_t sz;
|
||||
|
||||
r = journal_file_read_object_header(f, OBJECT_UNUSED, p, &tail);
|
||||
@ -126,6 +129,43 @@ int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int journal_file_tail_end_by_mmap(JournalFile *f, uint64_t *ret_offset) {
|
||||
uint64_t p;
|
||||
int r;
|
||||
|
||||
assert(f);
|
||||
assert(f->header);
|
||||
assert(ret_offset);
|
||||
|
||||
/* Same as journal_file_tail_end_by_pread() above, but operates with the usual mmap logic */
|
||||
|
||||
p = le64toh(f->header->tail_object_offset);
|
||||
if (p == 0)
|
||||
p = le64toh(f->header->header_size);
|
||||
else {
|
||||
Object *tail;
|
||||
uint64_t sz;
|
||||
|
||||
r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &tail);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
sz = le64toh(READ_NOW(tail->object.size));
|
||||
if (sz > UINT64_MAX - sizeof(uint64_t) + 1)
|
||||
return -EBADMSG;
|
||||
|
||||
sz = ALIGN64(sz);
|
||||
if (p > UINT64_MAX - sz)
|
||||
return -EBADMSG;
|
||||
|
||||
p += sz;
|
||||
}
|
||||
|
||||
*ret_offset = p;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int journal_file_set_offline_thread_join(JournalFile *f) {
|
||||
int r;
|
||||
|
||||
@ -941,7 +981,7 @@ int journal_file_append_object(
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = journal_file_tail_end(f, &p);
|
||||
r = journal_file_tail_end_by_mmap(f, &p);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
|
@ -187,7 +187,8 @@ static inline bool VALID_EPOCH(uint64_t u) {
|
||||
int journal_file_move_to_object(JournalFile *f, ObjectType type, uint64_t offset, Object **ret);
|
||||
int journal_file_read_object_header(JournalFile *f, ObjectType type, uint64_t offset, Object *ret);
|
||||
|
||||
int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset);
|
||||
int journal_file_tail_end_by_pread(JournalFile *f, uint64_t *ret_offset);
|
||||
int journal_file_tail_end_by_mmap(JournalFile *f, uint64_t *ret_offset);
|
||||
|
||||
uint64_t journal_file_entry_n_items(Object *o) _pure_;
|
||||
uint64_t journal_file_entry_array_n_items(Object *o) _pure_;
|
||||
|
Loading…
Reference in New Issue
Block a user