aboutsummaryrefslogtreecommitdiff
path: root/weed/topology/volume_layout.go
diff options
context:
space:
mode:
authorhilimd <68371223+hilimd@users.noreply.github.com>2020-10-26 22:01:50 +0800
committerGitHub <noreply@github.com>2020-10-26 22:01:50 +0800
commit843865f2ca534bb6286b7a3d79c436384d875608 (patch)
tree653943fe04caf3fe607416715fb341460a624ab7 /weed/topology/volume_layout.go
parentcf7a1c722fa82fa78c546f68e4814fff7dc6d1e2 (diff)
parent44921220b01d21c64755cbc7560ff8932f71984d (diff)
downloadseaweedfs-843865f2ca534bb6286b7a3d79c436384d875608.tar.xz
seaweedfs-843865f2ca534bb6286b7a3d79c436384d875608.zip
Merge pull request #33 from chrislusf/master
sync
Diffstat (limited to 'weed/topology/volume_layout.go')
-rw-r--r--weed/topology/volume_layout.go27
1 files changed, 19 insertions, 8 deletions
diff --git a/weed/topology/volume_layout.go b/weed/topology/volume_layout.go
index dddcfc9c9..ffe36e95b 100644
--- a/weed/topology/volume_layout.go
+++ b/weed/topology/volume_layout.go
@@ -139,7 +139,7 @@ func (vl *VolumeLayout) RegisterVolume(v *storage.VolumeInfo, dn *DataNode) {
vl.accessLock.Lock()
defer vl.accessLock.Unlock()
- defer vl.ensureCorrectWritables(v)
+ defer vl.ensureCorrectWritables(v.Id)
defer vl.rememberOversizedVolume(v, dn)
if _, ok := vl.vid2location[v.Id]; !ok {
@@ -189,7 +189,7 @@ func (vl *VolumeLayout) UnRegisterVolume(v *storage.VolumeInfo, dn *DataNode) {
vl.readonlyVolumes.Remove(v.Id, dn)
vl.oversizedVolumes.Remove(v.Id, dn)
- vl.ensureCorrectWritables(v)
+ vl.ensureCorrectWritables(v.Id)
if location.Length() == 0 {
delete(vl.vid2location, v.Id)
@@ -202,19 +202,30 @@ func (vl *VolumeLayout) EnsureCorrectWritables(v *storage.VolumeInfo) {
vl.accessLock.Lock()
defer vl.accessLock.Unlock()
- vl.ensureCorrectWritables(v)
+ vl.ensureCorrectWritables(v.Id)
}
-func (vl *VolumeLayout) ensureCorrectWritables(v *storage.VolumeInfo) {
- if vl.enoughCopies(v.Id) && vl.isWritable(v) {
- if !vl.oversizedVolumes.IsTrue(v.Id) {
- vl.setVolumeWritable(v.Id)
+func (vl *VolumeLayout) ensureCorrectWritables(vid needle.VolumeId) {
+ if vl.enoughCopies(vid) && vl.isAllWritable(vid) {
+ if !vl.oversizedVolumes.IsTrue(vid) {
+ vl.setVolumeWritable(vid)
}
} else {
- vl.removeFromWritable(v.Id)
+ vl.removeFromWritable(vid)
}
}
+func (vl *VolumeLayout) isAllWritable(vid needle.VolumeId) bool {
+ for _, dn := range vl.vid2location[vid].list {
+ if v, found := dn.volumes[vid]; found {
+ if v.ReadOnly {
+ return false
+ }
+ }
+ }
+ return true
+}
+
func (vl *VolumeLayout) isOversized(v *storage.VolumeInfo) bool {
return uint64(v.Size) >= vl.volumeSizeLimit
}