mirror of
https://github.com/troglobit/finit.git
synced 2026-10-02 22:13:01 +07:00
Mark affected services as dirty if their rdeps are dirty
Provided a configuration that looks like this:
ospfd.conf:
service [2345] <!pid/zebra> log ospfd -A 127.0.0.1 -u root -g root -- OSPF daemon
zebra.conf:
service [2345] <!> log zebra -A 127.0.0.1 -u root -g root -- Zebra Routing daemon
If zebra.conf is changed, we restart it when `initctl reload` is issued.
This change ensures that ospfd is also restarted, because ospfd depends
on zebra, we must restart it too.
Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
@@ -162,26 +162,6 @@ int cond_set_path(const char *path, enum cond_state new)
|
|||||||
return new != old;
|
return new != old;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Has condition in configuration and cond is allowed? */
|
|
||||||
static int svc_has_cond(svc_t *svc)
|
|
||||||
{
|
|
||||||
if (!svc->cond[0])
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
switch (svc->type) {
|
|
||||||
case SVC_TYPE_SERVICE:
|
|
||||||
case SVC_TYPE_TASK:
|
|
||||||
case SVC_TYPE_RUN:
|
|
||||||
case SVC_TYPE_SYSV:
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void cond_update(const char *name)
|
static void cond_update(const char *name)
|
||||||
{
|
{
|
||||||
svc_t *svc, *iter = NULL;
|
svc_t *svc, *iter = NULL;
|
||||||
|
|||||||
@@ -697,6 +697,8 @@ int conf_reload(void)
|
|||||||
|
|
||||||
globfree(&gl);
|
globfree(&gl);
|
||||||
|
|
||||||
|
/* Mark any reverse deps as chenaged. */
|
||||||
|
service_update_rdeps();
|
||||||
done:
|
done:
|
||||||
/* Drop record of all .conf changes */
|
/* Drop record of all .conf changes */
|
||||||
drop_changes();
|
drop_changes();
|
||||||
|
|||||||
@@ -1250,6 +1250,38 @@ void service_monitor(pid_t lost, int status)
|
|||||||
sm_step(&sm);
|
sm_step(&sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void svc_mark_affected(char *cond)
|
||||||
|
{
|
||||||
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
|
if (!svc_has_cond(svc))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (cond_affects(cond, svc->cond))
|
||||||
|
svc_mark_dirty(svc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called on conf_reload() to update service reverse dependencies.
|
||||||
|
* E.g., if ospfd depends on zebra and the zebra Finit conf has
|
||||||
|
* changed, we need to mark the ospfd Finit conf as changed too.
|
||||||
|
*/
|
||||||
|
void service_update_rdeps(void)
|
||||||
|
{
|
||||||
|
svc_t *svc, *iter = NULL;
|
||||||
|
|
||||||
|
for (svc = svc_iterator(&iter, 1); svc; svc = svc_iterator(&iter, 0)) {
|
||||||
|
char cond[MAX_COND_LEN];
|
||||||
|
|
||||||
|
if (!svc_is_changed(svc))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
svc_mark_affected(mkcond(svc, cond, sizeof(cond)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void service_retry(svc_t *svc)
|
static void service_retry(svc_t *svc)
|
||||||
{
|
{
|
||||||
int timeout;
|
int timeout;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ void service_unregister (svc_t *svc);
|
|||||||
|
|
||||||
void service_runtask_clean (void);
|
void service_runtask_clean (void);
|
||||||
void service_reload_dynamic (void);
|
void service_reload_dynamic (void);
|
||||||
|
void service_update_rdeps (void);
|
||||||
|
|
||||||
int service_step (svc_t *svc);
|
int service_step (svc_t *svc);
|
||||||
void service_step_all (int types);
|
void service_step_all (int types);
|
||||||
|
|||||||
@@ -208,6 +208,26 @@ static inline void svc_missing (svc_t *svc) { if (svc) svc->block = SVC_BLOC
|
|||||||
static inline void svc_restarting (svc_t *svc) { if (svc) svc->block = SVC_BLOCK_RESTARTING; }
|
static inline void svc_restarting (svc_t *svc) { if (svc) svc->block = SVC_BLOCK_RESTARTING; }
|
||||||
static inline void svc_crashing (svc_t *svc) { if (svc) svc->block = SVC_BLOCK_CRASHING; }
|
static inline void svc_crashing (svc_t *svc) { if (svc) svc->block = SVC_BLOCK_CRASHING; }
|
||||||
|
|
||||||
|
/* Has condition in configuration and cond is allowed? */
|
||||||
|
static inline int svc_has_cond(svc_t *svc)
|
||||||
|
{
|
||||||
|
if (!svc->cond[0])
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
switch (svc->type) {
|
||||||
|
case SVC_TYPE_SERVICE:
|
||||||
|
case SVC_TYPE_TASK:
|
||||||
|
case SVC_TYPE_RUN:
|
||||||
|
case SVC_TYPE_SYSV:
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline char *svc_status(svc_t *svc)
|
static inline char *svc_status(svc_t *svc)
|
||||||
{
|
{
|
||||||
if (!svc)
|
if (!svc)
|
||||||
|
|||||||
Reference in New Issue
Block a user