aboutsummaryrefslogtreecommitdiff
path: root/weed/topology/disk_ec.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/topology/disk_ec.go')
-rw-r--r--weed/topology/disk_ec.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/weed/topology/disk_ec.go b/weed/topology/disk_ec.go
new file mode 100644
index 000000000..74a06b47f
--- /dev/null
+++ b/weed/topology/disk_ec.go
@@ -0,0 +1,84 @@
+package topology
+
+import (
+ "github.com/chrislusf/seaweedfs/weed/storage/erasure_coding"
+ "github.com/chrislusf/seaweedfs/weed/storage/needle"
+ "github.com/chrislusf/seaweedfs/weed/storage/types"
+)
+
+func (d *Disk) GetEcShards() (ret []*erasure_coding.EcVolumeInfo) {
+ d.RLock()
+ for _, ecVolumeInfo := range d.ecShards {
+ ret = append(ret, ecVolumeInfo)
+ }
+ d.RUnlock()
+ return ret
+}
+
+func (d *Disk) AddOrUpdateEcShard(s *erasure_coding.EcVolumeInfo) {
+ d.ecShardsLock.Lock()
+ defer d.ecShardsLock.Unlock()
+
+ delta := 0
+ if existing, ok := d.ecShards[s.VolumeId]; !ok {
+ d.ecShards[s.VolumeId] = s
+ delta = s.ShardBits.ShardIdCount()
+ } else {
+ oldCount := existing.ShardBits.ShardIdCount()
+ existing.ShardBits = existing.ShardBits.Plus(s.ShardBits)
+ delta = existing.ShardBits.ShardIdCount() - oldCount
+ }
+
+ deltaDiskUsages := newDiskUsages()
+ deltaDiskUsage := deltaDiskUsages.getOrCreateDisk(types.ToDiskType(string(d.Id())))
+ deltaDiskUsage.ecShardCount = int64(delta)
+ d.UpAdjustDiskUsageDelta(deltaDiskUsages)
+
+}
+
+func (d *Disk) DeleteEcShard(s *erasure_coding.EcVolumeInfo) {
+ d.ecShardsLock.Lock()
+ defer d.ecShardsLock.Unlock()
+
+ if existing, ok := d.ecShards[s.VolumeId]; ok {
+ oldCount := existing.ShardBits.ShardIdCount()
+ existing.ShardBits = existing.ShardBits.Minus(s.ShardBits)
+ delta := existing.ShardBits.ShardIdCount() - oldCount
+
+ deltaDiskUsages := newDiskUsages()
+ deltaDiskUsage := deltaDiskUsages.getOrCreateDisk(types.ToDiskType(string(d.Id())))
+ deltaDiskUsage.ecShardCount = int64(delta)
+ d.UpAdjustDiskUsageDelta(deltaDiskUsages)
+
+ if existing.ShardBits.ShardIdCount() == 0 {
+ delete(d.ecShards, s.VolumeId)
+ }
+ }
+
+}
+
+func (d *Disk) HasVolumesById(id needle.VolumeId) (hasVolumeId bool) {
+
+ // check whether normal volumes has this volume id
+ d.RLock()
+ _, ok := d.volumes[id]
+ if ok {
+ hasVolumeId = true
+ }
+ d.RUnlock()
+
+ if hasVolumeId {
+ return
+ }
+
+ // check whether ec shards has this volume id
+ d.ecShardsLock.RLock()
+ _, ok = d.ecShards[id]
+ if ok {
+ hasVolumeId = true
+ }
+ d.ecShardsLock.RUnlock()
+
+ return
+
+}