diff --git a/pkg/local_object_storage/shard/control.go b/pkg/local_object_storage/shard/control.go index d2795412d7..1203744403 100644 --- a/pkg/local_object_storage/shard/control.go +++ b/pkg/local_object_storage/shard/control.go @@ -39,9 +39,10 @@ func (s *Shard) Init() error { } } - gc := &gc{ - gcCfg: s.gcCfg, - remover: s.removeGarbage, + s.gc = &gc{ + gcCfg: s.gcCfg, + remover: s.removeGarbage, + stopChannel: make(chan struct{}), mEventHandler: map[eventType]*eventHandlers{ eventNewEpoch: { cancelFunc: func() {}, @@ -53,7 +54,7 @@ func (s *Shard) Init() error { }, } - gc.init() + s.gc.init() return nil } @@ -74,5 +75,7 @@ func (s *Shard) Close() error { } } + s.gc.stop() + return nil } diff --git a/pkg/local_object_storage/shard/gc.go b/pkg/local_object_storage/shard/gc.go index 9b916c1fc9..395d0d4673 100644 --- a/pkg/local_object_storage/shard/gc.go +++ b/pkg/local_object_storage/shard/gc.go @@ -52,6 +52,8 @@ type eventHandlers struct { type gc struct { *gcCfg + stopChannel chan struct{} + workerPool util.WorkerPool remover func() @@ -146,12 +148,21 @@ func (gc *gc) tickRemover() { defer timer.Stop() for { - <-timer.C - gc.remover() - timer.Reset(gc.removerInterval) + select { + case <-gc.stopChannel: + gc.log.Debug("GC is stopped") + return + case <-timer.C: + gc.remover() + timer.Reset(gc.removerInterval) + } } } +func (gc *gc) stop() { + gc.stopChannel <- struct{}{} +} + // iterates over metabase graveyard and deletes objects // with GC-marked graves. func (s *Shard) removeGarbage() { diff --git a/pkg/local_object_storage/shard/shard.go b/pkg/local_object_storage/shard/shard.go index b85403e290..0f470728e9 100644 --- a/pkg/local_object_storage/shard/shard.go +++ b/pkg/local_object_storage/shard/shard.go @@ -18,6 +18,8 @@ import ( type Shard struct { *cfg + gc *gc + mode *atomic.Uint32 writeCache writecache.Cache