Fix false stall detection for multi-article chained generation
The frontend status poller measured elapsed time from `started` (set once at the beginning of the run) and declared a stall at 300s. Three articles take ~6 minutes total, so the poller always false-alarmed on article 3. Now every stage broadcast writes `last_updated` into the transient, and the stall check compares idle time since the last update — not since the run started. This lets N-article runs complete without false timeout as long as each individual article finishes within 5 minutes. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -105,9 +105,10 @@ class PRAutoBlogger_Executor {
|
||||
|
||||
// Write initial "running" status for the frontend to poll.
|
||||
set_transient( self::STATUS_TRANSIENT, [
|
||||
'status' => 'running',
|
||||
'stage' => __( 'Starting generation...', 'prautoblogger' ),
|
||||
'started' => time(),
|
||||
'status' => 'running',
|
||||
'stage' => __( 'Starting generation...', 'prautoblogger' ),
|
||||
'started' => time(),
|
||||
'last_updated' => time(),
|
||||
], self::STATUS_TTL );
|
||||
|
||||
// Schedule immediate one-shot cron event. WordPress will fire this
|
||||
@@ -190,11 +191,7 @@ class PRAutoBlogger_Executor {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cron handler: process the next queued article in its own PHP process.
|
||||
*
|
||||
* Chained by Pipeline_Runner — each article gets its own execution time.
|
||||
*/
|
||||
/** Cron handler: process next queued article. Chained by Pipeline_Runner. */
|
||||
public function on_process_article_queue(): void {
|
||||
// phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
|
||||
@ignore_user_abort( true );
|
||||
@@ -249,8 +246,10 @@ class PRAutoBlogger_Executor {
|
||||
}
|
||||
}
|
||||
|
||||
// After 5 min with no progress, declare failure.
|
||||
if ( $elapsed > 300 ) {
|
||||
// Stall = 5 min since last stage update (not since start).
|
||||
$last_activity = $status['last_updated'] ?? $status['started'] ?? 0;
|
||||
$idle_seconds = time() - $last_activity;
|
||||
if ( $idle_seconds > 300 ) {
|
||||
$this->abort_orphaned_run( __( 'Generation stalled. Check Activity Log.', 'prautoblogger' ) );
|
||||
return;
|
||||
}
|
||||
@@ -275,7 +274,8 @@ class PRAutoBlogger_Executor {
|
||||
private function update_generation_stage( string $stage ): void {
|
||||
$current = get_transient( self::STATUS_TRANSIENT );
|
||||
if ( is_array( $current ) ) {
|
||||
$current['stage'] = $stage;
|
||||
$current['stage'] = $stage;
|
||||
$current['last_updated'] = time();
|
||||
set_transient( self::STATUS_TRANSIENT, $current, self::STATUS_TTL );
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user