You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							87 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							87 lines
						
					
					
						
							1.9 KiB
						
					
					
				| package topology | |
| 
 | |
| import ( | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/erasure_coding" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| 	"github.com/seaweedfs/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 | |
| 	} | |
| 
 | |
| 	if delta == 0 { | |
| 		return | |
| 	} | |
| 	d.UpAdjustDiskUsageDelta(types.ToDiskType(string(d.Id())), &DiskUsageCounts{ | |
| 		ecShardCount: int64(delta), | |
| 	}) | |
| 
 | |
| } | |
| 
 | |
| 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 | |
| 
 | |
| 		if delta != 0 { | |
| 			d.UpAdjustDiskUsageDelta(types.ToDiskType(string(d.Id())), &DiskUsageCounts{ | |
| 				ecShardCount: int64(delta), | |
| 			}) | |
| 		} | |
| 
 | |
| 		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 | |
| 
 | |
| }
 |