@@ -11,6 +11,7 @@ import (
1111 "context"
1212 "fmt"
1313 "io"
14+ "os"
1415 "path"
1516 "strings"
1617 "sync"
@@ -37,6 +38,7 @@ import (
3738 "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/activity"
3839 "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/cont"
3940 "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/defaults"
41+ "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/fs"
4042 "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/health"
4143 "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/pgtool"
4244 "gitlab.com/postgres-ai/database-lab/v3/internal/retrieval/engine/postgres/tools/query"
@@ -65,6 +67,9 @@ const (
6567 // WAL parsing constants.
6668 walNameLen = 24
6769 pgVersion10 = 10
70+
71+ logDirName = "log"
72+ defaultLogRetentionDays = 7
6873)
6974
7075var defaultRecoveryCfg = map [string ]string {
@@ -351,6 +356,11 @@ func (p *PhysicalInitial) run(ctx context.Context) (err error) {
351356 return errors .Wrapf (err , "failed to create \" pre\" clone %s" , cloneName )
352357 }
353358
359+ cloneDataDir := path .Join (p .fsPool .ClonesDir (), cloneName , p .fsPool .DataSubDir )
360+ if err := fs .CleanupLogsDir (cloneDataDir ); err != nil {
361+ log .Warn ("Failed to clean up logs directory:" , err .Error ())
362+ }
363+
354364 defer func () {
355365 if err != nil {
356366 if errDestroy := p .cloneManager .DestroyClone (cloneName ); errDestroy != nil {
@@ -361,7 +371,7 @@ func (p *PhysicalInitial) run(ctx context.Context) (err error) {
361371
362372 // Promotion.
363373 if p .options .Promotion .Enabled {
364- if err := p .promoteInstance (ctx , path . Join ( p . fsPool . ClonesDir (), cloneName , p . fsPool . DataSubDir ) , syState ); err != nil {
374+ if err := p .promoteInstance (ctx , cloneDataDir , syState ); err != nil {
365375 return errors .Wrap (err , "failed to promote instance" )
366376 }
367377 }
@@ -387,6 +397,45 @@ func (p *PhysicalInitial) run(ctx context.Context) (err error) {
387397
388398 p .tm .SendEvent (ctx , telemetry .SnapshotCreatedEvent , telemetry.SnapshotCreated {})
389399
400+ if err := p .cleanupOldLogs (); err != nil {
401+ log .Warn ("cannot clean up old logs" , err .Error ())
402+ }
403+
404+ return nil
405+ }
406+
407+ func (p * PhysicalInitial ) cleanupOldLogs () error {
408+ lastWeekTime := time .Now ().AddDate (0 , 0 , - 1 * defaultLogRetentionDays )
409+
410+ log .Dbg ("Cleaning up PGDATA logs older than" , lastWeekTime .Format (time .DateTime ))
411+
412+ logDir := path .Join (p .fsPool .DataDir (), logDirName )
413+
414+ dirEntries , err := os .ReadDir (logDir )
415+ if err != nil {
416+ return err
417+ }
418+
419+ var fileCounter int
420+
421+ for _ , logFile := range dirEntries {
422+ info , err := logFile .Info ()
423+ if err != nil {
424+ continue
425+ }
426+
427+ if info .ModTime ().Before (lastWeekTime ) {
428+ logFilename := path .Join (logDir , logFile .Name ())
429+ if err := os .RemoveAll (logFilename ); err != nil {
430+ log .Warn ("cannot remove old log file %s: %s" , logFilename , err .Error ())
431+ }
432+
433+ fileCounter ++
434+ }
435+ }
436+
437+ log .Dbg ("Old PGDATA logs have been cleaned. Number of deleted files: " , fileCounter )
438+
390439 return nil
391440}
392441
0 commit comments