From f47bc8c5394a34d711ea23c625ed76c83d4ccbe6 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 14 Jan 2026 14:45:52 -0800 Subject: [PATCH] Fix remote.meta.sync TTL issue (#8021) (#8030) * Fix remote.meta.sync TTL issue (#8021) Remote entries should not have TTL applied because they represent files in remote storage, not local SeaweedFS files. When TTL was configured on a prefix, remote.meta.sync would create entries that immediately expired, causing them to be deleted and recreated on each sync. Changes: - Set TtlSec=0 explicitly when creating remote entries in remote.meta.sync - Skip TTL application in CreateEntry handler for entries with Remote field set Fixes #8021 * Add TTL protection for remote entries in update path - Set TtlSec=0 in doSaveRemoteEntry before calling UpdateEntry - Add server-side TTL protection in UpdateEntry handler for remote entries - Ensures remote entries don't inherit or preserve TTL when updated --- weed/server/filer_grpc_server.go | 12 +++++++++++- weed/shell/command_remote_meta_sync.go | 1 + weed/shell/command_remote_mount.go | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/weed/server/filer_grpc_server.go b/weed/server/filer_grpc_server.go index ef5225181..cd555f2c2 100644 --- a/weed/server/filer_grpc_server.go +++ b/weed/server/filer_grpc_server.go @@ -153,7 +153,12 @@ func (fs *FilerServer) CreateEntry(ctx context.Context, req *filer_pb.CreateEntr } newEntry := filer.FromPbEntry(req.Directory, req.Entry) newEntry.Chunks = chunks - newEntry.TtlSec = so.TtlSeconds + // Don't apply TTL to remote entries - they're managed by remote storage + if newEntry.Remote == nil { + newEntry.TtlSec = so.TtlSeconds + } else { + newEntry.TtlSec = 0 + } createErr := fs.filer.CreateEntry(ctx, newEntry, req.OExcl, req.IsFromOtherCluster, req.Signatures, req.SkipCheckParentDirectory, so.MaxFileNameLength) @@ -185,6 +190,11 @@ func (fs *FilerServer) UpdateEntry(ctx context.Context, req *filer_pb.UpdateEntr newEntry := filer.FromPbEntry(req.Directory, req.Entry) newEntry.Chunks = chunks + // Don't apply TTL to remote entries - they're managed by remote storage + if newEntry.Remote != nil { + newEntry.TtlSec = 0 + } + if filer.EqualEntry(entry, newEntry) { return &filer_pb.UpdateEntryResponse{}, err } diff --git a/weed/shell/command_remote_meta_sync.go b/weed/shell/command_remote_meta_sync.go index d71ba1608..dc9cb9c68 100644 --- a/weed/shell/command_remote_meta_sync.go +++ b/weed/shell/command_remote_meta_sync.go @@ -160,6 +160,7 @@ func pullMetadata(commandEnv *CommandEnv, writer io.Writer, localMountedDir util FileSize: uint64(remoteEntry.RemoteSize), Mtime: remoteEntry.RemoteMtime, FileMode: uint32(0644), + TtlSec: 0, // Remote entries should not have TTL }, RemoteEntry: remoteEntry, }, diff --git a/weed/shell/command_remote_mount.go b/weed/shell/command_remote_mount.go index 144aa079a..e9237866c 100644 --- a/weed/shell/command_remote_mount.go +++ b/weed/shell/command_remote_mount.go @@ -188,6 +188,7 @@ func doSaveRemoteEntry(client filer_pb.SeaweedFilerClient, localDir string, exis existingEntry.Attributes.FileSize = uint64(remoteEntry.RemoteSize) existingEntry.Attributes.Mtime = remoteEntry.RemoteMtime existingEntry.Attributes.Md5 = nil + existingEntry.Attributes.TtlSec = 0 // Remote entries should not have TTL existingEntry.Chunks = nil existingEntry.Content = nil _, updateErr := client.UpdateEntry(context.Background(), &filer_pb.UpdateEntryRequest{