aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcoffeecloudgit <168399738+coffeecloudgit@users.noreply.github.com>2024-12-16 14:05:22 +0800
committerGitHub <noreply@github.com>2024-12-15 22:05:22 -0800
commit7eb8257126576921ff328059d4e5c503f9d53cf7 (patch)
tree32d69196d5daa2bc275a0582a7035903c13afee4
parent9b48ce0613ec135715edd626418cdf812f4ad854 (diff)
downloadseaweedfs-7eb8257126576921ff328059d4e5c503f9d53cf7.tar.xz
seaweedfs-7eb8257126576921ff328059d4e5c503f9d53cf7.zip
Update store.go (#6358)
Add lock for location.ecVolumes And single delete
-rw-r--r--weed/storage/store.go29
1 files changed, 21 insertions, 8 deletions
diff --git a/weed/storage/store.go b/weed/storage/store.go
index 3e2c8bcca..b138ef457 100644
--- a/weed/storage/store.go
+++ b/weed/storage/store.go
@@ -381,19 +381,32 @@ func (s *Store) CollectHeartbeat() *master_pb.Heartbeat {
func (s *Store) deleteExpiredEcVolumes() (ecShards, deleted []*master_pb.VolumeEcShardInformationMessage) {
for _, location := range s.Locations {
+ // Collect ecVolume to be deleted
+ var toDeleteEvs []*erasure_coding.EcVolume
+ location.ecVolumesLock.RLock()
for _, ev := range location.ecVolumes {
- messages := ev.ToVolumeEcShardInformationMessage()
if ev.IsTimeToDestroy() {
- err := location.deleteEcVolumeById(ev.VolumeId)
- if err != nil {
- ecShards = append(ecShards, messages...)
- glog.Errorf("delete EcVolume err %d: %v", ev.VolumeId, err)
- continue
- }
- deleted = append(deleted, messages...)
+ toDeleteEvs = append(toDeleteEvs, ev)
} else {
+ messages := ev.ToVolumeEcShardInformationMessage()
+ ecShards = append(ecShards, messages...)
+ }
+ }
+ location.ecVolumesLock.RUnlock()
+
+ // Delete expired volumes
+ for _, ev := range toDeleteEvs {
+ messages := ev.ToVolumeEcShardInformationMessage()
+ // deleteEcVolumeById has its own lock
+ err := location.deleteEcVolumeById(ev.VolumeId)
+ if err != nil {
ecShards = append(ecShards, messages...)
+ glog.Errorf("delete EcVolume err %d: %v", ev.VolumeId, err)
+ continue
}
+ // No need for additional lock here since we only need the messages
+ // from volumes that were already collected
+ deleted = append(deleted, messages...)
}
}
return