Skip to content

Commit c3ce5d4

Browse files
authored
fix(cloud): 🐛 correct retry count tracking for partial failures (#67)
Previously, during retry of failed pages (status PARTIAL_FAILED), the completed count was based on page number from replayed events, which could lead to duplicate counting or incorrect progress. The failed count was not decremented when a retried page succeeded. This commit ensures: - Completed count increments and failed count decrements for each successful retried page. - When all pages are completed after a retry (failed count reaches 0), any remaining non-completed pages are marked as completed. - Both CloudPreview and List components handle retry scenarios consistently.
1 parent d4c62bc commit c3ce5d4

2 files changed

Lines changed: 29 additions & 10 deletions

File tree

src/renderer/pages/CloudPreview.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -250,13 +250,21 @@ const CloudPreview: React.FC = () => {
250250
}
251251
return [...prev, { page, status: 2, status_name: 'COMPLETED', markdown, width_mm: 210, height_mm: 297 }];
252252
});
253-
setTask(prev => prev ? {
254-
...prev,
255-
pages_completed: (prev.pages_completed || 0) + 1,
256-
} : null);
253+
setTask(prev => {
254+
if (!prev) return null;
255+
const updates: Partial<typeof prev> = {
256+
pages_completed: (prev.pages_completed || 0) + 1,
257+
};
258+
// During retry (PARTIAL_FAILED), decrement failed count
259+
if (prev.status === 8) {
260+
updates.pages_failed = Math.max(0, (prev.pages_failed || 0) - 1);
261+
}
262+
return { ...prev, ...updates };
263+
});
257264
break;
258265
}
259-
case 'page_started': {
266+
case 'page_started':
267+
case 'page_retry_started': {
260268
const { page } = event.data as any;
261269
setPages(prev => {
262270
const idx = prev.findIndex(p => p.page === page);
@@ -294,6 +302,10 @@ const CloudPreview: React.FC = () => {
294302
pages_completed: data.pages_completed,
295303
pages_failed: data.pages_failed,
296304
} : null);
305+
// When all pages completed (e.g. after retry), mark remaining pages as completed
306+
if (data.pages_failed === 0) {
307+
setPages(prev => prev.map(p => p.status !== 2 ? { ...p, status: 2, status_name: 'COMPLETED' } : p));
308+
}
297309
break;
298310
}
299311
case 'error': {

src/renderer/pages/List.tsx

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -346,11 +346,18 @@ const List: React.FC = () => {
346346
case 'page_completed': {
347347
const pageNumber = (data as any).page;
348348
const totalPages = (data as any).total_pages || task.pages || 1;
349-
// Use page number directly to avoid duplicate counting from replayed events
350-
// page is 1-based, so completed_count = page number when pages complete in order
351-
const completed = Math.max(task.completed_count || 0, pageNumber || 0);
352-
task.completed_count = completed;
353-
task.progress = Math.round((completed / totalPages) * 100);
349+
350+
if (task.status === 8) {
351+
// Retry scenario (PARTIAL_FAILED): increment completed, decrement failed
352+
task.completed_count = (task.completed_count || 0) + 1;
353+
task.failed_count = Math.max(0, (task.failed_count || 0) - 1);
354+
} else {
355+
// Normal processing: use page number as progress indicator
356+
// page is 1-based, so completed_count = page number when pages complete in order
357+
task.completed_count = Math.max(task.completed_count || 0, pageNumber || 0);
358+
}
359+
360+
task.progress = Math.round(((task.completed_count || 0) / totalPages) * 100);
354361
task.status = 3; // PROCESSING
355362
break;
356363
}

0 commit comments

Comments
 (0)