[packages/php/PHP_8_0] opcache: abandon forced restart on EPERM instead of faking a kill
arekm
arekm at pld-linux.org
Tue Sep 1 23:47:05 CEST 2026
commit e579c95f577e29a87bc8a505cfc35bc4e8271c29
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date: Tue Sep 1 22:58:46 2026 +0200
opcache: abandon forced restart on EPERM instead of faking a kill
Faking success left the locker holding the lock, so the F_GETLK loop never
exited and froze the whole instance under the SHM lock.
opcache-nokill-perm.patch | 26 ++++++++++++++++----------
php.spec | 2 +-
2 files changed, 17 insertions(+), 11 deletions(-)
---
diff --git a/php.spec b/php.spec
index 678d802..06346fd 100644
--- a/php.spec
+++ b/php.spec
@@ -148,7 +148,7 @@ Summary(ru.UTF-8): PHP - язык препроцессирования HTML-фа
Summary(uk.UTF-8): PHP - мова препроцесування HTML-файлів, виконувана на сервері
Name: %{orgname}%{php_suffix}
Version: 8.0.28
-Release: 15
+Release: 16
Epoch: 4
# All files licensed under PHP version 3.01, except
# Zend is licensed under Zend
diff --git a/opcache-nokill-perm.patch b/opcache-nokill-perm.patch
index a3458c7..03731b9 100644
--- a/opcache-nokill-perm.patch
+++ b/opcache-nokill-perm.patch
@@ -1,24 +1,30 @@
---- php-8.2.17/ext/opcache/ZendAccelerator.c~ 2024-03-12 15:26:30.000000000 +0100
-+++ php-8.2.17/ext/opcache/ZendAccelerator.c 2024-03-20 11:45:08.979946189 +0100
-@@ -852,6 +852,10 @@ static inline void kill_all_lockers(stru
+--- php-8.0.28/ext/opcache/ZendAccelerator.c~ 2026-09-01 22:34:21.000000000 +0200
++++ php-8.0.28/ext/opcache/ZendAccelerator.c 2026-09-01 22:34:21.000000000 +0200
+@@ -780,6 +780,13 @@ static inline void kill_all_lockers(stru
/* Process died before the signal was sent */
success = 1;
zend_accel_error(ACCEL_LOG_WARNING, "Process %d died before SIGKILL was sent", mem_usage_check->l_pid);
+ } else if (errno == EPERM) {
-+ /* We have no permission to kill the other process, so no point in trying */
-+ success = 1;
-+ zend_accel_error(ACCEL_LOG_WARNING, "No permission to kill locker %d: %s. Assuming success.", mem_usage_check->l_pid, strerror(errno));
++ /* We are not permitted to signal this locker, so it can never be
++ killed here. Abandon the forced restart instead of spinning on a
++ lock we cannot release; back off by another timeout. */
++ zend_accel_error(ACCEL_LOG_WARNING, "No permission to kill locker %d, abandoning forced restart", mem_usage_check->l_pid);
++ ZCSG(force_restart_time) = time(NULL) + ZCG(accel_directives).force_restart_timeout;
++ return;
} else if (errno != 0) {
zend_accel_error(ACCEL_LOG_WARNING, "Failed to send SIGKILL to locker %d: %s", mem_usage_check->l_pid, strerror(errno));
}
-@@ -864,6 +868,10 @@ static inline void kill_all_lockers(stru
+@@ -792,6 +799,13 @@ static inline void kill_all_lockers(stru
/* successfully killed locker, process no longer exists */
success = 1;
zend_accel_error(ACCEL_LOG_WARNING, "Killed locker %d", mem_usage_check->l_pid);
+ } else if (errno == EPERM) {
-+ /* We have no permission to kill the other process, so no point in trying */
-+ success = 1;
-+ zend_accel_error(ACCEL_LOG_WARNING, "No permission to kill locker %d again: %s. Assuming success.", mem_usage_check->l_pid, strerror(errno));
++ /* We are not permitted to signal this locker, so it can never be
++ killed here. Abandon the forced restart instead of spinning on a
++ lock we cannot release; back off by another timeout. */
++ zend_accel_error(ACCEL_LOG_WARNING, "No permission to kill locker %d, abandoning forced restart", mem_usage_check->l_pid);
++ ZCSG(force_restart_time) = time(NULL) + ZCG(accel_directives).force_restart_timeout;
++ return;
} else if (errno != 0) {
zend_accel_error(ACCEL_LOG_WARNING, "Failed to check locker %d: %s", mem_usage_check->l_pid, strerror(errno));
}
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/php.git/commitdiff/e579c95f577e29a87bc8a505cfc35bc4e8271c29
More information about the pld-cvs-commit
mailing list