Traefik v3.7.17 (GHSA-xv5x-242w-7hf7); R-1347 a restore forgets the update-held flag; R-1348 a failed put-back at start-up mails; R-1339, R-1351, R-1323 truthful start-up lines and one lock over FileBrowser's compose. Commit only.
gates / gates (push) Successful in 29s
gates / gates (push) Successful in 29s
This commit is contained in:
1 parent
a90b62323f
commit
c4b6844d34
19 files changed
+569
-9
No files matched your search
@@ -3769,6 +3769,15 @@ func skipFileBrowserPath(path string, isMount func(string) bool) bool {
|
||||
return strings.HasPrefix(path, StableParentDir+"/") && !isMount(path)
|
||||
}
|
||||
|
||||
// fbDriveRoot is the drive a path under StableParentDir lives on (…/scratch_hdd/userdata/x → …/scratch_hdd).
|
||||
func fbDriveRoot(path string) string {
|
||||
rest := strings.TrimPrefix(path, StableParentDir+"/")
|
||||
if i := strings.Index(rest, "/"); i >= 0 {
|
||||
rest = rest[:i]
|
||||
}
|
||||
return StableParentDir + "/" + rest
|
||||
}
|
||||
|
||||
func (s *Server) syncFileBrowserMounts(resetDBOnChange bool) {
|
||||
// R-695 (v0.275.0): SINGLE-FLIGHT. A request is covered by any sync that STARTS reading the state
|
||||
// after the request was made: a caller that waited behind a running sync returns as soon as one
|
||||
@@ -3917,6 +3926,13 @@ func (s *Server) syncFileBrowserMounts(resetDBOnChange bool) {
|
||||
}
|
||||
s.fbForceMu.Unlock()
|
||||
|
||||
// R-1351: the base stack's bring-up may run `compose up` on this same stack in the same second (a guest boot); the loser
|
||||
// logged „Conflict. The container name … is already in use". One lock over both compose paths.
|
||||
if s.stackMgr != nil {
|
||||
unlock := s.stackMgr.LockFileBrowserStack()
|
||||
defer unlock()
|
||||
}
|
||||
|
||||
// If sources changed and caller requested a DB reset (restore flow),
|
||||
// nuke the data volume so FileBrowser re-reads config.yaml from scratch.
|
||||
// Normal operations skip this to preserve user accounts, permissions, and share links.
|
||||
@@ -4015,8 +4031,16 @@ func buildFileBrowserPaths(paths []settings.StoragePath, d fbPathDeps) (storageM
|
||||
// FileBrowser this pass. It returns on the next sync after reconnect. Matches planDriveGates'
|
||||
// external-only rule (system paths, not under StableParentDir, are never skipped).
|
||||
if skipFileBrowserPath(sp.Path, d.isMount) {
|
||||
// R-1339: a per-app folder (<drive>/userdata/<app>) is never a mountpoint itself. Under a MOUNTED drive it is shown
|
||||
// through the drive's own bind, so it gets no bind of its own and there is nothing to report: the old „not mounted"
|
||||
// line was false nine times at every start on a box whose drive worked. Pinned by TestR1339_*.
|
||||
if d.logger != nil {
|
||||
d.logger.Printf("[INFO] [web] FileBrowser: drive %s not mounted — skipping userdata skeleton", sp.Path)
|
||||
switch root := fbDriveRoot(sp.Path); {
|
||||
case root == sp.Path:
|
||||
d.logger.Printf("[INFO] [web] FileBrowser: drive %s not mounted — skipping userdata skeleton", sp.Path)
|
||||
case !d.isMount(root):
|
||||
d.logger.Printf("[INFO] [web] FileBrowser: drive %s not mounted — skipping its folder %s", root, sp.Path)
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user