mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
Merge pull request #13384 from yuwata/core-runtime-directory-preserve
core: make RuntimeDirectoryPreserve= works with non-service units
This commit is contained in:
commit
3a5a08bbb4
@ -826,7 +826,7 @@ static void mount_enter_dead(Mount *m, MountResult f) {
|
||||
|
||||
m->exec_runtime = exec_runtime_unref(m->exec_runtime, true);
|
||||
|
||||
exec_context_destroy_runtime_directory(&m->exec_context, UNIT(m)->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
|
||||
unit_destroy_runtime_directory(UNIT(m), &m->exec_context);
|
||||
|
||||
unit_unref_uid_gid(UNIT(m), true);
|
||||
|
||||
@ -1996,6 +1996,8 @@ const UnitVTable mount_vtable = {
|
||||
.active_state = mount_active_state,
|
||||
.sub_state_to_string = mount_sub_state_to_string,
|
||||
|
||||
.will_restart = unit_will_restart_default,
|
||||
|
||||
.may_gc = mount_may_gc,
|
||||
|
||||
.sigchld_event = mount_sigchld_event,
|
||||
|
@ -1721,12 +1721,8 @@ static bool service_will_restart(Unit *u) {
|
||||
return true;
|
||||
if (s->state == SERVICE_AUTO_RESTART)
|
||||
return true;
|
||||
if (!UNIT(s)->job)
|
||||
return false;
|
||||
if (UNIT(s)->job->type == JOB_START)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
return unit_will_restart_default(u);
|
||||
}
|
||||
|
||||
static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart) {
|
||||
@ -1789,10 +1785,8 @@ static void service_enter_dead(Service *s, ServiceResult f, bool allow_restart)
|
||||
/* We want fresh tmpdirs in case service is started again immediately */
|
||||
s->exec_runtime = exec_runtime_unref(s->exec_runtime, true);
|
||||
|
||||
if (s->exec_context.runtime_directory_preserve_mode == EXEC_PRESERVE_NO ||
|
||||
(s->exec_context.runtime_directory_preserve_mode == EXEC_PRESERVE_RESTART && !service_will_restart(UNIT(s))))
|
||||
/* Also, remove the runtime directory */
|
||||
exec_context_destroy_runtime_directory(&s->exec_context, UNIT(s)->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
|
||||
unit_destroy_runtime_directory(UNIT(s), &s->exec_context);
|
||||
|
||||
/* Get rid of the IPC bits of the user */
|
||||
unit_unref_uid_gid(UNIT(s), true);
|
||||
|
@ -2035,7 +2035,7 @@ static void socket_enter_dead(Socket *s, SocketResult f) {
|
||||
|
||||
s->exec_runtime = exec_runtime_unref(s->exec_runtime, true);
|
||||
|
||||
exec_context_destroy_runtime_directory(&s->exec_context, UNIT(s)->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
|
||||
unit_destroy_runtime_directory(UNIT(s), &s->exec_context);
|
||||
|
||||
unit_unref_uid_gid(UNIT(s), true);
|
||||
|
||||
@ -3353,6 +3353,8 @@ const UnitVTable socket_vtable = {
|
||||
.active_state = socket_active_state,
|
||||
.sub_state_to_string = socket_sub_state_to_string,
|
||||
|
||||
.will_restart = unit_will_restart_default,
|
||||
|
||||
.may_gc = socket_may_gc,
|
||||
|
||||
.sigchld_event = socket_sigchld_event,
|
||||
|
@ -683,7 +683,7 @@ static void swap_enter_dead(Swap *s, SwapResult f) {
|
||||
|
||||
s->exec_runtime = exec_runtime_unref(s->exec_runtime, true);
|
||||
|
||||
exec_context_destroy_runtime_directory(&s->exec_context, UNIT(s)->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
|
||||
unit_destroy_runtime_directory(UNIT(s), &s->exec_context);
|
||||
|
||||
unit_unref_uid_gid(UNIT(s), true);
|
||||
|
||||
@ -1529,6 +1529,8 @@ const UnitVTable swap_vtable = {
|
||||
.active_state = swap_active_state,
|
||||
.sub_state_to_string = swap_sub_state_to_string,
|
||||
|
||||
.will_restart = unit_will_restart_default,
|
||||
|
||||
.may_gc = swap_may_gc,
|
||||
|
||||
.sigchld_event = swap_sigchld_event,
|
||||
|
@ -4069,6 +4069,17 @@ bool unit_active_or_pending(Unit *u) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool unit_will_restart_default(Unit *u) {
|
||||
assert(u);
|
||||
|
||||
if (!u->job)
|
||||
return false;
|
||||
if (u->job->type == JOB_START)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool unit_will_restart(Unit *u) {
|
||||
assert(u);
|
||||
|
||||
@ -5880,6 +5891,12 @@ int unit_test_trigger_loaded(Unit *u) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void unit_destroy_runtime_directory(Unit *u, const ExecContext *context) {
|
||||
if (context->runtime_directory_preserve_mode == EXEC_PRESERVE_NO ||
|
||||
(context->runtime_directory_preserve_mode == EXEC_PRESERVE_RESTART && !unit_will_restart(u)))
|
||||
exec_context_destroy_runtime_directory(context, u->manager->prefix[EXEC_DIRECTORY_RUNTIME]);
|
||||
}
|
||||
|
||||
int unit_clean(Unit *u, ExecCleanMask mask) {
|
||||
UnitActiveState state;
|
||||
|
||||
|
@ -752,6 +752,7 @@ const char *unit_slice_name(Unit *u);
|
||||
bool unit_stop_pending(Unit *u) _pure_;
|
||||
bool unit_inactive_or_pending(Unit *u) _pure_;
|
||||
bool unit_active_or_pending(Unit *u);
|
||||
bool unit_will_restart_default(Unit *u);
|
||||
bool unit_will_restart(Unit *u);
|
||||
|
||||
int unit_add_default_target_dependency(Unit *u, Unit *target);
|
||||
@ -860,6 +861,7 @@ int unit_failure_action_exit_status(Unit *u);
|
||||
|
||||
int unit_test_trigger_loaded(Unit *u);
|
||||
|
||||
void unit_destroy_runtime_directory(Unit *u, const ExecContext *context);
|
||||
int unit_clean(Unit *u, ExecCleanMask mask);
|
||||
int unit_can_clean(Unit *u, ExecCleanMask *ret_mask);
|
||||
|
||||
|
1
test/TEST-37-RUNTIMEDIRECTORYPRESERVE/Makefile
Symbolic link
1
test/TEST-37-RUNTIMEDIRECTORYPRESERVE/Makefile
Symbolic link
@ -0,0 +1 @@
|
||||
../TEST-01-BASIC/Makefile
|
44
test/TEST-37-RUNTIMEDIRECTORYPRESERVE/test.sh
Executable file
44
test/TEST-37-RUNTIMEDIRECTORYPRESERVE/test.sh
Executable file
@ -0,0 +1,44 @@
|
||||
#!/bin/bash
|
||||
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
set -e
|
||||
TEST_DESCRIPTION="test RuntimeDirectoryPreserve=yes"
|
||||
|
||||
. $TEST_BASE_DIR/test-functions
|
||||
|
||||
test_setup() {
|
||||
create_empty_image_rootdir
|
||||
|
||||
(
|
||||
LOG_LEVEL=5
|
||||
eval $(udevadm info --export --query=env --name=${LOOPDEV}p2)
|
||||
|
||||
setup_basic_environment
|
||||
|
||||
# mask some services that we do not want to run in these tests
|
||||
ln -fs /dev/null $initdir/etc/systemd/system/systemd-hwdb-update.service
|
||||
ln -fs /dev/null $initdir/etc/systemd/system/systemd-journal-catalog-update.service
|
||||
ln -fs /dev/null $initdir/etc/systemd/system/systemd-networkd.service
|
||||
ln -fs /dev/null $initdir/etc/systemd/system/systemd-networkd.socket
|
||||
ln -fs /dev/null $initdir/etc/systemd/system/systemd-resolved.service
|
||||
ln -fs /dev/null $initdir/etc/systemd/system/systemd-machined.service
|
||||
|
||||
# setup the testsuite service
|
||||
cat >$initdir/etc/systemd/system/testsuite.service <<EOF
|
||||
[Unit]
|
||||
Description=Testsuite service
|
||||
|
||||
[Service]
|
||||
ExecStart=/bin/bash -x /testsuite.sh
|
||||
Type=oneshot
|
||||
StandardOutput=tty
|
||||
StandardError=tty
|
||||
EOF
|
||||
cp testsuite.sh $initdir/
|
||||
|
||||
setup_testsuite
|
||||
) || return 1
|
||||
setup_nspawn_root
|
||||
}
|
||||
|
||||
do_test "$@"
|
19
test/TEST-37-RUNTIMEDIRECTORYPRESERVE/testsuite.sh
Executable file
19
test/TEST-37-RUNTIMEDIRECTORYPRESERVE/testsuite.sh
Executable file
@ -0,0 +1,19 @@
|
||||
#!/bin/bash
|
||||
# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
||||
# ex: ts=8 sw=4 sts=4 et filetype=sh
|
||||
set -ex
|
||||
set -o pipefail
|
||||
|
||||
systemd-mount -p RuntimeDirectory=hoge -p RuntimeDirectoryPreserve=yes -t tmpfs tmpfs /tmp/aaa
|
||||
|
||||
touch /run/hoge/foo
|
||||
touch /tmp/aaa/bbb
|
||||
|
||||
systemctl restart tmp-aaa.mount
|
||||
|
||||
test -e /run/hoge/foo
|
||||
! test -e /tmp/aaa/bbb
|
||||
|
||||
echo OK > /testok
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user