Skip to content

Commit b05170c

Browse files
committed
fix: ensure monitors work
1 parent 8b2b433 commit b05170c

File tree

8 files changed

+80
-7
lines changed

8 files changed

+80
-7
lines changed

compose.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ services:
1515
security_opt:
1616
- apparmor:unconfined
1717
volumes:
18-
- ./config.yaml:/data/config.yaml
19-
- ./rclone.conf:/data/rclone.conf
18+
- ./data:/data
2019
- ./local-dev/mnt/rclone:/mnt/rclone:shared
2120
- ./local-dev/caches/rclone:/caches/rclone
2221
environment:

config.yaml renamed to data/config.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ mounts:
44
- backendName: "AllDebrid"
55
# This is the path to the mountpoint on the host
66
mountPoint: "/mnt/rclone/alldebrid"
7-
# These will be fully converted to vfsOpt and mountOpt payloads for the rclone mount command through RC. You can use your regular rclone env vars.
8-
# They override the shared options in the environment section of the compose / running container for this specific mount.
7+
# These override the shared options in the environment section of the compose / running container for this specific mount.
98
environment:
109
RCLONE_BWLIMIT: off
1110
RCLONE_READ_ONLY: true
File renamed without changes.

src/internal/mount_manager/helpers.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,17 @@ func removeStaleMounts(conf *config.Config, logger zerolog.Logger) {
7676
}
7777
}
7878
}
79+
80+
func ensureExists(mountPoint string, logger zerolog.Logger) {
81+
if _, err := os.Stat(mountPoint); os.IsNotExist(err) {
82+
logger.Info().Str(constants.LogMountPoint, mountPoint).Msg("Creating mount point...")
83+
err := os.MkdirAll(mountPoint, 0777)
84+
if err != nil {
85+
logger.Error().Err(err).Str(constants.LogMountPoint, mountPoint).
86+
Msg("Failed to create mount point")
87+
} else {
88+
logger.Info().Str(constants.LogMountPoint, mountPoint).
89+
Msg("Mount point created successfully.")
90+
}
91+
}
92+
}

src/internal/mount_manager/monitor.go

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,16 @@ func MonitorMountProcesses(logger zerolog.Logger) {
2222
shouldMonitorProcesses = true
2323

2424
for {
25+
logger.Debug().Msg("Checking mount processes...")
2526
if !shouldMonitorProcesses {
2627
logger.Info().Msg("Stopping rclone mount process monitor")
2728
break
2829
}
2930
tracker.Range(func(key, value interface{}) bool {
31+
if !shouldMonitorProcesses {
32+
return false
33+
}
34+
3035
mountProcess := value.(*MountProcess)
3136

3237
if time.Since(mountProcess.StartedAt) < mountProcess.GracePeriod {
@@ -38,14 +43,26 @@ func MonitorMountProcesses(logger zerolog.Logger) {
3843
logger.Warn().Str(constants.LogBackend, mountProcess.BackendName).
3944
Msgf("Process (PID: %d) died. Restarting...", mountProcess.PID)
4045

46+
if !shouldMonitorProcesses {
47+
return false
48+
}
49+
4150
UnmountEndpoint(mountProcess, logger)
4251

43-
newServe := &MountProcess{
52+
if !shouldMonitorProcesses {
53+
return false
54+
}
55+
56+
newMount := &MountProcess{
4457
MountPoint: mountProcess.MountPoint,
4558
RcloneProcess: mountProcess.RcloneProcess,
4659
}
4760

48-
newProcess := StartMountWithRetries(newServe, logger)
61+
newProcess := StartMountWithRetries(newMount, logger)
62+
63+
if !shouldMonitorProcesses {
64+
return false
65+
}
4966

5067
if newProcess != nil {
5168
tracker.Track(newProcess.BackendName, newProcess)
@@ -56,6 +73,8 @@ func MonitorMountProcesses(logger zerolog.Logger) {
5673
Msg("Failed to restart mount process")
5774
}
5875
}
76+
77+
logger.Debug().Str("MountPoint", mountProcess.MountPoint).Msg("Mount is mounted fine. Nothing to do.")
5978
return true
6079
})
6180
time.Sleep(10 * time.Second)

src/internal/mount_manager/mount.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ func InitializeMountEndpoints(conf *config.Config, logger zerolog.Logger, proces
3434
func StartMountWithRetries(instance *MountProcess, logger zerolog.Logger) *MountProcess {
3535
retries := 0
3636
for retries < 3 {
37+
ensureExists(instance.MountPoint, logger)
3738
cmd := createMountCommand(instance)
3839
instance.Command = cmd
3940
err := cmd.Start()
@@ -46,6 +47,18 @@ func StartMountWithRetries(instance *MountProcess, logger zerolog.Logger) *Mount
4647
instance.StartedAt = time.Now()
4748
instance.GracePeriod = 10 * time.Second
4849
tracker.Track(instance.BackendName, instance)
50+
go func() {
51+
err := cmd.Wait()
52+
if err != nil {
53+
logger.Warn().AnErr(constants.LogError, err).
54+
Str(constants.LogBackend, instance.BackendName).
55+
Msg("Mount process exited with error.")
56+
} else {
57+
logger.Info().
58+
Str(constants.LogBackend, instance.BackendName).
59+
Msg("Mount process exited normally.")
60+
}
61+
}()
4962
return instance
5063
}
5164
logger.Warn().AnErr(constants.LogError, err).Msgf("Mount failed. Retrying %d/3...", retries+1)
@@ -58,6 +71,7 @@ func StartMountWithRetries(instance *MountProcess, logger zerolog.Logger) *Mount
5871

5972
func StopMount(instance *MountProcess, logger zerolog.Logger) {
6073
logger.Info().Str(constants.LogBackend, instance.BackendName).Msg("Stopping mount process...")
74+
UnmountEndpoint(instance, logger)
6175
if err := instance.Command.Process.Kill(); err == nil {
6276
tracker.Untrack(instance.BackendName)
6377
logger.Info().Int(constants.LogPid, instance.PID).Str(constants.LogBackend, instance.BackendName).Msg("Mount process stopped")
@@ -67,6 +81,7 @@ func StopMount(instance *MountProcess, logger zerolog.Logger) {
6781
}
6882

6983
func Cleanup(config *config.Config, logger zerolog.Logger) {
84+
shouldMonitorProcesses = false
7085
logger.Info().Msg("Cleaning up all rclone mount processes")
7186
tracker.Range(func(key, value interface{}) bool {
7287
instance := value.(*MountProcess)
@@ -82,8 +97,8 @@ func ReconcileMounts(conf *config.Config, logger zerolog.Logger, processLock *sy
8297

8398
logger.Info().Msg("Reconciling mounts...")
8499

85-
setupMountsFromConfig(conf, logger)
86100
removeStaleMounts(conf, logger)
101+
setupMountsFromConfig(conf, logger)
87102
}
88103

89104
func UnmountEndpoint(mount *MountProcess, logger zerolog.Logger) {

src/internal/serve_manager/monitor.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,18 @@ func MonitorServeProcesses(logger zerolog.Logger) {
2222
shouldMonitorProcesses = true
2323

2424
for {
25+
logger.Debug().Msg("Checking serve processes...")
2526
if !shouldMonitorProcesses {
2627
logger.Info().Msg("Stopping rclone serve process monitor")
2728
break
2829
}
2930
tracker.Range(func(key, value interface{}) bool {
3031
serveProcess := value.(*ServeProcess)
3132

33+
if !shouldMonitorProcesses {
34+
return false
35+
}
36+
3237
if time.Since(serveProcess.StartedAt) < serveProcess.GracePeriod {
3338
logger.Debug().Int(constants.LogPid, serveProcess.PID).Msg("Skipping process check (within grace period)")
3439
return true
@@ -38,6 +43,10 @@ func MonitorServeProcesses(logger zerolog.Logger) {
3843
logger.Warn().Str(constants.LogBackend, serveProcess.BackendName).
3944
Msgf("Process (PID: %d) died. Restarting...", serveProcess.PID)
4045

46+
if !shouldMonitorProcesses {
47+
return false
48+
}
49+
4150
newServe := &ServeProcess{
4251
Protocol: serveProcess.Protocol,
4352
Addr: serveProcess.Addr,
@@ -46,6 +55,10 @@ func MonitorServeProcesses(logger zerolog.Logger) {
4655

4756
newProcess := StartServeWithRetries(newServe, logger)
4857

58+
if !shouldMonitorProcesses {
59+
return false
60+
}
61+
4962
if newProcess != nil {
5063
tracker.Track(newProcess.BackendName, newProcess)
5164
logger.Info().Str(constants.LogBackend, serveProcess.BackendName).
@@ -55,6 +68,7 @@ func MonitorServeProcesses(logger zerolog.Logger) {
5568
Msg("Failed to restart serve process")
5669
}
5770
}
71+
logger.Debug().Str("Backend", serveProcess.BackendName).Msg("Serve is fine. Nothing to do.")
5872
return true
5973
})
6074
time.Sleep(10 * time.Second)

src/internal/serve_manager/serve.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ func StartServeWithRetries(instance *ServeProcess, logger zerolog.Logger) *Serve
4848
instance.StartedAt = time.Now()
4949
instance.GracePeriod = 10 * time.Second
5050
tracker.Track(instance.BackendName, instance)
51+
go func() {
52+
err := cmd.Wait()
53+
if err != nil {
54+
logger.Warn().AnErr(constants.LogError, err).
55+
Str(constants.LogBackend, instance.BackendName).
56+
Msg("Serve process exited with error.")
57+
} else {
58+
logger.Info().
59+
Str(constants.LogBackend, instance.BackendName).
60+
Msg("Serve process exited normally.")
61+
}
62+
}()
5163
return instance
5264
}
5365
logger.Warn().AnErr(constants.LogError, err).Msgf("Serve failed. Retrying %d/3...", retries+1)
@@ -69,6 +81,7 @@ func StopServe(instance *ServeProcess, logger zerolog.Logger) {
6981
}
7082

7183
func Cleanup(logger zerolog.Logger) {
84+
shouldMonitorProcesses = false
7285
logger.Info().Msg("Cleaning up all rclone serve processes")
7386
tracker.Range(func(key, value interface{}) bool {
7487
instance := value.(*ServeProcess)

0 commit comments

Comments
 (0)