mirror of
https://github.com/minio/minio.git
synced 2025-03-31 09:43:43 -04:00
resync: Avoid concurrent access/write on map (#15286)
fixes a crash ``` fatal error: concurrent map iteration and map write minio[19309]: goroutine 18640 [running]: minio[19309]: runtime.throw({0x27a3399?, 0x1785?}) minio[19309]: runtime/panic.go:992 +0x71 fp=0xc0062f1c80 sp=0xc0062f1c50 pc=0x438671 minio[19309]: runtime.mapiternext(0xc0062f1e90?) minio[19309]: runtime/map.go:871 +0x4eb fp=0xc0062f1cf0 sp=0xc0062f1c80 pc=0x41002b minio[19309]: github.com/minio/minio/cmd.(*ReplicationPool).periodicResyncMetaSave(0xc0056c00c0, {0x4d06a48, 0xc0005b2480}, {0x4d22fc0, 0xc0015ea0 ```
This commit is contained in:
parent
0149382cdc
commit
b4f6901903
@ -2214,18 +2214,21 @@ func (p *ReplicationPool) loadResync(ctx context.Context, buckets []BucketInfo,
|
|||||||
for index := range buckets {
|
for index := range buckets {
|
||||||
meta, err := loadBucketResyncMetadata(ctx, buckets[index].Name, objAPI)
|
meta, err := loadBucketResyncMetadata(ctx, buckets[index].Name, objAPI)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, errVolumeNotFound) {
|
if !errors.Is(err, errVolumeNotFound) {
|
||||||
meta = newBucketResyncStatus(buckets[index].Name)
|
|
||||||
} else {
|
|
||||||
logger.LogIf(ctx, err)
|
logger.LogIf(ctx, err)
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
p.resyncState.Lock()
|
||||||
p.resyncState.statusMap[buckets[index].Name] = meta
|
p.resyncState.statusMap[buckets[index].Name] = meta
|
||||||
|
p.resyncState.Unlock()
|
||||||
}
|
}
|
||||||
for index := range buckets {
|
for index := range buckets {
|
||||||
bucket := buckets[index].Name
|
bucket := buckets[index].Name
|
||||||
|
p.resyncState.RLock()
|
||||||
m, ok := p.resyncState.statusMap[bucket]
|
m, ok := p.resyncState.statusMap[bucket]
|
||||||
|
p.resyncState.RUnlock()
|
||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
for arn, st := range m.TargetsMap {
|
for arn, st := range m.TargetsMap {
|
||||||
if st.ResyncStatus == ResyncFailed || st.ResyncStatus == ResyncStarted {
|
if st.ResyncStatus == ResyncFailed || st.ResyncStatus == ResyncStarted {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user