]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: various cleanups for TEST-04-JOURNAL.journal-reload.sh 38308/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 23 Jul 2025 20:04:52 +0000 (05:04 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 24 Jul 2025 14:27:21 +0000 (23:27 +0900)
- rename to TEST-04-JOURNAL.reload.sh,
- use trap to call cleanup(),
- use systemd-run to write journals, to make each journal entries to be
  distinguished by the service name,
- greatly simplifies verify_journals(),
- drop unnecessary calls of sleep command, etc, etc.

Follow-ups for df5b3426f60bb626f46f93fbdacecae274c1645b.
Hopefully fixes #38287.

test/units/TEST-04-JOURNAL.journal-reload.sh [deleted file]
test/units/TEST-04-JOURNAL.reload.sh [new file with mode: 0755]

diff --git a/test/units/TEST-04-JOURNAL.journal-reload.sh b/test/units/TEST-04-JOURNAL.journal-reload.sh
deleted file mode 100755 (executable)
index 53314a5..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-#!/usr/bin/env bash
-# SPDX-License-Identifier: LGPL-2.1-or-later
-# shellcheck disable=SC2016
-set -eux
-set -o pipefail
-
-MACHINE_ID="$(</etc/machine-id)"
-TEST_MSG_PREFIX="JOURNAL-RELOAD TEST"
-SYSLOG_ID="$(systemd-id128 new)"
-
-write_to_journal() {
-    local rand_val
-
-    rand_val=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 14)
-    echo "$TEST_MSG_PREFIX $rand_val" | systemd-cat -t "$SYSLOG_ID"
-    journalctl --sync
-
-    echo "$rand_val"
-}
-
-verify_archived_journals() {
-    local msg="$1"
-    local journal_path_prefix="$2"
-    local journal_dir="/$journal_path_prefix/log/journal/$MACHINE_ID"
-
-    for journal_file in "$journal_dir"/*; do
-        filename=$(basename -- "$journal_file")
-        if [[ "$filename" != "system.journal" ]]; then
-            if journalctl --file="$journal_file" | grep -q "$msg"; then
-                echo "Message present in archived journal: $filename"
-                exit 0
-            fi
-        fi
-    done
-
-    exit 1
-}
-
-# shellcheck disable=SC2317
-verify_journal() {
-    local msg="$1"
-    local entry_expected="$2"
-    local test_name="$3"
-    local journal_path_prefix="$4"
-
-    local path="/$journal_path_prefix/log/journal/$MACHINE_ID/system.journal"
-
-    if [ ! -e "$path" ] || ! grep -Fxq "MESSAGE=$TEST_MSG_PREFIX $msg" "$path"; then
-        if [ "$entry_expected" == true ]; then
-            echo "$test_name ERROR: Message not present in $journal_path_prefix journal. Checking archived journals..."
-            if ! verify_archived_journals "$msg" "$journal_path_prefix"; then
-                echo "$test_name ERROR: Message also not present in archived journals"
-                cleanup
-                exit 1
-            fi
-
-        fi
-    else
-        if [ "$entry_expected" == false ]; then
-            echo "$test_name ERROR: Message present in $journal_path_prefix journal"
-            cleanup
-            exit 1
-        fi
-    fi
-}
-
-verify_journals() {
-    local msg="$1"
-    local runtime_expected="$2"
-    local system_expected="$3"
-    local test_name="$4"
-
-    local failed=false
-
-    if ! verify_journal "$msg" "$runtime_expected" "$test_name" "run"; then
-        failed=true
-    fi
-
-    if ! verify_journal "$msg" "$system_expected" "$test_name" "var"; then
-        failed=true
-    fi
-
-    if [ "$failed" == true ]; then
-        cleanup
-        exit 1
-    fi
-}
-
-get_num_archived_journals() {
-    local journal_path_prefix="$1"
-
-    local journal_dir="/$journal_path_prefix/log/journal/$MACHINE_ID/"
-    num_journal_files=$(find "$journal_dir" -type f -name "*.journal" ! -name "system.journal" | wc -l)
-
-    echo "$num_journal_files"
-}
-
-cleanup() {
-    rm /run/systemd/journald.conf.d/reload.conf
-    journalctl --vacuum-size=1M
-    systemctl daemon-reload
-    systemctl reload systemd-journald.service
-}
-
-# Start clean slate.
-mkdir -p /run/systemd/journald.conf.d
-cat <<EOF >/run/systemd/journald.conf.d/reload.conf
-[Journal]
-Storage=persistent
-EOF
-
-systemctl daemon-reload
-systemctl restart systemd-journald.service
-
-# Add entries in system.
-journalctl --flush
-rand_val1=$(write_to_journal)
-verify_journals "$rand_val1" false true "Confirming test setup after flush."
-
-# Reload journald (persistent->persistent)
-systemctl reload systemd-journald.service
-
-# Reload should persist persistent journal.
-verify_journals "$rand_val1" false true "Persistent->Persistent System Reload: "
-
-rand_val1=$(write_to_journal)
-verify_journals "$rand_val1" false true "Persistent->Persistent System Post-Reload: "
-
-# Add entries in runtime
-journalctl --relinquish
-rand_val2=$(write_to_journal)
-verify_journals "$rand_val2" true false "Confirming test setup after relinquish."
-
-# Reload journald (persistent->persistent)
-systemctl reload systemd-journald.service
-
-# System journal entries should stay in system journal, runtime in runtime.
-verify_journals "$rand_val1" false true "Persistent->Persistent Runtime Reload 1: "
-verify_journals "$rand_val2" true false "Persistent->Persistent Runtime Reload 2: "
-
-# Write new message and confirm it's written to runtime.
-rand_val=$(write_to_journal)
-verify_journals "$rand_val" true false "Persistent->Persistent New Message After Reload: "
-
-# Flush and confirm that messages are written to system.
-journalctl --flush
-rand_val=$(write_to_journal)
-verify_journals "$rand_val" false true "Persistent->Volatile New Message Before Reload: "
-
-# Test persistent->volatile
-cat <<EOF >/run/systemd/journald.conf.d/reload.conf
-[Journal]
-Storage=volatile
-EOF
-
-# Confirm old message exists where it was written to (storage->storage).
-systemctl reload systemd-journald.service
-verify_journals "$rand_val" false true "Persistent->Volatile Reload: "
-
-# Confirm that messages are written to only runtime journal.
-rand_val=$(write_to_journal)
-verify_journals "$rand_val" true false "Persistent->Volatile New Message After Reload: "
-
-# Test volatile works and logs are NOT getting written to system journal despite flush.
-journalctl --flush
-rand_val=$(write_to_journal)
-verify_journals "$rand_val" true false "Persistent->Volatile New Message After Flush: "
-
-# Test that the new limits (e.g., RuntimeMaxUse) take effect on reload.
-# Write 1M of data to runtime journal
-max_size=1048656 # (1 * 1024 * 1024) = 1048576, but centos has a different minimum value for some reason.
-set +x
-dd if=/dev/urandom bs=1M count=5 | base64 | systemd-cat -t "$SYSLOG_ID"
-set -x
-journalctl --vacuum-size=2M
-
-total_size=$(du -sb "/run/log/journal/$MACHINE_ID" | cut -f1)
-if [ "$total_size" -lt "$max_size" ]; then
-    echo "ERROR: Journal size does not exceed RuntimeMaxUse limit"
-    cleanup
-    exit 1
-fi
-
-# Reload with RuntimeMaxUse=1M.
-cat <<EOF >/run/systemd/journald.conf.d/reload.conf
-[Journal]
-Storage=volatile
-RuntimeMaxUse=1M
-EOF
-
-# systemctl daemon-reload
-systemctl reload systemd-journald.service
-
-sleep 15 # Wait for RuntimeMaxUse change to take effect.
-
-# Confirm that runtime journal size shrunk to <=1M.
-total_size=$(du -sb "/run/log/journal/$MACHINE_ID" | cut -f1)
-if [ "$total_size" -gt "$max_size" ]; then
-    echo "ERROR: Journal size exceeds RuntimeMaxUse limit"
-    cleanup
-    exit 1
-fi
-
-# Prepare for volatile->persistent by getting rid of runtime limit. Otherwise, it will not write.
-cat <<EOF >/run/systemd/journald.conf.d/reload.conf
-[Journal]
-Storage=volatile
-EOF
-systemctl daemon-reload
-systemctl reload systemd-journald.service
-sleep 15 # Wait for RuntimeMaxUse change to take effect.
-
-journalctl --vacuum-size=1M
-sleep 5
-
-rand_val=$(write_to_journal)
-verify_journals "$rand_val" true false "Volatile->Persistent New Message Before Reload: "
-
-# Reload volatile->persistent
-cat <<EOF >/run/systemd/journald.conf.d/reload.conf
-[Journal]
-Storage=persistent
-EOF
-
-systemctl reload systemd-journald.service
-
-# Confirm that previous message is still in runtime journal.
-verify_journals "$rand_val" true false "Volatile->Persistent Reload: "
-
-# Confirm that new messages are written to runtime journal.
-rand_val=$(write_to_journal)
-verify_journals "$rand_val" true false "Volatile->Persistent New Message After Reload: "
-
-# Confirm that flushing writes to system journal.
-journalctl --flush
-verify_journals "$rand_val" false true "Volatile->Persistent New Message After Flush: "
-
-set +x
-dd if=/dev/urandom bs=1M count=5 | base64 | systemd-cat -t "$SYSLOG_ID"
-set -x
-
-max_size=$((2 * 1024 * 1024))
-total_size=$(du -sb "/var/log/journal/$MACHINE_ID" | cut -f1)
-if [ "$total_size" -lt "$max_size" ]; then
-    echo "ERROR: Journal size does not exceed SystemMaxUse limit"
-    cleanup
-    exit 1
-fi
-
-# Ensure reloading without limit does not interfere with SystemMaxUse test.
-systemctl reload systemd-journald.service
-total_size=$(du -sb "/var/log/journal/$MACHINE_ID" | cut -f1)
-if [ "$total_size" -lt "$max_size" ]; then
-    echo "ERROR: Journal size does not exceed SystemMaxUse limit"
-    cleanup
-    exit 1
-fi
-
-# Write to storage to prepare for SystemMaxFiles test.
-journalctl --flush
-
-num_var_journals=$(get_num_archived_journals "var")
-limit_var_journals=3
-if [ "$num_var_journals" -lt "$limit_var_journals" ]; then
-    echo "Creating archive files."
-    for (( i=0; i<=num_var_journals; i++ ))
-    do
-        echo "$TEST_MSG_PREFIX" | systemd-cat -t "$SYSLOG_ID"
-        journalctl --rotate
-    done
-
-    num_var_journals=$(get_num_archived_journals "var")
-    if [ "$num_var_journals" -lt "$limit_var_journals" ]; then
-        echo "ERROR: Number of journal files in /var/log/journal/$MACHINE_ID/ is less than $limit_var_journals"
-        cleanup
-        exit 1
-    fi
-fi
-
-# Reload with less SystemMaxUse and SystemMaxFiles.
-cat <<EOF >/run/systemd/journald.conf.d/reload.conf
-[Journal]
-Storage=persistent
-RuntimeMaxUse=2M
-SystemMaxUse=2M
-SystemMaxFiles=3
-EOF
-
-systemctl daemon-reload
-systemctl reload systemd-journald.service
-
-# New system journal needs to be created with the new configuration for change to take effect.
-journalctl --flush
-
-# Check SystemMaxFiles
-num_var_journals=$(get_num_archived_journals "var")
-if [ "$num_var_journals" -gt "$limit_var_journals" ]; then
-    echo "ERROR: Number of journal files in /var/log/journal/$MACHINE_ID/ is greater than $limit_var_journals"
-    cleanup
-    exit 1
-fi
-
-sleep 15
-
-# Check SystemMaxUse
-total_size=$(du -sb "/var/log/journal/$MACHINE_ID" | cut -f1)
-if [ "$total_size" -gt "$max_size" ]; then
-    echo "ERROR: Journal size exceeds SystemMaxUse limit"
-    cleanup
-    exit 1
-fi
-
-rm /run/systemd/journald.conf.d/reload.conf
-journalctl --vacuum-size=1M
-systemctl daemon-reload
-systemctl reload systemd-journald.service
diff --git a/test/units/TEST-04-JOURNAL.reload.sh b/test/units/TEST-04-JOURNAL.reload.sh
new file mode 100755 (executable)
index 0000000..07dab5d
--- /dev/null
@@ -0,0 +1,236 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# shellcheck disable=SC2016
+set -eux
+set -o pipefail
+
+# shellcheck source=test/units/util.sh
+. "$(dirname "$0")"/util.sh
+
+MACHINE_ID="$(</etc/machine-id)"
+SYSLOG_ID="$(systemd-id128 new)"
+
+write_to_journal() {
+    local service="test-${RANDOM}.service"
+
+    systemd-run -q --wait -u "$service" bash -c "echo service=$service invocation=\$INVOCATION_ID; journalctl --sync"
+    echo "$service"
+}
+
+verify_journals() {
+    local service="${1:?}"
+    local expected_storage="${2:?}"
+
+    local run_expected var_expected
+    if [[ "$expected_storage" == runtime ]]; then
+        run_expected=0
+        var_expected=1
+    elif [[ "$expected_storage" == persistent ]]; then
+        run_expected=1
+        var_expected=0
+    else
+        echo "unexpected storage: $expected_storage"
+        exit 1
+    fi
+
+    assert_rc "$run_expected" journalctl -q -D "/run/log/journal/$MACHINE_ID/" -u "$service" --grep "service=$service"
+    assert_rc "$var_expected" journalctl -q -D "/var/log/journal/$MACHINE_ID/" -u "$service" --grep "service=$service"
+}
+
+get_num_archived_journals() {
+    local prefix=${1:?}
+
+    find "/$prefix/log/journal/$MACHINE_ID/" -type f -name "system@*.journal" | wc -l
+}
+
+cleanup() {
+    set +e
+    rm -rf /run/systemd/journald.conf.d
+    systemctl reload systemd-journald.service
+}
+
+trap cleanup EXIT ERR INT TERM
+
+mkdir -p /run/systemd/journald.conf.d
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=persistent
+EOF
+systemctl restart systemd-journald.service
+
+: "Add entries in system."
+journalctl --flush
+VAL1=$(write_to_journal)
+verify_journals "$VAL1" persistent
+
+: "Reload journald (persistent->persistent)"
+systemctl reload systemd-journald.service
+
+: "Reload should persist persistent journal."
+verify_journals "$VAL1" persistent
+
+: "Add entries in runtime"
+journalctl --relinquish
+VAL2=$(write_to_journal)
+verify_journals "$VAL2" runtime
+
+: "Reload journald after relinquish (persistent->persistent)"
+systemctl reload systemd-journald.service
+
+: "System journal entries should stay in system journal, runtime in runtime."
+verify_journals "$VAL1" persistent
+verify_journals "$VAL2" runtime
+
+: "Write new message and confirm it's written to runtime."
+VAL=$(write_to_journal)
+verify_journals "$VAL" runtime
+
+: "Flush and confirm that messages are written to system."
+journalctl --flush
+VAL=$(write_to_journal)
+verify_journals "$VAL" persistent
+
+# Test persistent->volatile
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=volatile
+EOF
+
+: "Confirm old message exists where it was written to persistent journal."
+systemctl reload systemd-journald.service
+verify_journals "$VAL" persistent
+
+: "Confirm that new message is written to runtime journal."
+VAL=$(write_to_journal)
+verify_journals "$VAL" runtime
+
+: "Test volatile works and logs are NOT getting written to system journal despite flush."
+journalctl --flush
+VAL=$(write_to_journal)
+verify_journals "$VAL" runtime
+
+: "Disable compression"
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=volatile
+Compress=no
+EOF
+systemctl reload systemd-journald.service
+
+: "write 2MB of data to runtime journal"
+set +x
+dd if=/dev/urandom bs=1M count=2 | base64 | systemd-cat -t "$SYSLOG_ID"
+set -x
+journalctl --sync
+journalctl --rotate
+
+ls -l "/run/log/journal/$MACHINE_ID"
+
+max_size=$((1 * 1024 * 1024))
+total_size=$(du -sb "/run/log/journal/$MACHINE_ID" | cut -f1)
+if (( total_size < max_size )); then
+    echo "ERROR: runtime journal size is smaller than 1MB."
+    exit 1
+fi
+
+: "Reload with RuntimeMaxUse=1M."
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=volatile
+RuntimeMaxUse=1M
+EOF
+systemctl reload systemd-journald.service
+
+ls -l "/run/log/journal/$MACHINE_ID"
+
+: "Confirm that runtime journal size shrunk to <= 1MB."
+total_size=$(du -sb "/run/log/journal/$MACHINE_ID" | cut -f1)
+num_archived_journals=$(get_num_archived_journals run)
+if (( total_size > max_size )) && (( num_archived_journals > 0 )); then
+    echo "ERROR: Journal size exceeds RuntimeMaxUse= limit and exists archived journals."
+    exit 1
+fi
+
+: "Write a message to runtime journal"
+VAL=$(write_to_journal)
+verify_journals "$VAL" runtime
+
+: "Reload volatile->persistent"
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=persistent
+EOF
+systemctl reload systemd-journald.service
+
+: "Confirm that previous message is still in runtime journal."
+verify_journals "$VAL" runtime
+
+: "Confirm that new messages are written to runtime journal."
+VAL=$(write_to_journal)
+verify_journals "$VAL" runtime
+
+: "Confirm that flushing writes to system journal."
+journalctl --flush
+verify_journals "$VAL" persistent
+
+: "Disable compression"
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=persistent
+Compress=no
+EOF
+systemctl reload systemd-journald.service
+
+: "Write 2MB of data to volatile journal"
+set +x
+dd if=/dev/urandom bs=1M count=2 | base64 | systemd-cat -t "$SYSLOG_ID"
+set -x
+journalctl --sync
+
+max_size=$((1 * 1024 * 1024))
+total_size=$(du -sb "/var/log/journal/$MACHINE_ID" | cut -f1)
+if (( total_size < max_size )); then
+    echo "ERROR: volatile journal size is smaller than 1MB."
+    exit 1
+fi
+
+: "Creating archive files."
+limit_var_journals=3
+for (( i = 0; i < limit_var_journals; i++ )); do
+    write_to_journal
+    journalctl --rotate
+done
+
+ls -l "/var/log/journal/$MACHINE_ID"
+
+num_archived_journals=$(get_num_archived_journals var)
+if (( num_archived_journals < limit_var_journals )); then
+    echo "ERROR: Number of archived system journal files is ${num_archived_journals} < ${limit_var_journals}."
+    exit 1
+fi
+
+: "Reload with less SystemMaxUse= and SystemMaxFiles=."
+cat <<EOF >/run/systemd/journald.conf.d/reload.conf
+[Journal]
+Storage=persistent
+RuntimeMaxUse=2M
+SystemMaxUse=1M
+SystemMaxFiles=3
+EOF
+systemctl reload systemd-journald.service
+
+ls -l "/var/log/journal/$MACHINE_ID"
+
+: "Check number of the system journal files"
+num_archived_journals=$(get_num_archived_journals var)
+if (( num_archived_journals >= limit_var_journals )); then
+    echo "ERROR: Number of system journal files is ${num_archived_journals} >= ${limit_var_journals}."
+    exit 1
+fi
+
+: "Check the size of the system journal"
+total_size=$(du -sb "/var/log/journal/$MACHINE_ID" | cut -f1)
+if (( total_size > max_size )) && (( num_archived_journals > 0)); then
+    echo "ERROR: Journal size exceeds SystemMaxUse limit and there exist archived journals."
+    exit 1
+fi