iscsid: Change iscsid service PIDFile to /run/iscsid.ipd

The pid file has be changed from /var/run/iscsid.pid to
/run/iscsid.pid in code, here perform a sync.

Signed-off-by: Wenchao Hao <haowenchao@huawei.com>
This commit is contained in:
Wenchao Hao 2020-12-12 17:16:06 +08:00
parent 032598196b
commit c30f286c34
3 changed files with 36 additions and 297 deletions

View File

@ -1,296 +0,0 @@
From 5a5e63101a9428567767efb50fe5cd60f8f39cea Mon Sep 17 00:00:00 2001
From: wangjufeng <wangjufeng@huawei.com>
Date: Sat, 20 Oct 2018 14:50:28 +0800
Subject: [PATCH] tt
---
usr/event_poll.c | 17 +++++++-
usr/iscsid.c | 2 +-
usr/log.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
usr/log.h | 6 +++
4 files changed, 144 insertions(+), 5 deletions(-)
diff --git a/usr/event_poll.c b/usr/event_poll.c
index 4cf4ce2..7b70cb7 100644
--- a/usr/event_poll.c
+++ b/usr/event_poll.c
@@ -151,8 +151,11 @@ void event_loop_exit(queue_task_t *qtask)
void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd)
{
- struct pollfd poll_array[POLL_MAX];
+ struct pollfd poll_array[POLL_MAX + 1];
int res, has_shutdown_children = 0;
+ int log_timerfd = log_get_timerfd();
+ int pool_count = POLL_MAX;
+ int poll_timerfd_index = -1;
sigset_t sigset;
int sig_fd;
@@ -174,6 +177,13 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd)
poll_array[POLL_ALARM].fd = sig_fd;
poll_array[POLL_ALARM].events = POLLIN;
+ if (log_timerfd >= 0) {
+ poll_array[POLL_MAX].fd = log_timerfd;
+ poll_array[POLL_MAX].events = POLLIN;
+ poll_timerfd_index = POLL_MAX;
+ pool_count += 1;
+ }
+
event_loop_stop = 0;
while (1) {
if (event_loop_stop) {
@@ -188,7 +198,7 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd)
/* Runs actors and may set alarm for future actors */
actor_poll();
- res = poll(poll_array, POLL_MAX, reap_count ? REAP_WAKEUP : -1);
+ res = poll(poll_array, pool_count, reap_count ? REAP_WAKEUP : -1);
if (res > 0) {
log_debug(6, "poll result %d", res);
@@ -198,6 +208,9 @@ void event_loop(struct iscsi_ipc *ipc, int control_fd, int mgmt_ipc_fd)
if (poll_array[POLL_IPC].revents)
mgmt_ipc_handle(mgmt_ipc_fd);
+ if(log_timerfd >= 0 && poll_array[poll_timerfd_index].revents)
+ log_watchdog_handle();
+
if (poll_array[POLL_ALARM].revents) {
struct signalfd_siginfo si;
diff --git a/usr/iscsid.c b/usr/iscsid.c
index c9ab9eb..56689e5 100644
--- a/usr/iscsid.c
+++ b/usr/iscsid.c
@@ -62,7 +62,6 @@ struct iscsi_daemon_config daemon_config;
struct iscsi_daemon_config *dconfig = &daemon_config;
static char program_name[] = "iscsid";
-static pid_t log_pid;
static gid_t gid;
static int daemonize = 1;
static int mgmt_ipc_fd;
@@ -307,6 +306,7 @@ static void iscsid_shutdown(void)
log_debug(1, "daemon stopping");
log_close(log_pid);
}
+ log_close_watchdog_timer();
}
static void catch_signal(int signo)
diff --git a/usr/log.c b/usr/log.c
index 6e16e7c..c225bdc 100644
--- a/usr/log.c
+++ b/usr/log.c
@@ -18,6 +18,7 @@
#include <sys/types.h>
#include <sys/types.h>
#include <sys/wait.h>
+#include <sys/timerfd.h>
#include "iscsi_util.h"
#include "log.h"
@@ -35,6 +36,13 @@ char *log_name;
int log_level = 0;
struct logarea *la = NULL;
+pid_t log_pid = -1;
+static int default_watchdog_timeout = 4;
+static char program_name[] = "iscsid";
+static int watchdog_timerfd = -1;
+static int last_watchdog_count = 0;
+static int watchdog_noupdate_count = 0;
+
static int log_stop_daemon = 0;
static void (*log_func)(int prio, void *priv, const char *fmt, va_list ap);
static void *log_func_priv;
@@ -142,6 +150,7 @@ static int logarea_init (int size)
la->shmid_buff = shmid;
la->ops[0].sem_num = 0;
la->ops[0].sem_flg = 0;
+ la->watchdog_count = 0;
return 0;
@@ -421,6 +430,105 @@ static void __log_close(void)
}
}
+static int log_restart_daemon(void)
+{
+ log_close(log_pid);
+ log_pid = log_init(program_name, DEFAULT_AREA_SIZE, log_do_log_daemon, NULL);
+ if (log_pid < 0)
+ return -1;
+ return 0;
+}
+
+static int log_watchdog_setup(void)
+{
+ int r;
+ struct itimerspec new_value;
+ uint32_t period_inus = 1 * 1000000; /*1 second*/
+ uint32_t seconds;
+ uint32_t nanoseconds;
+ if (log_stop_daemon || watchdog_timerfd >= 0)
+ return 0;
+
+ watchdog_timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK | TFD_CLOEXEC);
+ if (watchdog_timerfd < 0) {
+ syslog(LOG_ERR, "Create watchdog timer failed. errno: %d", errno);
+ return -1;
+ }
+ seconds = period_inus / 1000000;
+ nanoseconds = (period_inus - (seconds * 1000000)) * 1000;
+ new_value.it_interval.tv_sec = seconds;
+ new_value.it_interval.tv_nsec = nanoseconds;
+ new_value.it_value.tv_sec = seconds;
+ new_value.it_value.tv_nsec = nanoseconds;
+
+ r = timerfd_settime(watchdog_timerfd, 0, &new_value, NULL);
+ if (r < 0) {
+ syslog(LOG_ERR, "Set watchdog timer failed. errno: %d", errno);
+ log_close_watchdog_timer();
+ return -1;
+ }
+ return 0;
+}
+
+static int log_read_comm_frpm_pid(pid_t pid, char *buffer, int len)
+{
+ char comm_file[256];
+ char comm_content[1024];
+ int r;
+ FILE *fd = NULL;
+ buffer[0] = '\0';
+ snprintf(comm_file, sizeof(comm_file), "/proc/%i/comm", pid);
+ fd = fopen(comm_file, "r");
+ if (!fd)
+ return -1;
+ if (!fgets(buffer, len, fd)) {
+ log_warning("Can not read file. File:%s.", comm_file);
+ fclose(fd);
+ fd = NULL;
+ return -1;
+ }
+ fclose(fd);
+ fd = NULL;
+ return 0;
+}
+
+int log_get_timerfd(void)
+{
+ return watchdog_timerfd;
+}
+
+void log_close_watchdog_timer(void)
+{
+ if(watchdog_timerfd >= 0) {
+ close(watchdog_timerfd);
+ watchdog_timerfd = -1;
+ }
+}
+
+void log_watchdog_handle(void)
+{
+ uint64_t expir = 0;
+ int len;
+ int new_watchdog_count;
+ len = read(watchdog_timerfd, &expir, sizeof(uint64_t));
+ if(len > 0 && expir > 0) {
+ if (la && !log_stop_daemon) {
+ new_watchdog_count = la->watchdog_count;
+ if (new_watchdog_count == last_watchdog_count) {
+ watchdog_noupdate_count++;
+ if (watchdog_noupdate_count >= default_watchdog_timeout) {
+ watchdog_noupdate_count = 0;
+ syslog(LOG_ERR, "log daemon is not alive, try to restart.");
+ log_restart_daemon();
+ }
+ } else {
+ watchdog_noupdate_count = 0;
+ last_watchdog_count = new_watchdog_count;
+ }
+ }
+ }
+}
+
int log_init(char *program_name, int size,
void (*func)(int prio, void *priv, const char *fmt, va_list ap),
void *priv)
@@ -443,6 +551,8 @@ int log_init(char *program_name, int size,
return -1;
}
+ log_watchdog_setup();
+
pid = fork();
if (pid < 0) {
syslog(LOG_ERR, "starting logger failed");
@@ -463,6 +573,8 @@ int log_init(char *program_name, int size,
sigaction(SIGTERM, &sa_new, &sa_old );
while(1) {
+ if (la)
+ la->watchdog_count++;
log_flush();
sleep(1);
@@ -487,7 +599,15 @@ void log_close(pid_t pid)
}
if (pid > 0) {
- kill(pid, SIGTERM);
- waitpid(pid, &status, 0);
+ char comm[1024];
+ int r;
+ r = log_read_comm_frpm_pid(pid, comm, sizeof(comm));
+ if (!r && strstr(comm, "iscsid")) {
+ syslog(LOG_WARNING, "Send SIGTERM to iSCSI logger, pid=%i.", pid);
+ kill(pid, SIGTERM);
+ waitpid(pid, &status, 0);
+ } else {
+ syslog(LOG_WARNING, "iSCSI logger with pid=%i already exited.", pid);
+ }
}
}
diff --git a/usr/log.h b/usr/log.h
index c548791..6affd3b 100644
--- a/usr/log.h
+++ b/usr/log.h
@@ -28,6 +28,7 @@
#include <stdarg.h>
#include <sys/types.h>
+#include <stdint.h>
#include "iscsid.h"
union semun {
@@ -42,6 +43,7 @@ union semun {
#define MAX_MSG_SIZE 256
extern int log_level;
+extern pid_t log_pid;
struct logmsg {
short int prio;
@@ -62,10 +64,14 @@ struct logarea {
struct sembuf ops[1];
int semid;
union semun semarg;
+ uint64_t watchdog_count;
};
extern struct logarea *la;
+extern int log_get_timerfd(void);
+extern void log_close_watchdog_time(void);
+extern void log_watchdog_handle(void);
extern int log_init(char *program_name, int size,
void (*func)(int prio, void *priv, const char *fmt, va_list ap),
void *priv);
--
1.8.3.1

View File

@ -0,0 +1,29 @@
From dafbd11b65b2bbceed1e9b72d6213ddea73a0a34 Mon Sep 17 00:00:00 2001
From: Wenchao Hao <haowenchao@huawei.com>
Date: Sat, 12 Dec 2020 17:09:34 +0800
Subject: [PATCH] iscsid: Change iscsid service PIDFile to /run/iscsid.ipd
The pid file has be changed from /var/run/iscsid.pid to
/run/iscsid.pid in code, here perform a sync.
Signed-off-by: Wenchao Hao <haowenchao@huawei.com>
---
etc/systemd/iscsid.service | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/etc/systemd/iscsid.service b/etc/systemd/iscsid.service
index 828877f..be3ae9e 100644
--- a/etc/systemd/iscsid.service
+++ b/etc/systemd/iscsid.service
@@ -6,7 +6,7 @@ DefaultDependencies=no
[Service]
Type=forking
-PIDFile=/var/run/iscsid.pid
+PIDFile=/run/iscsid.pid
ExecStart=/sbin/iscsid
ExecStopPost=/usr/bin/sleep 1
ExecStop=/sbin/iscsiadm -k 0 2
--
2.29.2.435.g72ffeb997e

View File

@ -4,7 +4,7 @@
Name: open-iscsi Name: open-iscsi
Version: 2.1.1 Version: 2.1.1
Release: 4 Release: 5
Summary: ISCSI software initiator daemon and utility programs Summary: ISCSI software initiator daemon and utility programs
License: GPLv2+ and BSD License: GPLv2+ and BSD
URL: http://www.open-iscsi.org URL: http://www.open-iscsi.org
@ -37,6 +37,7 @@ Patch25: 0025-Fix-issue-with-zero-length-arrays-at-end-of-struct.patch
Patch26: 0026-Fix-a-compiler-complaint-about-writing-one-byte.patch Patch26: 0026-Fix-a-compiler-complaint-about-writing-one-byte.patch
Patch27: 0027-iscsid-Check-Invalid-Session-id-for-stop-connection.patch Patch27: 0027-iscsid-Check-Invalid-Session-id-for-stop-connection.patch
Patch28: 0028-iscsiadm-buffer-overflow-regression-when-discovering.patch Patch28: 0028-iscsiadm-buffer-overflow-regression-when-discovering.patch
Patch29: 0029-iscsid-Change-iscsid-service-PIDFile-to-run-iscsid.i.patch
BuildRequires: flex bison doxygen kmod-devel systemd-units gcc git isns-utils-devel systemd-devel BuildRequires: flex bison doxygen kmod-devel systemd-units gcc git isns-utils-devel systemd-devel
BuildRequires: autoconf automake libtool libmount-devel openssl-devel pkg-config gdb BuildRequires: autoconf automake libtool libmount-devel openssl-devel pkg-config gdb
@ -169,6 +170,11 @@ fi
%{_mandir}/man8/* %{_mandir}/man8/*
%changelog %changelog
* Sat Dec 12 2020 haowenchao <haowenchao@huawei.com> - 2.1.1-5
- Change iscsid service PIDFile to /run/iscsid.ipd
The pid file has be changed from /var/run/iscsid.pid to
/run/iscsid.pid in code, here perform a sync.
* Thu Nov 12 2020 haowenchao <haowenchao@huawei.com> - 2.1.1-4 * Thu Nov 12 2020 haowenchao <haowenchao@huawei.com> - 2.1.1-4
- backport patches from epoch2 including following changes: - backport patches from epoch2 including following changes:
get_random_bytes is replaced by RAND_bytes so it is removed get_random_bytes is replaced by RAND_bytes so it is removed