From 2e620dad1e7420ef046c5f6b73ddbccbd550a2f1 Mon Sep 17 00:00:00 2001 From: plegall Date: Sat, 1 Mar 2025 14:23:05 +0100 Subject: [PATCH] (cp 5eacda0d7) fixes #2333 avoid deadlock while waiting for user_cache rebuild --- include/functions.inc.php | 13 +++++++++++++ include/functions_user.inc.php | 10 ++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/include/functions.inc.php b/include/functions.inc.php index 1de82c75f..a736237cf 100644 --- a/include/functions.inc.php +++ b/include/functions.inc.php @@ -2881,6 +2881,19 @@ INSERT IGNORE return $exec_id; } +function pwg_unique_exec_is_running($token_name) +{ + $query = ' +SELECT + COUNT(*) + FROM '.CONFIG_TABLE.' + WHERE param = "'.$token_name.'_running" +;'; + list($counter) = pwg_db_fetch_row(pwg_query($query)); + + return $counter > 0; +} + function pwg_unique_exec_ends($token_name) { conf_delete_param($token_name.'_running'); diff --git a/include/functions_user.inc.php b/include/functions_user.inc.php index b632a71d0..0382d9c3d 100644 --- a/include/functions_user.inc.php +++ b/include/functions_user.inc.php @@ -437,15 +437,21 @@ SELECT list($nb_cache_lines) = pwg_db_fetch_row(pwg_query($query)); $logger_msg = $logger_msg_prefix.'user_cache generation waiting k='.$k.' '; + $waiting_time = get_elapsed_time($user_cache_waiting_start_time, get_moment()); if ($nb_cache_lines > 0) { - $logger->info($logger_msg.'user_cache rebuilt, after waiting '.get_elapsed_time($user_cache_waiting_start_time, get_moment())); + $logger->info($logger_msg.'user_cache rebuilt, after waiting '.$waiting_time); return getuserdata($user_id, false); } + elseif (!pwg_unique_exec_is_running($cache_generation_token_name)) + { + $logger->info($logger_msg.'user_cache rebuilt but has been reset since, give it another try, after waiting '.$waiting_time); + return getuserdata($user_id, true); + } else { - $logger->info($logger_msg.'user_cache not ready yet, after waiting '.get_elapsed_time($user_cache_waiting_start_time, get_moment())); + $logger->info($logger_msg.'user_cache not ready yet, after waiting '.$waiting_time); } }