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.
This commit is contained in:
parent
075153da8f
commit
af1f471b29
6 changed files with 18 additions and 5 deletions
|
|
@ -65,7 +65,7 @@ export default function NodesPage() {
|
||||||
const [editRoots, setEditRoots] = useState<ScanRootRow[]>([]);
|
const [editRoots, setEditRoots] = useState<ScanRootRow[]>([]);
|
||||||
const [editBusy, setEditBusy] = useState(false);
|
const [editBusy, setEditBusy] = useState(false);
|
||||||
const [upgradingId, setUpgradingId] = useState<string | null>(null);
|
const [upgradingId, setUpgradingId] = useState<string | null>(null);
|
||||||
const [targetNodeVersion, setTargetNodeVersion] = useState("1.3.9");
|
const [targetNodeVersion, setTargetNodeVersion] = useState("1.3.10");
|
||||||
|
|
||||||
function loadNodes() {
|
function loadNodes() {
|
||||||
fetch("/api/v1/admin/nodes", { credentials: "include" })
|
fetch("/api/v1/admin/nodes", { credentials: "include" })
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
/** Target media-node version served from /install/media-node-linux-* */
|
/** Target media-node version served from /install/media-node-linux-* */
|
||||||
export const MEDIA_NODE_TARGET_VERSION =
|
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 */
|
/** Minimum node version that handles UPGRADE over WebSocket */
|
||||||
const REMOTE_UPGRADE_MIN_VERSION = "1.3.3";
|
const REMOTE_UPGRADE_MIN_VERSION = "1.3.3";
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ WORKDIR /app
|
||||||
|
|
||||||
FROM golang:1.22-alpine AS node-build
|
FROM golang:1.22-alpine AS node-build
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
ARG MEDIA_NODE_VERSION=1.3.9
|
ARG MEDIA_NODE_VERSION=1.3.10
|
||||||
RUN apk add --no-cache git ca-certificates
|
RUN apk add --no-cache git ca-certificates
|
||||||
COPY node/media-node/ ./
|
COPY node/media-node/ ./
|
||||||
RUN go mod tidy \
|
RUN go mod tidy \
|
||||||
|
|
|
||||||
|
|
@ -74,7 +74,7 @@ mv "$BIN_PATH.new" "$BIN_PATH"
|
||||||
if docker_cmd ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then
|
if docker_cmd ps -a --format '{{.Names}}' | grep -qx "$CONTAINER"; then
|
||||||
echo "Container herstarten..."
|
echo "Container herstarten..."
|
||||||
docker_cmd restart "$CONTAINER" >/dev/null
|
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
|
else
|
||||||
echo "Waarschuwing: container '$CONTAINER' niet gevonden — binary is wel bijgewerkt."
|
echo "Waarschuwing: container '$CONTAINER' niet gevonden — binary is wel bijgewerkt."
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import (
|
||||||
"github.com/sthmedia/media-node/internal/streaming"
|
"github.com/sthmedia/media-node/internal/streaming"
|
||||||
)
|
)
|
||||||
|
|
||||||
var version = "1.3.9"
|
var version = "1.3.10"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
if len(os.Args) < 2 {
|
if len(os.Args) < 2 {
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ type Client struct {
|
||||||
stopCh chan struct{}
|
stopCh chan struct{}
|
||||||
syncAckCh chan syncAck
|
syncAckCh chan syncAck
|
||||||
fullSyncActive bool
|
fullSyncActive bool
|
||||||
|
pendingFullSync bool
|
||||||
pendingEvents []scanner.LibraryEvent
|
pendingEvents []scanner.LibraryEvent
|
||||||
eventBatch []scanner.LibraryEvent
|
eventBatch []scanner.LibraryEvent
|
||||||
eventFlushTimer *time.Timer
|
eventFlushTimer *time.Timer
|
||||||
|
|
@ -146,6 +147,7 @@ func (c *Client) connect() error {
|
||||||
c.conn = conn
|
c.conn = conn
|
||||||
c.connected = true
|
c.connected = true
|
||||||
c.fullSyncActive = false
|
c.fullSyncActive = false
|
||||||
|
c.pendingFullSync = false
|
||||||
c.pendingEvents = nil
|
c.pendingEvents = nil
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
|
|
@ -894,10 +896,15 @@ func (c *Client) RequestFullLibrarySync() {
|
||||||
func (c *Client) sendFullSync() {
|
func (c *Client) sendFullSync() {
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
if c.fullSyncActive {
|
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()
|
c.mu.Unlock()
|
||||||
|
log.Println("Full library sync already running — queued another pass after it finishes")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
c.fullSyncActive = true
|
c.fullSyncActive = true
|
||||||
|
c.pendingFullSync = false
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|
@ -905,10 +912,16 @@ func (c *Client) sendFullSync() {
|
||||||
c.fullSyncActive = false
|
c.fullSyncActive = false
|
||||||
pending := c.pendingEvents
|
pending := c.pendingEvents
|
||||||
c.pendingEvents = nil
|
c.pendingEvents = nil
|
||||||
|
rerun := c.pendingFullSync
|
||||||
|
c.pendingFullSync = false
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
if len(pending) > 0 {
|
if len(pending) > 0 {
|
||||||
c.flushLibraryEvents(pending)
|
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.
|
// Never sync a half-built inventory — Master would prune the rest as missing.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue