[] shard: Lock shard's mode mutex on close

To prevent race between GC handlers and close.

Change-Id: I06219230964f000f666a56158d3563c760518c3b
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
This commit is contained in:
Dmitrii Stepanov 2025-04-14 09:51:50 +03:00
parent fd37cea443
commit f37babdc54
Signed by: dstepanov-yadro
GPG key ID: 237AF1A763293BC0

View file

@ -363,6 +363,7 @@ func (s *Shard) refillTombstoneObject(ctx context.Context, obj *objectSDK.Object
// Close releases all Shard's components.
func (s *Shard) Close(ctx context.Context) error {
unlock := s.lockExclusive()
if s.rb != nil {
s.rb.Stop(ctx, s.log)
}
@ -388,15 +389,19 @@ func (s *Shard) Close(ctx context.Context) error {
}
}
if s.opsLimiter != nil {
s.opsLimiter.Close()
}
unlock()
// GC waits for handlers and remover to complete. Handlers may try to lock shard's lock.
// So to prevent deadlock GC stopping is outside of exclusive lock.
// If Init/Open was unsuccessful gc can be nil.
if s.gc != nil {
s.gc.stop(ctx)
}
if s.opsLimiter != nil {
s.opsLimiter.Close()
}
return lastErr
}