summaryrefslogtreecommitdiff
path: root/logsrvd
diff options
context:
space:
mode:
authorTodd C. Miller <Todd.Miller@sudo.ws>2021-10-15 19:10:34 -0600
committerTodd C. Miller <Todd.Miller@sudo.ws>2021-10-15 19:10:34 -0600
commit641cbbb35b9e36a9275ae90b824e72e99a566ebc (patch)
tree3036bb98899011946738216b8ca300426c8babd8 /logsrvd
parent9c6040aebce26562d5ad0622c2db875b354b3063 (diff)
downloadsudo-641cbbb35b9e36a9275ae90b824e72e99a566ebc.tar.gz
Flush I/O logs before we send a commit point.
The commit point message means we have written the data to disk so we should not be buffering it any longer. We do not currently fsync(2) the data after flushing, perhaps we should.
Diffstat (limited to 'logsrvd')
-rw-r--r--logsrvd/iolog_writer.c21
-rw-r--r--logsrvd/logsrvd.c1
-rw-r--r--logsrvd/logsrvd.h1
3 files changed, 22 insertions, 1 deletions
diff --git a/logsrvd/iolog_writer.c b/logsrvd/iolog_writer.c
index 6480114b0..82b867b9a 100644
--- a/logsrvd/iolog_writer.c
+++ b/logsrvd/iolog_writer.c
@@ -633,7 +633,7 @@ iolog_close_all(struct connection_closure *closure)
{
const char *errstr;
int i;
- debug_decl(iolog_close, SUDO_DEBUG_UTIL);
+ debug_decl(iolog_close_all, SUDO_DEBUG_UTIL);
for (i = 0; i < IOFD_MAX; i++) {
if (!closure->iolog_files[i].enabled)
@@ -649,6 +649,25 @@ iolog_close_all(struct connection_closure *closure)
}
bool
+iolog_flush_all(struct connection_closure *closure)
+{
+ const char *errstr;
+ int i, ret = true;
+ debug_decl(iolog_flush_all, SUDO_DEBUG_UTIL);
+
+ for (i = 0; i < IOFD_MAX; i++) {
+ if (!closure->iolog_files[i].enabled)
+ continue;
+ if (!iolog_flush(&closure->iolog_files[i], &errstr)) {
+ sudo_warnx(U_("error flushing iofd %d: %s"), i, errstr);
+ ret = false;
+ }
+ }
+
+ debug_return_bool(ret);
+}
+
+bool
iolog_init(AcceptMessage *msg, struct connection_closure *closure)
{
struct eventlog *evlog = closure->evlog;
diff --git a/logsrvd/logsrvd.c b/logsrvd/logsrvd.c
index 01c12f8bf..6bcc708f4 100644
--- a/logsrvd/logsrvd.c
+++ b/logsrvd/logsrvd.c
@@ -1164,6 +1164,7 @@ server_commit_cb(int unused, int what, void *v)
commit_point.tv_nsec = closure->elapsed_time.tv_nsec;
if (!schedule_commit_point(&commit_point, closure))
connection_close(closure);
+ iolog_flush_all(closure);
debug_return;
}
diff --git a/logsrvd/logsrvd.h b/logsrvd/logsrvd.h
index bb0e95da7..54307b4eb 100644
--- a/logsrvd/logsrvd.h
+++ b/logsrvd/logsrvd.h
@@ -185,6 +185,7 @@ struct eventlog *evlog_new(TimeSpec *submit_time, InfoMessage **info_msgs, size_
bool iolog_init(AcceptMessage *msg, struct connection_closure *closure);
bool iolog_create(int iofd, struct connection_closure *closure);
void iolog_close_all(struct connection_closure *closure);
+bool iolog_flush_all(struct connection_closure *closure);
bool iolog_rewrite(const struct timespec *target, struct connection_closure *closure);
void update_elapsed_time(TimeSpec *delta, struct timespec *elapsed);