40#include <linux/types.h>
41#include <linux/watchdog.h>
42#include <sys/reboot.h>
79static int wd_exec_exit_fn (
void);
83#define WD_DEFAULT_TIMEOUT_SEC 6
84#define WD_DEFAULT_TIMEOUT_MS (WD_DEFAULT_TIMEOUT_SEC * CS_TIME_MS_IN_SEC)
85#define WD_MIN_TIMEOUT_MS 500
86#define WD_MAX_TIMEOUT_MS (120 * CS_TIME_MS_IN_SEC)
91static int watchdog_ok = 1;
92static char *watchdog_device =
NULL;
95 .
name =
"corosync watchdog service",
98 .private_data_size = 0,
103 .lib_engine_count = 0,
105 .exec_engine_count = 0,
107 .exec_init_fn = wd_exec_init_fn,
108 .exec_exit_fn = wd_exec_exit_fn,
117static void wd_config_changed (
struct cs_fsm* fsm,
int32_t event,
void * data);
118static void wd_resource_failed (
struct cs_fsm* fsm,
int32_t event,
void * data);
151static const char * wd_res_state_to_str(
struct cs_fsm* fsm,
168static const char * wd_res_event_to_str(
struct cs_fsm* fsm,
241 if (last_updated == 0) {
256 "last_updated %"PRIu64" ms too late, period:%"PRIu64".",
272static void wd_config_changed (
struct cs_fsm* fsm,
int32_t event,
void * data)
297 "Could NOT use poll_period:%"PRIu64" ms for resource %s",
307 "resource %s missing a recovery key.",
ref->name);
316 "resource %s missing a state key.",
ref->name);
320 if (
ref->check_timer) {
322 ref->check_timer = 0;
329 ref, wd_resource_check_fn, &
ref->check_timer);
335static void wd_resource_failed (
struct cs_fsm*
fsm,
int32_t event,
void * data)
339 if (
ref->check_timer) {
341 ref->check_timer = 0;
345 ref->recovery, (
char*)
ref->name);
346 if (
strcmp (
ref->recovery,
"watchdog") == 0 ||
350 else if (
strcmp (
ref->recovery,
"reboot") == 0) {
353 else if (
strcmp (
ref->recovery,
"shutdown") == 0) {
359static void wd_key_changed(
361 const char *key_name,
394 "resource \"%s\" deleted from cmap!",
398 ref->check_timer = 0;
414 ref, wd_resource_check_fn, &
ref->check_timer);
430 ref->check_timer = 0;
433 ref->fsm.name =
ref->name;
436 ref->fsm.curr_entry = 0;
438 ref->fsm.state_to_str = wd_res_state_to_str;
439 ref->fsm.event_to_str = wd_res_event_to_str;
449 "Could NOT use poll_period:%"PRIu64" ms for resource %s",
464 "resource %s missing a recovery key.",
ref->name);
472 "resource %s missing a state key.",
ref->name);
480 ref->last_updated = 0;
491 wd_resource_check_fn, &
ref->check_timer);
498static void wd_tickle_fn (
void*
arg)
507 wd_tickle_fn, &wd_timer);
515static void wd_resource_created_cb(
517 const char *key_name,
544static void wd_scan_resources (
void)
549 const char *key_name;
586static void watchdog_timeout_apply (
uint32_t new)
599 watchdog_timeout =
new;
611 if (watchdog_timeout ==
new) {
618 wd_tickle_fn, &wd_timer);
624 "Could not change the Watchdog timeout from %d to %d seconds",
630static int setup_watchdog(
void)
644 watchdog_device =
str;
676 watchdog_timeout_apply (watchdog_timeout);
683static void wd_top_level_key_changed(
685 const char *key_name,
702 "Set watchdog_timeout is out of range (2..120).");
706static void watchdog_timeout_get_initial (
void)
724 "Set watchdog_timeout is out of range (2..120).");
744 watchdog_timeout_get_initial();
753static int wd_exec_exit_fn (
void)
qb_loop_timer_handle corosync_timer_handle_t
corosync_timer_handle_t
@ CS_LIB_FLOW_CONTROL_NOT_REQUIRED
#define MILLI_2_NANO_SECONDS
#define CS_TIME_MS_IN_SEC
#define CS_MAX_NAME_LENGTH
QB_LIST_DECLARE(cpg_pd_list_head)
#define corosync_exit_error(err)
@ COROSYNC_DONE_FATAL_ERR
#define CS_FSM_CB_EVENT_PROCESS_NF
#define CS_FSM_CB_EVENT_STATE_SET
#define CS_FSM_CB_EVENT_STATE_SET_NF
#define ICMAP_TRACK_MODIFY
cs_error_t icmap_get_uint32(const char *key_name, uint32_t *u32)
#define ICMAP_TRACK_DELETE
cs_error_t icmap_track_add(const char *key_name, int32_t track_type, icmap_notify_fn_t notify_fn, void *user_data, icmap_track_t *icmap_track)
Add tracking function for given key_name.
#define ICMAP_TRACK_PREFIX
Whole prefix is tracked, instead of key only (so "totem." tracking means that "totem....
icmap_iter_t icmap_iter_init(const char *prefix)
Initialize iterator with given prefix.
const char * icmap_iter_next(icmap_iter_t iter, size_t *value_len, icmap_value_types_t *type)
Return next item in iterator iter.
qb_map_iter_t * icmap_iter_t
Itterator type.
void icmap_iter_finalize(icmap_iter_t iter)
Finalize iterator.
cs_error_t icmap_track_delete(icmap_track_t icmap_track)
Remove previously added track.
cs_error_t icmap_set_uint64(const char *key_name, uint64_t value)
#define ICMAP_KEYNAME_MAXLEN
Maximum length of key in icmap.
cs_error_t icmap_set_uint32(const char *key_name, uint32_t value)
cs_error_t icmap_get_uint64(const char *key_name, uint64_t *u64)
cs_error_t icmap_get_string(const char *key_name, char **str)
Shortcut for icmap_get for string type.
#define LOGSYS_LEVEL_ERROR
#define log_printf(level, format, args...)
#define LOGSYS_LEVEL_INFO
#define LOGSYS_LEVEL_CRIT
#define LOGSYS_DECLARE_SUBSYS(subsys)
The LOGSYS_DECLARE_SUBSYS macro.
#define LOGSYS_LEVEL_WARNING
#define LOGSYS_LEVEL_DEBUG
#define LOGSYS_LEVEL_ALERT
The corosync_api_v1 struct.
int(* timer_add_duration)(unsigned long long nanoseconds_in_future, void *data, void(*timer_nf)(void *data), corosync_timer_handle_t *handle)
void(* timer_delete)(corosync_timer_handle_t timer_handle)
The corosync_service_engine struct.
cs_fsm_state_to_str_fn state_to_str
struct cs_fsm_entry * table
cs_fsm_event_to_str_fn event_to_str
Structure passed as new_value and old_value in change callback.
icmap_track_t icmap_track
corosync_timer_handle_t check_timer
char name[CS_MAX_NAME_LENGTH]
char res_path[ICMAP_KEYNAME_MAXLEN]
#define WD_MIN_TIMEOUT_MS
const char * wd_running_str
#define WD_DEFAULT_TIMEOUT_SEC
struct corosync_service_engine wd_service_engine
const char * wd_failure_str
struct cs_fsm_entry wd_fsm_table[]
const char * wd_config_changed_str
@ WD_RESOURCE_STATE_UNKNOWN
@ WD_RESOURCE_NOT_MONITORED
const char * wd_stopped_str
#define WD_MAX_TIMEOUT_MS
struct corosync_service_engine * wd_get_service_engine_ver0(void)
#define WD_DEFAULT_TIMEOUT_MS
const char * wd_failed_str