Skip to content

Commit f795fe2

Browse files
refactor backup manager initialization to be asynchronous and wait for stationeers to create the world folder before starting the watcher in order for stationeers to be able to detect that it needs to create a new world (stationeers uses DoesFolderExist there)
1 parent 66e1d50 commit f795fe2

2 files changed

Lines changed: 60 additions & 12 deletions

File tree

src/backupmgr/backupinterface.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"time"
66

77
"github.com/JacksonTheMaster/StationeersServerUI/v5/src/config"
8+
"github.com/JacksonTheMaster/StationeersServerUI/v5/src/logger"
89
)
910

1011
// GlobalBackupManager is the singleton instance of the backup manager
@@ -20,16 +21,24 @@ func InitGlobalBackupManager(config BackupConfig) error {
2021
}
2122

2223
GlobalBackupManager = NewBackupManager(config)
23-
if err := GlobalBackupManager.Initialize(); err != nil {
24-
return err
25-
}
24+
25+
// Start initialization asynchronously
26+
_ = GlobalBackupManager.Initialize()
2627

2728
// Update all active HTTP handlers with the new manager
2829
for _, handler := range activeHTTPHandlers {
2930
handler.manager = GlobalBackupManager
3031
}
3132

32-
return GlobalBackupManager.Start()
33+
// Start the backup manager in a goroutine to avoid blocking
34+
go func() {
35+
if err := GlobalBackupManager.Start(); err != nil {
36+
logger.Backup.Error("Failed to start global backup manager: " + err.Error())
37+
}
38+
}()
39+
40+
// Return immediately, initialization will complete in the background
41+
return nil
3342
}
3443

3544
// RegisterHTTPHandler registers an HTTP handler to be updated when the manager changes

src/backupmgr/manager.go

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,61 @@ Background routines (file watching and cleanup) only start when Start() is calle
2020
can coexist but may conflict if configured with overlapping directories.
2121
*/
2222

23-
// Initialize sets up required directories
24-
func (m *BackupManager) Initialize() error {
23+
// Initialize checks for BackupDir and waits until it exists, then ensures SafeBackupDir exists.
24+
// It returns a channel that signals when initialization is complete or an error occurs.
25+
func (m *BackupManager) Initialize() <-chan error {
2526
m.mu.Lock()
2627
defer m.mu.Unlock()
2728

28-
if err := os.MkdirAll(m.config.BackupDir, os.ModePerm); err != nil {
29-
return err
30-
}
31-
return os.MkdirAll(m.config.SafeBackupDir, os.ModePerm)
29+
result := make(chan error, 1)
30+
31+
go func() {
32+
const timeout = 90 * time.Minute
33+
const pollInterval = 1000 * time.Millisecond
34+
deadline := time.Now().Add(timeout)
35+
36+
// Wait for BackupDir to exist
37+
for {
38+
if _, err := os.Stat(m.config.BackupDir); err == nil {
39+
// Directory exists, proceed
40+
break
41+
} else if !os.IsNotExist(err) {
42+
// An error other than "not exists" occurred
43+
result <- fmt.Errorf("error checking backup directory %s: %v", m.config.BackupDir, err)
44+
return
45+
}
46+
47+
if time.Now().After(deadline) {
48+
result <- fmt.Errorf("timeout waiting for backup directory %s to be created", m.config.BackupDir)
49+
return
50+
}
51+
52+
// Wait before checking again
53+
time.Sleep(pollInterval)
54+
//logger.Backup.Warn("Backup manager waiting for save folder to be created...")
55+
}
56+
57+
// Ensure SafeBackupDir exists, create it if it doesn't
58+
if err := os.MkdirAll(m.config.SafeBackupDir, os.ModePerm); err != nil {
59+
result <- fmt.Errorf("error creating safe backup directory %s: %v", m.config.SafeBackupDir, err)
60+
return
61+
}
62+
63+
result <- nil // Signal successful initialization
64+
}()
65+
66+
return result
3267
}
3368

3469
// Start begins the backup monitoring and cleanup routines
3570
func (m *BackupManager) Start() error {
36-
if err := m.Initialize(); err != nil {
37-
return fmt.Errorf("failed to initialize backup directories: %w", err)
71+
// Wait for initialization to complete
72+
logger.Backup.Warn("Backup manager waiting for save folder initialization...")
73+
initResult := <-m.Initialize()
74+
if initResult != nil {
75+
return fmt.Errorf("failed to initialize backup manager: %w", initResult)
3876
}
77+
logger.Backup.Warn("Backup manager initialized")
3978

4079
// Start file watcher
4180
watcher, err := newFsWatcher(m.config.BackupDir)

0 commit comments

Comments
 (0)