From 0a098cf7b757888ff1e3911e5768414751d7bbba Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 1 Apr 2026 11:58:10 +0100 Subject: [PATCH] idle cpu fix test (#6015) --- .../software/common/util/FileMonitor.java | 16 ++++++++++++---- .../src/core/components/viewer/LocalEmbedPDF.tsx | 5 ++++- scripts/init-without-ocr.sh | 14 ++++++++++++-- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/common/src/main/java/stirling/software/common/util/FileMonitor.java b/app/common/src/main/java/stirling/software/common/util/FileMonitor.java index 09caccdb50..5bdda6b5e2 100644 --- a/app/common/src/main/java/stirling/software/common/util/FileMonitor.java +++ b/app/common/src/main/java/stirling/software/common/util/FileMonitor.java @@ -112,8 +112,6 @@ public class FileMonitor { All files observed changes in the last iteration will be considered as staging files. If those files are not modified in current iteration, they will be considered as ready for processing. */ - stagingFiles = new HashSet<>(newlyDiscoveredFiles); - readyForProcessingFiles.clear(); if (path2KeyMapping.isEmpty()) { log.warn("Not monitoring any directories; attempting to re-register root paths."); @@ -129,8 +127,17 @@ public class FileMonitor { } } - WatchKey key; - while ((key = watchService.poll()) != null) { + // Skip expensive collection work when there is nothing to track + WatchKey firstKey = watchService.poll(); + if (firstKey == null && newlyDiscoveredFiles.isEmpty() && readyForProcessingFiles.isEmpty()) { + return; + } + + stagingFiles = new HashSet<>(newlyDiscoveredFiles); + readyForProcessingFiles.clear(); + + WatchKey key = firstKey; + while (key != null) { final Path watchingDir = (Path) key.watchable(); key.pollEvents() .forEach( @@ -167,6 +174,7 @@ public class FileMonitor { if (!isKeyValid) { // key is invalid when the directory itself is no longer exists path2KeyMapping.remove((Path) key.watchable()); } + key = watchService.poll(); } readyForProcessingFiles.addAll(stagingFiles); } diff --git a/frontend/src/core/components/viewer/LocalEmbedPDF.tsx b/frontend/src/core/components/viewer/LocalEmbedPDF.tsx index 9050cf20e6..db3227d3b2 100644 --- a/frontend/src/core/components/viewer/LocalEmbedPDF.tsx +++ b/frontend/src/core/components/viewer/LocalEmbedPDF.tsx @@ -4,6 +4,7 @@ import type { PluginRegistry } from '@embedpdf/core'; import { EmbedPDF } from '@embedpdf/core/react'; import { usePdfiumEngine } from '@embedpdf/engines/react'; import { PrivateContent } from '@app/components/shared/PrivateContent'; +import { useAppConfig } from '@app/contexts/AppConfigContext'; // Import the essential plugins import { Viewport, ViewportPluginPackage } from '@embedpdf/plugin-viewport/react'; @@ -94,15 +95,17 @@ interface LocalEmbedPDFProps { export function LocalEmbedPDF({ file, url, fileName, enableAnnotations = false, enableRedaction = false, enableFormFill = false, isManualRedactionMode = false, showBakedAnnotations = true, onSignatureAdded, signatureApiRef, annotationApiRef, historyApiRef, redactionTrackerRef, fileId, isCommentsSidebarVisible = false, commentsSidebarRightOffset = '0rem', isSignMode = false, pdfRenderMode = 'normal' }: LocalEmbedPDFProps) { const { t } = useTranslation(); + const { config } = useAppConfig(); const [pdfUrl, setPdfUrl] = useState(null); const [, setAnnotations] = useState>([]); const [commentAuthorName, setCommentAuthorName] = useState('Guest'); useEffect(() => { + if (!config?.enableLogin) return; accountService.getAccountData().then((data) => { if (data?.username) setCommentAuthorName(data.username); }).catch(() => {/* not logged in or security disabled */}); - }, []); + }, [config?.enableLogin]); // Convert File to URL if needed useEffect(() => { diff --git a/scripts/init-without-ocr.sh b/scripts/init-without-ocr.sh index c3f63a4124..f7707fcc36 100755 --- a/scripts/init-without-ocr.sh +++ b/scripts/init-without-ocr.sh @@ -287,10 +287,20 @@ start_unoserver_watchdog() { if [ "$needs_restart" = true ]; then log "Restarting unoserver on 127.0.0.1:${port} (uno-port ${uno_port})" - # Kill the old process if it exists + # Kill the old process and its children (soffice) if it exists. + # Capture child PIDs first, then send TERM to children before parent + # so the PPID relationship is still visible. After sleep, use the + # saved PIDs for SIGKILL since the parent may have already exited + # and children would be reparented to init. if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then + local child_pids + child_pids=$(pgrep -P "$pid" 2>/dev/null || true) + pkill -TERM -P "$pid" 2>/dev/null || true kill -TERM "$pid" 2>/dev/null || true - sleep 1 + sleep 3 + if [ -n "$child_pids" ]; then + kill -KILL $child_pids 2>/dev/null || true + fi kill -KILL "$pid" 2>/dev/null || true fi start_unoserver_instance "$port" "$uno_port"