Compare commits

..

No commits in common. 'i8c-beta' and 'c9' have entirely different histories.
i8c-beta ... c9

@ -1,308 +0,0 @@
From acc0021a9490ae4964c08a6839308efa2709f926 Mon Sep 17 00:00:00 2001
From: David Teigland <teigland@redhat.com>
Date: Tue, 16 Jan 2024 11:01:01 -0600
Subject: [PATCH] wdmd: adjust values for iTCO_wdt
iTCO_wdt does not fire until two successive timeouts, so the
values for set/get need to be adjusted by a factor or 2 to
make the watchdog fire at the correct time.
---
wdmd/main.c | 162 ++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 139 insertions(+), 23 deletions(-)
diff --git a/wdmd/main.c b/wdmd/main.c
index aebacbea1ead..de54e6ddcdf1 100644
--- a/wdmd/main.c
+++ b/wdmd/main.c
@@ -31,6 +31,7 @@
#include <sys/un.h>
#include <sys/stat.h>
#include <sys/mman.h>
+#include <sys/time.h>
#include <sys/signalfd.h>
#include <linux/watchdog.h>
@@ -55,6 +56,7 @@
#define DEFAULT_SOCKET_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
#define WDPATH_SIZE 64
+#define WD_ID_SIZE 64
static int test_interval = DEFAULT_TEST_INTERVAL;
static int fire_timeout = DEFAULT_FIRE_TIMEOUT;
@@ -68,6 +70,8 @@ static time_t last_closeunclean;
static char lockfile_path[PATH_MAX];
static int dev_fd = -1;
static int shm_fd;
+static int forcefire;
+static int itco; /* watchdog_identity is "iTCO_wdt" */
static int allow_scripts;
static int kill_script_sec;
@@ -75,6 +79,7 @@ static const char *scripts_dir = "/etc/wdmd.d";
static char watchdog_path[WDPATH_SIZE];
static char option_path[WDPATH_SIZE];
static char saved_path[WDPATH_SIZE];
+static char watchdog_identity[WD_ID_SIZE];
struct script_status {
uint64_t start;
@@ -141,6 +146,19 @@ static uint64_t monotime(void)
return ts.tv_sec;
}
+char time_str_buf[128];
+
+static char *time_str(void)
+{
+ struct timeval cur_time;
+ struct tm time_info;
+
+ gettimeofday(&cur_time, NULL);
+ localtime_r(&cur_time.tv_sec, &time_info);
+ strftime(time_str_buf, sizeof(time_str_buf), "%Y-%m-%d %H:%M:%S ", &time_info);
+ return time_str_buf;
+}
+
/*
* test clients
*/
@@ -979,6 +997,49 @@ static void close_watchdog(void)
dev_fd = -1;
}
+static int setup_identity(char *wdpath)
+{
+ char sysfs_path[PATH_MAX] = { 0 };
+ char *base, *p;
+ int fd, rv;
+
+ /*
+ * This function will be called multiple times when probing
+ * different watchdog paths for one that works.
+ */
+ itco = 0;
+ memset(watchdog_identity, 0, sizeof(watchdog_identity));
+
+ /*
+ * $ cat /sys/class/watchdog/watchdog0/identity
+ * iTCO_wdt
+ */
+ if (!(base = basename(wdpath)))
+ return -1;
+
+ snprintf(sysfs_path, PATH_MAX-1, "/sys/class/watchdog/%s/identity", base);
+
+ if ((fd = open(sysfs_path, O_RDONLY)) < 0)
+ return -1;
+
+ rv = read(fd, watchdog_identity, WD_ID_SIZE-1);
+
+ close(fd);
+
+ if (rv <= 0)
+ return -1;
+
+ if ((p = strchr(watchdog_identity, '\n')))
+ *p = '\0';
+
+ log_debug("%s %s %s", wdpath, sysfs_path, watchdog_identity);
+
+ if (!strcmp(watchdog_identity, "iTCO_wdt"))
+ itco = 1;
+
+ return 0;
+}
+
static int _setup_watchdog(char *path)
{
struct stat buf;
@@ -991,6 +1052,8 @@ static int _setup_watchdog(char *path)
if (rv < 0)
return -1;
+ setup_identity(path); /* Sets watchdog_identity and itco */
+
rv = open_dev();
if (rv < 0)
return -1;
@@ -1004,10 +1067,15 @@ static int _setup_watchdog(char *path)
return -1;
}
- if (timeout == fire_timeout)
- goto out;
-
- timeout = fire_timeout;
+ if (itco) {
+ if ((2 * timeout) == fire_timeout)
+ goto out;
+ timeout = fire_timeout / 2;
+ } else {
+ if (timeout == fire_timeout)
+ goto out;
+ timeout = fire_timeout;
+ }
rv = ioctl(dev_fd, WDIOC_SETTIMEOUT, &timeout);
if (rv < 0) {
@@ -1016,13 +1084,20 @@ static int _setup_watchdog(char *path)
return -1;
}
- if (timeout != fire_timeout) {
- log_error("%s failed to set new timeout", watchdog_path);
- close_watchdog();
- return -1;
+ if (itco) {
+ if ((2 * timeout) != fire_timeout) {
+ log_error("%s failed to set new timeout", watchdog_path);
+ close_watchdog();
+ return -1;
+ }
+ } else {
+ if (timeout != fire_timeout) {
+ log_error("%s failed to set new timeout", watchdog_path);
+ close_watchdog();
+ return -1;
+ }
}
out:
- log_error("%s armed with fire_timeout %d", watchdog_path, fire_timeout);
/* TODO: save watchdog_path in /run/wdmd/saved_path,
* and in startup read that file, copying it to saved_path */
@@ -1102,6 +1177,8 @@ static int probe_dev(const char *path)
return -1;
}
+ setup_identity((char *)path); /* Sets watchdog_identity and itco */
+
fd = open(path, O_WRONLY | O_CLOEXEC);
if (fd < 0) {
fprintf(stderr, "error %d open %s\n", errno, path);
@@ -1117,14 +1194,22 @@ static int probe_dev(const char *path)
goto out;
}
- if (timeout == fire_timeout) {
- printf("%s\n", path);
- rv = 0;
- goto out;
+ if (itco) {
+ if ((2 * timeout) == fire_timeout) {
+ printf("%s\n", path);
+ rv = 0;
+ goto out;
+ }
+ timeout = fire_timeout / 2;
+ } else {
+ if (timeout == fire_timeout) {
+ printf("%s\n", path);
+ rv = 0;
+ goto out;
+ }
+ timeout = fire_timeout;
}
- timeout = fire_timeout;
-
rv = ioctl(fd, WDIOC_SETTIMEOUT, &timeout);
if (rv < 0) {
fprintf(stderr, "error %d ioctl settimeout %s\n", errno, path);
@@ -1132,10 +1217,18 @@ static int probe_dev(const char *path)
goto out;
}
- if (timeout != fire_timeout) {
- fprintf(stderr, "error %d invalid timeout %s\n", errno, path);
- rv = -1;
- goto out;
+ if (itco) {
+ if ((2 * timeout) != fire_timeout) {
+ fprintf(stderr, "error %d invalid timeout %s\n", errno, path);
+ rv = -1;
+ goto out;
+ }
+ } else {
+ if (timeout != fire_timeout) {
+ fprintf(stderr, "error %d invalid timeout %s\n", errno, path);
+ rv = -1;
+ goto out;
+ }
}
printf("%s\n", path);
@@ -1518,6 +1611,7 @@ static void print_usage_and_exit(int status)
printf("--dump, -d print debug from daemon\n");
printf("--probe, -p print path of functional watchdog device\n");
printf("-D debug: no fork and print all logging to stderr\n");
+ printf("-F force watchdog reset for testing (use with -D)\n");
printf("-H 0|1 use high priority features (1 yes, 0 no, default %d)\n",
DEFAULT_HIGH_PRIORITY);
printf("-G <name> group ownership for the socket\n");
@@ -1556,11 +1650,12 @@ int main(int argc, char *argv[])
{"help", no_argument, 0, 'h' },
{"probe", no_argument, 0, 'p' },
{"dump", no_argument, 0, 'd' },
+ {"forcefire", no_argument, 0, 'F' },
{"version", no_argument, 0, 'V' },
{0, 0, 0, 0 }
};
- c = getopt_long(argc, argv, "hpdVDH:G:S:s:k:w:",
+ c = getopt_long(argc, argv, "hpdVDFH:G:S:s:k:w:",
long_options, &option_index);
if (c == -1)
break;
@@ -1581,6 +1676,9 @@ int main(int argc, char *argv[])
case 'D':
daemon_debug = 1;
break;
+ case 'F':
+ forcefire = 1;
+ break;
case 'G':
socket_gname = strdup(optarg);
break;
@@ -1633,9 +1731,6 @@ int main(int argc, char *argv[])
openlog("wdmd", LOG_CONS | LOG_PID, LOG_DAEMON);
- log_error("wdmd started S%d H%d G%d", allow_scripts, high_priority,
- socket_gid);
-
setup_priority();
rv = lockfile();
@@ -1666,6 +1761,27 @@ int main(int argc, char *argv[])
if (rv < 0)
goto out_clients;
+ log_error("wdmd started S%d H%d G%d using %s \"%s\"", allow_scripts, high_priority,
+ socket_gid, watchdog_path, watchdog_identity[0] ? watchdog_identity : "unknown");
+ log_error("%s armed with fire_timeout %d", watchdog_path, fire_timeout);
+
+ if (daemon_debug && forcefire) {
+ int sleep_sec = 0;
+ int i;
+ setbuf(stdout, NULL);
+ printf("%s waiting for watchdog to reset machine:\n", time_str());
+ for (i = 1; i < fire_timeout + 5; i++) {
+ sleep(1);
+ sleep_sec++;
+ if (sleep_sec >= fire_timeout+1)
+ printf("%s %d %s failed to fire after timeout %d seconds\n", time_str(), i, watchdog_path, fire_timeout);
+ else
+ printf("%s %d\n", time_str(), i);
+ }
+ close_watchdog();
+ return -1;
+ }
+
rv = test_loop();
close_watchdog();
--
2.43.0

@ -1,9 +1,8 @@
Name: sanlock
Version: 3.8.4
Release: 5%{?dist}
Release: 4%{?dist}
Summary: A shared storage lock manager
Group: System Environment/Base
License: GPLv2 and GPLv2+ and LGPLv2+
URL: https://pagure.io/sanlock/
BuildRequires: gcc
@ -23,32 +22,28 @@ Requires(preun): systemd-units
Requires(postun): systemd-units
Source0: https://releases.pagure.org/sanlock/%{name}-%{version}.tar.gz
Patch1: 0001-sanlock-fix-memory-leak-of-lockspace-renewal_history.patch
Patch2: 0002-sanlock-fix-pthread_create-error-check.patch
Patch3: 0003-Revert-sanlock-Shrink-thread-pool-when-there-is-no-w.patch
Patch4: 0004-sanlock-fix-pthread_create-error-paths.patch
Patch5: 0005-wdmd-adjust-values-for-iTCO_wdt.patch
%global python_package python3-%{name}
Patch0: 0001-sanlock-fix-memory-leak-of-lockspace-renewal_history.patch
Patch1: 0002-sanlock-fix-pthread_create-error-check.patch
Patch2: 0003-Revert-sanlock-Shrink-thread-pool-when-there-is-no-w.patch
Patch3: 0004-sanlock-fix-pthread_create-error-paths.patch
%description
The sanlock daemon manages leases for applications on hosts using shared storage.
%prep
%setup -q
%patch0 -p1 -b .backup0
%patch1 -p1 -b .backup1
%patch2 -p1 -b .backup2
%patch3 -p1 -b .backup3
%patch4 -p1 -b .backup4
%patch5 -p1 -b .backup5
%build
%set_build_flags
# upstream does not require configure
# upstream does not support _smp_mflags
CFLAGS=$RPM_OPT_FLAGS make -C wdmd
CFLAGS=$RPM_OPT_FLAGS make -C src
CFLAGS=$RPM_OPT_FLAGS make -C python PY_VERSION=3.6
CFLAGS=$RPM_OPT_FLAGS make -C reset
CFLAGS=$RPM_OPT_FLAGS make -C python PY_VERSION=3
%install
rm -rf $RPM_BUILD_ROOT
@ -61,16 +56,12 @@ make -C wdmd \
make -C python \
install LIBDIR=%{_libdir} \
DESTDIR=$RPM_BUILD_ROOT \
PY_VERSION=3.6
make -C reset \
install LIBDIR=%{_libdir} \
DESTDIR=$RPM_BUILD_ROOT
PY_VERSION=3
install -D -m 0644 init.d/sanlock.service.native $RPM_BUILD_ROOT/%{_unitdir}/sanlock.service
install -D -m 0755 init.d/wdmd $RPM_BUILD_ROOT/usr/lib/systemd/systemd-wdmd
install -D -m 0644 init.d/wdmd.service.native $RPM_BUILD_ROOT/%{_unitdir}/wdmd.service
install -D -m 0644 init.d/sanlk-resetd.service $RPM_BUILD_ROOT/%{_unitdir}/sanlk-resetd.service
install -D -m 0644 src/logrotate.sanlock \
$RPM_BUILD_ROOT/etc/logrotate.d/sanlock
@ -82,15 +73,14 @@ install -D -m 0644 init.d/wdmd.sysconfig \
$RPM_BUILD_ROOT/etc/sysconfig/wdmd
install -Dd -m 0755 $RPM_BUILD_ROOT/etc/wdmd.d
install -Dd -m 0775 $RPM_BUILD_ROOT/%{_rundir}/sanlock
install -Dd -m 0775 $RPM_BUILD_ROOT/%{_rundir}/sanlk-resetd
install -Dd -m 0775 $RPM_BUILD_ROOT/%{_localstatedir}/run/sanlock
%pre
getent group sanlock > /dev/null || /usr/sbin/groupadd \
-g 179 sanlock
getent passwd sanlock > /dev/null || /usr/sbin/useradd \
-u 179 -c "sanlock" -s /sbin/nologin -r \
-g 179 -d /run/sanlock sanlock
-g 179 -d /var/run/sanlock sanlock
/usr/sbin/usermod -a -G disk sanlock
%post
@ -110,7 +100,7 @@ getent passwd sanlock > /dev/null || /usr/sbin/useradd \
%{_sbindir}/wdmd
%dir %{_sysconfdir}/wdmd.d
%dir %{_sysconfdir}/sanlock
%dir %attr(-,sanlock,sanlock) %{_rundir}/sanlock
%dir %attr(-,sanlock,sanlock) %{_localstatedir}/run/sanlock
%{_mandir}/man8/wdmd*
%{_mandir}/man8/sanlock*
%config(noreplace) %{_sysconfdir}/logrotate.d/sanlock
@ -122,7 +112,6 @@ getent passwd sanlock > /dev/null || /usr/sbin/useradd \
%package lib
Summary: A shared storage lock manager library
Group: System Environment/Libraries
%description lib
The %{name}-lib package contains the runtime libraries for sanlock,
@ -137,23 +126,22 @@ access to the shared disks.
%{_libdir}/libsanlock_client.so.*
%{_libdir}/libwdmd.so.*
%package -n %{python_package}
%package -n python3-sanlock
%{?python_provide:%python_provide python3-sanlock}
Summary: Python bindings for the sanlock library
Group: Development/Libraries
Requires: %{name}-lib = %{version}-%{release}
%description -n %{python_package}
The %{python_package} package contains a module that permits applications
%description -n python3-sanlock
The %{name}-python package contains a module that permits applications
written in the Python programming language to use the interface
supplied by the sanlock library.
%files -n %{python_package}
%files -n python3-sanlock
%{python3_sitearch}/sanlock_python-*.egg-info
%{python3_sitearch}/sanlock*.so
%package devel
Summary: Development files for %{name}
Group: Development/Libraries
Requires: %{name}-lib = %{version}-%{release}
%description devel
@ -173,68 +161,95 @@ developing applications that use %{name}.
%{_libdir}/pkgconfig/libsanlock.pc
%{_libdir}/pkgconfig/libsanlock_client.pc
%package -n sanlk-reset
Summary: Host reset daemon and client using sanlock
Group: System Environment/Base
Requires: sanlock = %{version}-%{release}
Requires: sanlock-lib = %{version}-%{release}
%changelog
* Fri Apr 01 2022 David Teigland <teigland@redhat.com> - 3.8.4-4
- fixes for thread/memory leak
* Mon Aug 23 2021 David Teigland <teigland@redhat.com> - 3.8.4-1
- Update rhel9 beta version to match latest rhel8
%description -n sanlk-reset
The sanlk-reset package contains the reset daemon and client.
A cooperating host running the daemon can be reset by a host
running the client, so long as both maintain access to a
common sanlock lockspace.
* Tue Aug 10 2021 Mohan Boddu <mboddu@redhat.com> - 3.8.1-11
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
Related: rhbz#1991688
%files -n sanlk-reset
%{_sbindir}/sanlk-reset
%{_sbindir}/sanlk-resetd
%{_unitdir}/sanlk-resetd.service
%dir %attr(-,root,root) %{_rundir}/sanlk-resetd
%{_mandir}/man8/sanlk-reset*
* Mon Jun 28 2021 David Teigland <teigland@redhat.com> - 3.8.1-10
- fuck this process
* Fri Apr 16 2021 Mohan Boddu <mboddu@redhat.com> - 3.8.1-9
- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937
%changelog
* Fri Mar 29 2024 MSVSphere Packaging Team <packager@msvsphere-os.ru> - 3.8.4-5
- Rebuilt for MSVSphere 8.10 beta
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.8.1-8
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Tue Jan 30 2024 David Teigland <teigland@redhat.com> - 3.8.4-5
- adjust wdmd values for iTCO_wdt watchdog driver
* Wed Jul 06 2022 David Teigland <teigland@redhat.com> - 3.8.4-4
- rebuild with larger release number
* Sat Aug 08 2020 Nir Soffer <nsoffer@redhat.com> - 3.8.1-7
- Enable LTO
* Fri Mar 18 2022 David Teigland <teigland@redhat.com> - 3.8.4-2
- Resolves: rhbz#2058438
* Sun Aug 02 2020 Nir Soffer <nsoffer@redhat.com> - 3.8.1-6
- Removing extra linkeer args, hopefully fix python build
* Tue Jun 01 2021 David Teigland <teigland@redhat.com> 3.8.4-1
- Update to sanlock-3.8.4
* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.8.1-5
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Thu May 20 2021 David Teigland <teigland@redhat.com> 3.8.3-2
- Fix connection close and add python inquire api
* Wed Jul 29 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.8.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue Jan 19 2021 David Teigland <teigland@redhat.com> 3.8.3-1
- Update to sanlock-3.8.3
* Tue Jul 07 2020 Jeff Law <law@redhat.com> - 3.8.1-3
- Disable LTO
* Mon Aug 10 2020 David Teigland <teigland@redhat.com> 3.8.2-1
- Update to sanlock-3.8.2
* Tue May 26 2020 Miro Hrončok <mhroncok@redhat.com> - 3.8.1-2
- Rebuilt for Python 3.9
* Thu Jul 09 2020 David Teigland <teigland@redhat.com> 3.8.1-1
* Sat May 2 2020 Nir Soffer <nsoffer@redhat.com> - 3.8.1-1
- Update to sanlock-3.8.1
* Wed Jun 12 2019 Nir Soffer <nsoffer@redhat.com> 3.8.0-2
- kick the gating tests to run
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.8.0-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Mon Aug 19 2019 Miro Hrončok <mhroncok@redhat.com> - 3.8.0-3
- Rebuilt for Python 3.8
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.8.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Wed Jun 12 2019 Nir Soffer <nsoffer@redhat.com> - 3.8.0-1
- Update to sanlock-3.8.0
- Convert spec to python 3
* Tue May 21 2019 Nir Soffer <nsoffer@redhat.com> - 3.7.3-1
- Update to sanlock-3.7.3
- Add missing BuildRequires and Requires
* Fri Apr 12 2019 Nir Soffer <nsoffer@redhat.com> - 3.7.1-2
- Cleanup up align and sector constants
* Mon Apr 8 2019 Nir Soffer <nsoffer@redhat.com> - 3.7.1-1
- Update to sanlock 3.7.1
- Fix read_resource_owners (414abfe)
* Wed Mar 20 2019 Nir Soffer <nsoffer@redhat.com> - 3.7.0-1
- remove unneeded with_systemd macro
- update to sanlock 3.7.0
* Sat Feb 2 2019 Nir Soffer <nsoffer@redhat.com> - 3.6.0-8
- fix build on Fedora rawhide
* Thu Jan 24 2019 David Teigland <teigland@redhat.com> - 3.6.0-7
- lockfile ownership
* Wed Jun 12 2019 Nir Soffer <nsoffer@redhat.com> 3.8.0-1
- Cleanup spec and convert to python3
* Sat Jul 14 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.6.0-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Thu Dec 06 2018 David Teigland <teigland@redhat.com> - 3.6.0-5
- Fix selinux lockfile error
* Thu Apr 12 2018 Iryna Shcherbina <shcherbina.iryna@gmail.com> - 3.6.0-5
- Update Python 2 dependency declarations to new packaging standards
(See https://fedoraproject.org/wiki/FinalizingFedoraSwitchtoPython3)
* Thu Oct 04 2018 David Teigland <teigland@redhat.com> - 3.6.0-4
- makefile gcc flags
* Wed Mar 14 2018 David Teigland <teigland@redhat.com> - 3.6.0-4
- change makefile flags
* Tue Jun 12 2018 Charalampos Stratakis <cstratak@redhat.com> - 3.6.0-3
- Conditionalize the python2 subpackage
* Wed Mar 14 2018 David Teigland <teigland@redhat.com> - 3.6.0-3
- rebuild with set_build_flags
* Fri Feb 09 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.6.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild

Loading…
Cancel
Save