sd-journal: introduce SD_JOURNAL_ASSUME_IMMUTABLE flag
The flag can be used when it is not necessary to follow journal file update. Co-authored-by: Costa Tsaousis <costa@netdata.cloud>
This commit is contained in:
co-authored by
Costa Tsaousis
parent
51b2bcf835
commit
bd1af1d5fb
@@ -2092,7 +2092,8 @@ static sd_journal *journal_new(int flags, const char *path, const char *namespac
|
||||
SD_JOURNAL_SYSTEM | \
|
||||
SD_JOURNAL_CURRENT_USER | \
|
||||
SD_JOURNAL_ALL_NAMESPACES | \
|
||||
SD_JOURNAL_INCLUDE_DEFAULT_NAMESPACE)
|
||||
SD_JOURNAL_INCLUDE_DEFAULT_NAMESPACE | \
|
||||
SD_JOURNAL_ASSUME_IMMUTABLE)
|
||||
|
||||
_public_ int sd_journal_open_namespace(sd_journal **ret, const char *namespace, int flags) {
|
||||
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
|
||||
@@ -2118,7 +2119,9 @@ _public_ int sd_journal_open(sd_journal **ret, int flags) {
|
||||
}
|
||||
|
||||
#define OPEN_CONTAINER_ALLOWED_FLAGS \
|
||||
(SD_JOURNAL_LOCAL_ONLY | SD_JOURNAL_SYSTEM)
|
||||
(SD_JOURNAL_LOCAL_ONLY | \
|
||||
SD_JOURNAL_SYSTEM | \
|
||||
SD_JOURNAL_ASSUME_IMMUTABLE)
|
||||
|
||||
_public_ int sd_journal_open_container(sd_journal **ret, const char *machine, int flags) {
|
||||
_cleanup_free_ char *root = NULL, *class = NULL;
|
||||
@@ -2162,7 +2165,9 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in
|
||||
|
||||
#define OPEN_DIRECTORY_ALLOWED_FLAGS \
|
||||
(SD_JOURNAL_OS_ROOT | \
|
||||
SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER )
|
||||
SD_JOURNAL_SYSTEM | \
|
||||
SD_JOURNAL_CURRENT_USER | \
|
||||
SD_JOURNAL_ASSUME_IMMUTABLE)
|
||||
|
||||
_public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int flags) {
|
||||
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
|
||||
@@ -2187,12 +2192,15 @@ _public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int f
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define OPEN_FILES_ALLOWED_FLAGS \
|
||||
(SD_JOURNAL_ASSUME_IMMUTABLE)
|
||||
|
||||
_public_ int sd_journal_open_files(sd_journal **ret, const char **paths, int flags) {
|
||||
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
|
||||
int r;
|
||||
|
||||
assert_return(ret, -EINVAL);
|
||||
assert_return(flags == 0, -EINVAL);
|
||||
assert_return((flags & ~OPEN_FILES_ALLOWED_FLAGS) == 0, -EINVAL);
|
||||
|
||||
j = journal_new(flags, NULL, NULL);
|
||||
if (!j)
|
||||
@@ -2214,7 +2222,8 @@ _public_ int sd_journal_open_files(sd_journal **ret, const char **paths, int fla
|
||||
(SD_JOURNAL_OS_ROOT | \
|
||||
SD_JOURNAL_SYSTEM | \
|
||||
SD_JOURNAL_CURRENT_USER | \
|
||||
SD_JOURNAL_TAKE_DIRECTORY_FD)
|
||||
SD_JOURNAL_TAKE_DIRECTORY_FD | \
|
||||
SD_JOURNAL_ASSUME_IMMUTABLE)
|
||||
|
||||
_public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
|
||||
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
|
||||
@@ -2252,6 +2261,9 @@ _public_ int sd_journal_open_directory_fd(sd_journal **ret, int fd, int flags) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define OPEN_FILES_FD_ALLOWED_FLAGS \
|
||||
(SD_JOURNAL_ASSUME_IMMUTABLE)
|
||||
|
||||
_public_ int sd_journal_open_files_fd(sd_journal **ret, int fds[], unsigned n_fds, int flags) {
|
||||
JournalFile *f;
|
||||
_cleanup_(sd_journal_closep) sd_journal *j = NULL;
|
||||
@@ -2259,7 +2271,7 @@ _public_ int sd_journal_open_files_fd(sd_journal **ret, int fds[], unsigned n_fd
|
||||
|
||||
assert_return(ret, -EINVAL);
|
||||
assert_return(n_fds > 0, -EBADF);
|
||||
assert_return(flags == 0, -EINVAL);
|
||||
assert_return((flags & ~OPEN_FILES_FD_ALLOWED_FLAGS) == 0, -EINVAL);
|
||||
|
||||
j = journal_new(flags, NULL, NULL);
|
||||
if (!j)
|
||||
@@ -2433,6 +2445,9 @@ static int journal_file_read_tail_timestamp(sd_journal *j, JournalFile *f) {
|
||||
|
||||
/* Tries to read the timestamp of the most recently written entry. */
|
||||
|
||||
if (FLAGS_SET(j->flags, SD_JOURNAL_ASSUME_IMMUTABLE) && f->newest_entry_offset != 0)
|
||||
return 0; /* We have already read the file, and we assume that the file is immutable. */
|
||||
|
||||
if (f->header->state == f->newest_state &&
|
||||
f->header->state == STATE_ARCHIVED &&
|
||||
f->newest_entry_offset != 0)
|
||||
@@ -2791,6 +2806,7 @@ _public_ int sd_journal_get_fd(sd_journal *j) {
|
||||
|
||||
assert_return(j, -EINVAL);
|
||||
assert_return(!journal_origin_changed(j), -ECHILD);
|
||||
assert_return(!FLAGS_SET(j->flags, SD_JOURNAL_ASSUME_IMMUTABLE), -EUNATCH);
|
||||
|
||||
if (j->no_inotify)
|
||||
return -EMEDIUMTYPE;
|
||||
@@ -2817,6 +2833,7 @@ _public_ int sd_journal_get_events(sd_journal *j) {
|
||||
|
||||
assert_return(j, -EINVAL);
|
||||
assert_return(!journal_origin_changed(j), -ECHILD);
|
||||
assert_return(!FLAGS_SET(j->flags, SD_JOURNAL_ASSUME_IMMUTABLE), -EUNATCH);
|
||||
|
||||
fd = sd_journal_get_fd(j);
|
||||
if (fd < 0)
|
||||
@@ -2830,6 +2847,7 @@ _public_ int sd_journal_get_timeout(sd_journal *j, uint64_t *timeout_usec) {
|
||||
|
||||
assert_return(j, -EINVAL);
|
||||
assert_return(!journal_origin_changed(j), -ECHILD);
|
||||
assert_return(!FLAGS_SET(j->flags, SD_JOURNAL_ASSUME_IMMUTABLE), -EUNATCH);
|
||||
assert_return(timeout_usec, -EINVAL);
|
||||
|
||||
fd = sd_journal_get_fd(j);
|
||||
@@ -2957,6 +2975,8 @@ _public_ int sd_journal_process(sd_journal *j) {
|
||||
if (j->inotify_fd < 0) /* We have no inotify fd yet? Then there's noting to process. */
|
||||
return 0;
|
||||
|
||||
assert_return(!FLAGS_SET(j->flags, SD_JOURNAL_ASSUME_IMMUTABLE), -EUNATCH);
|
||||
|
||||
j->last_process_usec = now(CLOCK_MONOTONIC);
|
||||
j->last_invalidate_counter = j->current_invalidate_counter;
|
||||
|
||||
@@ -2985,6 +3005,7 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
|
||||
|
||||
assert_return(j, -EINVAL);
|
||||
assert_return(!journal_origin_changed(j), -ECHILD);
|
||||
assert_return(!FLAGS_SET(j->flags, SD_JOURNAL_ASSUME_IMMUTABLE), -EUNATCH);
|
||||
|
||||
if (j->inotify_fd < 0) {
|
||||
JournalFile *f;
|
||||
|
||||
@@ -72,6 +72,7 @@ enum {
|
||||
SD_JOURNAL_ALL_NAMESPACES = 1 << 5, /* Show all namespaces, not just the default or specified one */
|
||||
SD_JOURNAL_INCLUDE_DEFAULT_NAMESPACE = 1 << 6, /* Show default namespace in addition to specified one */
|
||||
SD_JOURNAL_TAKE_DIRECTORY_FD = 1 << 7, /* sd_journal_open_directory_fd() will take ownership of the provided file descriptor. */
|
||||
SD_JOURNAL_ASSUME_IMMUTABLE = 1 << 8, /* Assume the opened journal files are immutable. Journal entries added later may be ignored. */
|
||||
|
||||
SD_JOURNAL_SYSTEM_ONLY _sd_deprecated_ = SD_JOURNAL_SYSTEM /* old name */
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user