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.
		
		
		
		
		
			
		
			
				
					
					
						
							100 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							100 lines
						
					
					
						
							2.7 KiB
						
					
					
				
								package topology
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"fmt"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/storage/types"
							 | 
						|
								
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/storage/needle"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/storage/super_block"
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/util"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								type Collection struct {
							 | 
						|
									Name                     string
							 | 
						|
									volumeSizeLimit          uint64
							 | 
						|
									replicationAsMin         bool
							 | 
						|
									storageType2VolumeLayout *util.ConcurrentReadMap
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func NewCollection(name string, volumeSizeLimit uint64, replicationAsMin bool) *Collection {
							 | 
						|
									c := &Collection{
							 | 
						|
										Name:             name,
							 | 
						|
										volumeSizeLimit:  volumeSizeLimit,
							 | 
						|
										replicationAsMin: replicationAsMin,
							 | 
						|
									}
							 | 
						|
									c.storageType2VolumeLayout = util.NewConcurrentReadMap()
							 | 
						|
									return c
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) String() string {
							 | 
						|
									return fmt.Sprintf("Name:%s, volumeSizeLimit:%d, storageType2VolumeLayout:%v", c.Name, c.volumeSizeLimit, c.storageType2VolumeLayout)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) GetOrCreateVolumeLayout(rp *super_block.ReplicaPlacement, ttl *needle.TTL, diskType types.DiskType) *VolumeLayout {
							 | 
						|
									keyString := rp.String()
							 | 
						|
									if ttl != nil {
							 | 
						|
										keyString += ttl.String()
							 | 
						|
									}
							 | 
						|
									if diskType != types.HardDriveType {
							 | 
						|
										keyString += string(diskType)
							 | 
						|
									}
							 | 
						|
									vl := c.storageType2VolumeLayout.Get(keyString, func() interface{} {
							 | 
						|
										return NewVolumeLayout(rp, ttl, diskType, c.volumeSizeLimit, c.replicationAsMin)
							 | 
						|
									})
							 | 
						|
									return vl.(*VolumeLayout)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) GetVolumeLayout(rp *super_block.ReplicaPlacement, ttl *needle.TTL, diskType types.DiskType) (*VolumeLayout, bool) {
							 | 
						|
									keyString := rp.String()
							 | 
						|
									if ttl != nil {
							 | 
						|
										keyString += ttl.String()
							 | 
						|
									}
							 | 
						|
									if diskType != types.HardDriveType {
							 | 
						|
										keyString += string(diskType)
							 | 
						|
									}
							 | 
						|
									vl, ok := c.storageType2VolumeLayout.Find(keyString)
							 | 
						|
									return vl.(*VolumeLayout), ok
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) GetAllVolumeLayouts() []*VolumeLayout {
							 | 
						|
									var vls []*VolumeLayout
							 | 
						|
									for _, vl := range c.storageType2VolumeLayout.Items() {
							 | 
						|
										if vl != nil {
							 | 
						|
											vls = append(vls, vl.(*VolumeLayout))
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return vls
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) DeleteVolumeLayout(rp *super_block.ReplicaPlacement, ttl *needle.TTL, diskType types.DiskType) {
							 | 
						|
									keyString := rp.String()
							 | 
						|
									if ttl != nil {
							 | 
						|
										keyString += ttl.String()
							 | 
						|
									}
							 | 
						|
									if diskType != types.HardDriveType {
							 | 
						|
										keyString += string(diskType)
							 | 
						|
									}
							 | 
						|
									c.storageType2VolumeLayout.Delete(keyString)
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) Lookup(vid needle.VolumeId) []*DataNode {
							 | 
						|
									for _, vl := range c.storageType2VolumeLayout.Items() {
							 | 
						|
										if vl != nil {
							 | 
						|
											if list := vl.(*VolumeLayout).Lookup(vid); list != nil {
							 | 
						|
												return list
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return nil
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func (c *Collection) ListVolumeServers() (nodes []*DataNode) {
							 | 
						|
									for _, vl := range c.storageType2VolumeLayout.Items() {
							 | 
						|
										if vl != nil {
							 | 
						|
											if list := vl.(*VolumeLayout).ListVolumeServers(); list != nil {
							 | 
						|
												nodes = append(nodes, list...)
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									return
							 | 
						|
								}
							 |