File 0008-reschedule-ptasks-on-clock-shift.patch of Package sssd.36868
From 289364c41563d190e1225b14e32228506fa4ea40 Mon Sep 17 00:00:00 2001
From: Samuel Cabrero <scabrero@suse.de>
Date: Wed, 4 Sep 2024 12:33:21 +0200
Subject: [PATCH 1/5] BE: Maintain the list of periodic tasks
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
---
src/providers/backend.h | 3 +++
src/providers/be_ptask.c | 11 +++++++++++
src/providers/be_ptask.h | 1 +
src/providers/be_ptask_private.h | 3 +++
4 files changed, 18 insertions(+)
diff --git a/src/providers/backend.h b/src/providers/backend.h
index abf0e9164..3a2982c46 100644
--- a/src/providers/backend.h
+++ b/src/providers/backend.h
@@ -118,6 +118,9 @@ struct be_ctx {
* DP_ERR_OK or DP_ERR_OFFLINE. The only usage of this var, so far, is
* to log the DP status without spamming the syslog/journal. */
int last_dp_state;
+
+ /* List of periodic tasks */
+ struct be_ptask *tasks;
};
bool be_is_offline(struct be_ctx *ctx);
diff --git a/src/providers/be_ptask.c b/src/providers/be_ptask.c
index b351a58fb..9cc7971bc 100644
--- a/src/providers/be_ptask.c
+++ b/src/providers/be_ptask.c
@@ -51,6 +51,8 @@ static int be_ptask_destructor(void *pvt)
return 0;
}
+ DLIST_REMOVE(task->be_ctx->tasks, task);
+
DEBUG(SSSDBG_TRACE_FUNC, "Terminating periodic task [%s]\n", task->name);
return 0;
@@ -351,6 +353,8 @@ errno_t be_ptask_create(TALLOC_CTX *mem_ctx,
talloc_set_destructor((TALLOC_CTX*)task, be_ptask_destructor);
+ DLIST_ADD(be_ctx->tasks, task);
+
if (flags & BE_PTASK_OFFLINE_DISABLE) {
/* install offline and online callbacks */
ret = be_add_online_cb(task, be_ctx, be_ptask_online_cb, task, NULL);
@@ -432,6 +436,13 @@ void be_ptask_postpone(struct be_ptask *task)
be_ptask_schedule(task, BE_PTASK_PERIOD, BE_PTASK_SCHEDULE_FROM_NOW);
}
+void be_ptask_postpone_all(struct be_ctx *be_ctx) {
+ struct be_ptask *task = NULL;
+ DLIST_FOR_EACH(task, be_ctx->tasks) {
+ be_ptask_postpone(task);
+ }
+}
+
void be_ptask_destroy(struct be_ptask **task)
{
talloc_zfree(*task);
diff --git a/src/providers/be_ptask.h b/src/providers/be_ptask.h
index 0c5f1fb7f..9928b855d 100644
--- a/src/providers/be_ptask.h
+++ b/src/providers/be_ptask.h
@@ -143,6 +143,7 @@ errno_t be_ptask_create_sync(TALLOC_CTX *mem_ctx,
void be_ptask_enable(struct be_ptask *task);
void be_ptask_disable(struct be_ptask *task);
void be_ptask_postpone(struct be_ptask *task);
+void be_ptask_postpone_all(struct be_ctx *be_ctx);
void be_ptask_destroy(struct be_ptask **task);
time_t be_ptask_get_period(struct be_ptask *task);
diff --git a/src/providers/be_ptask_private.h b/src/providers/be_ptask_private.h
index 397193588..9b90e32ed 100644
--- a/src/providers/be_ptask_private.h
+++ b/src/providers/be_ptask_private.h
@@ -42,6 +42,9 @@ struct be_ptask {
struct tevent_timer *timer; /* active tevent timer */
uint32_t flags;
bool enabled;
+
+ struct be_ptask *prev;
+ struct be_ptask *next;
};
#endif /* DP_PTASK_PRIVATE_H_ */
--
2.46.0
From 9d195c9c443968aaa36bdbbc0b1924b0b1db36d8 Mon Sep 17 00:00:00 2001
From: Samuel Cabrero <scabrero@suse.de>
Date: Wed, 18 Sep 2024 14:13:01 +0200
Subject: [PATCH 2/5] WATCHDOG: Use a constant instead of the signal name
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
---
src/util/util.h | 2 ++
src/util/util_watchdog.c | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/util/util.h b/src/util/util.h
index e0e122cee..02b0b4a27 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -221,6 +221,8 @@ int server_setup(const char *name, bool is_responder,
void server_loop(struct main_context *main_ctx);
void orderly_shutdown(int status);
+#define SSSSIG_RESET_WATCHDOG SIGRTMIN
+
/* from signal.c */
void BlockSignals(bool block, int signum);
void (*CatchSignal(int signum,void (*handler)(int )))(int);
diff --git a/src/util/util_watchdog.c b/src/util/util_watchdog.c
index abafd94b9..9d6c1425c 100644
--- a/src/util/util_watchdog.c
+++ b/src/util/util_watchdog.c
@@ -175,7 +175,7 @@ int setup_watchdog(struct tevent_context *ev, int interval)
struct sigevent sev;
struct itimerspec its;
struct tevent_fd *tfd;
- int signum = SIGRTMIN;
+ int signum = SSSSIG_RESET_WATCHDOG;
int ret;
memset(&sev, 0, sizeof(sev));
--
2.46.0
From da906c540b6da7468278e33b704b6e201b41ce2b Mon Sep 17 00:00:00 2001
From: Samuel Cabrero <scabrero@suse.de>
Date: Wed, 4 Sep 2024 12:35:03 +0200
Subject: [PATCH 3/5] WATCHDOG: Send SIGRTMIN+1 signal when clock shift is
detected
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
---
src/util/util.h | 1 +
src/util/util_watchdog.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/src/util/util.h b/src/util/util.h
index 02b0b4a27..4349d9233 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -222,6 +222,7 @@ void server_loop(struct main_context *main_ctx);
void orderly_shutdown(int status);
#define SSSSIG_RESET_WATCHDOG SIGRTMIN
+#define SSSSIG_TIME_SHIFT_DETECTED SIGRTMIN+1
/* from signal.c */
void BlockSignals(bool block, int signum);
diff --git a/src/util/util_watchdog.c b/src/util/util_watchdog.c
index 9d6c1425c..a6677359d 100644
--- a/src/util/util_watchdog.c
+++ b/src/util/util_watchdog.c
@@ -167,6 +167,8 @@ static void watchdog_fd_read_handler(struct tevent_context *ev,
if (strncmp(debug_prg_name, "be[", sizeof("be[") - 1) == 0) {
kill(getpid(), SIGUSR2);
DEBUG(SSSDBG_IMPORTANT_INFO, "SIGUSR2 sent to %s\n", debug_prg_name);
+ kill(getpid(), SSSSIG_TIME_SHIFT_DETECTED);
+ DEBUG(SSSDBG_IMPORTANT_INFO, "SSSSIG_TIME_SHIFT_DETECTED sent to %s\n", debug_prg_name);
}
}
--
2.46.0
From 4a9513e7b977b091db73fe5532792fe00e8701c8 Mon Sep 17 00:00:00 2001
From: Samuel Cabrero <scabrero@suse.de>
Date: Thu, 5 Sep 2024 12:13:04 +0200
Subject: [PATCH 4/5] BE: Handle SIGRTMIN+1 signal to reschedule periodic tasks
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
---
src/providers/data_provider_be.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/src/providers/data_provider_be.c b/src/providers/data_provider_be.c
index 9e961fa3f..9620db60a 100644
--- a/src/providers/data_provider_be.c
+++ b/src/providers/data_provider_be.c
@@ -472,6 +472,17 @@ static void signal_be_reset_offline(struct tevent_context *ev,
check_if_online(ctx, 0);
}
+static void signal_be_reschedule_tasks(struct tevent_context *ev,
+ struct tevent_signal *se,
+ int signum,
+ int count,
+ void *siginfo,
+ void *private_data)
+{
+ struct be_ctx *ctx = talloc_get_type(private_data, struct be_ctx);
+ be_ptask_postpone_all(ctx);
+}
+
static errno_t
be_register_monitor_iface(struct sbus_connection *conn, struct be_ctx *be_ctx)
{
@@ -736,6 +747,17 @@ static void dp_initialized(struct tevent_req *req)
goto done;
}
+ /* Handle SSSSIG_TIME_SHIFT_DETECTED (reschedule tasks) */
+ BlockSignals(false, SSSSIG_TIME_SHIFT_DETECTED);
+ tes = tevent_add_signal(be_ctx->ev, be_ctx, SSSSIG_TIME_SHIFT_DETECTED, 0,
+ signal_be_reschedule_tasks, be_ctx);
+ if (tes == NULL) {
+ DEBUG(SSSDBG_FATAL_FAILURE,
+ "Unable to setup SSSSIG_TIME_SHIFT_DETECTED handler\n");
+ ret = EIO;
+ goto done;
+ }
+
ret = chown_debug_file(NULL, be_ctx->uid, be_ctx->gid);
if (ret != EOK) {
DEBUG(SSSDBG_MINOR_FAILURE,
--
2.46.0
From 1cae0e57cc46fa5428a313d5a90efd51f5ea4cab Mon Sep 17 00:00:00 2001
From: Samuel Cabrero <scabrero@suse.de>
Date: Thu, 5 Sep 2024 12:29:23 +0200
Subject: [PATCH 5/5] MAN: Document SIGRTMIN+1 signal usage
Signed-off-by: Samuel Cabrero <scabrero@suse.de>
---
src/man/sssd.8.xml | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/src/man/sssd.8.xml b/src/man/sssd.8.xml
index 5f507c631..3876b837c 100644
--- a/src/man/sssd.8.xml
+++ b/src/man/sssd.8.xml
@@ -183,6 +183,18 @@
</para>
</listitem>
</varlistentry>
+ <varlistentry>
+ <term>SIGRTMIN+1</term>
+ <listitem>
+ <para>
+ Tells the SSSD to reschedule the periodic tasks. The
+ internal watchdog sends this signal to the providers
+ when a clock shift is detected although it can be sent
+ to any sssd_be process directly.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</refsect1>
--
2.46.0