From af1f471b297d0f7604bf00629267853c29ca405c Mon Sep 17 00:00:00 2001 From: Jos Vooges | STH Date: Thu, 17 Sep 2026 02:07:52 +0200 Subject: [PATCH] Fix dropped library sync after startup scan and bump media-node to 1.3.10. Queue a second full sync when one is already running so newly indexed seasons are not lost after upgrade/restart. --- apps/admin-ui/src/app/nodes/page.tsx | 2 +- apps/master-api/src/nodes/version.ts | 2 +- deploy/docker/Dockerfile.master-api | 2 +- deploy/node/upgrade-node.sh | 2 +- node/media-node/cmd/media-node/main.go | 2 +- node/media-node/internal/control/client.go | 13 +++++++++++++ 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/apps/admin-ui/src/app/nodes/page.tsx b/apps/admin-ui/src/app/nodes/page.tsx index 9671060..65cbc62 100644 --- a/apps/admin-ui/src/app/nodes/page.tsx +++ b/apps/admin-ui/src/app/nodes/page.tsx @@ -65,7 +65,7 @@ export default function NodesPage() { const [editRoots, setEditRoots] = useState([]); const [editBusy, setEditBusy] = useState(false); const [upgradingId, setUpgradingId] = useState(null); - const [targetNodeVersion, setTargetNodeVersion] = useState("1.3.9"); + const [targetNodeVersion, setTargetNodeVersion] = useState("1.3.10"); function loadNodes() { fetch("/api/v1/admin/nodes", { credentials: "include" }) diff --git a/apps/master-api/src/nodes/version.ts b/apps/master-api/src/nodes/version.ts index b1eb3c4..93b1053 100644 --- a/apps/master-api/src/nodes/version.ts +++ b/apps/master-api/src/nodes/version.ts @@ -1,6 +1,6 @@ /** Target media-node version served from /install/media-node-linux-* */ export const MEDIA_NODE_TARGET_VERSION = - process.env.MEDIA_NODE_VERSION?.trim() || "1.3.9"; + process.env.MEDIA_NODE_VERSION?.trim() || "1.3.10"; /** Minimum node version that handles UPGRADE over WebSocket */ const REMOTE_UPGRADE_MIN_VERSION = "1.3.3"; diff --git a/deploy/docker/Dockerfile.master-api b/deploy/docker/Dockerfile.master-api index 41b8eba..ef46f91 100644 --- a/deploy/docker/Dockerfile.master-api +++ b/deploy/docker/Dockerfile.master-api @@ -4,7 +4,7 @@ WORKDIR /app FROM golang:1.22-alpine AS node-build WORKDIR /src -ARG MEDIA_NODE_VERSION=1.3.9 +ARG MEDIA_NODE_VERSION=1.3.10 RUN apk add --no-cache git ca-certificates COPY node/media-node/ ./ RUN go mod tidy \ diff --git a/deploy/node/upgrade-node.sh b/deploy/node/upgrade-node.sh index 71d246a..140316e 100644 --- a/deploy/node/upgrade-node.sh +++ b/deploy/node/upgrade-node.sh @@ -74,7 +74,7 @@ mv "$BIN_PATH.new" "$BIN_PATH" if docker_cmd ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then echo "Container herstarten..." docker_cmd restart "$CONTAINER" >/dev/null - echo "Klaar. Controleer versie in Admin → Nodes (verwacht ${MEDIA_NODE_VERSION:-1.3.9}+)." + echo "Klaar. Controleer versie in Admin → Nodes (verwacht ${MEDIA_NODE_VERSION:-1.3.10}+)." else echo "Waarschuwing: container '$CONTAINER' niet gevonden — binary is wel bijgewerkt." fi diff --git a/node/media-node/cmd/media-node/main.go b/node/media-node/cmd/media-node/main.go index bf4582b..972b2c0 100644 --- a/node/media-node/cmd/media-node/main.go +++ b/node/media-node/cmd/media-node/main.go @@ -24,7 +24,7 @@ import ( "github.com/sthmedia/media-node/internal/streaming" ) -var version = "1.3.9" +var version = "1.3.10" func main() { if len(os.Args) < 2 { diff --git a/node/media-node/internal/control/client.go b/node/media-node/internal/control/client.go index 57bb140..6459ff0 100644 --- a/node/media-node/internal/control/client.go +++ b/node/media-node/internal/control/client.go @@ -56,6 +56,7 @@ type Client struct { stopCh chan struct{} syncAckCh chan syncAck fullSyncActive bool + pendingFullSync bool pendingEvents []scanner.LibraryEvent eventBatch []scanner.LibraryEvent eventFlushTimer *time.Timer @@ -146,6 +147,7 @@ func (c *Client) connect() error { c.conn = conn c.connected = true c.fullSyncActive = false + c.pendingFullSync = false c.pendingEvents = nil c.mu.Unlock() @@ -894,10 +896,15 @@ func (c *Client) RequestFullLibrarySync() { func (c *Client) sendFullSync() { c.mu.Lock() if c.fullSyncActive { + // Scan-na-connect race: HELLO sync loopt al, startup-scan eindigt later. + // Niet droppen — anders blijven nieuw geïndexeerde files (bijv. S10) op de node. + c.pendingFullSync = true c.mu.Unlock() + log.Println("Full library sync already running — queued another pass after it finishes") return } c.fullSyncActive = true + c.pendingFullSync = false c.mu.Unlock() defer func() { @@ -905,10 +912,16 @@ func (c *Client) sendFullSync() { c.fullSyncActive = false pending := c.pendingEvents c.pendingEvents = nil + rerun := c.pendingFullSync + c.pendingFullSync = false c.mu.Unlock() if len(pending) > 0 { c.flushLibraryEvents(pending) } + if rerun { + log.Println("Running queued full library sync") + go c.sendFullSync() + } }() // Never sync a half-built inventory — Master would prune the rest as missing.