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.
		
		
		
		
		
			
		
			
				
					
					
						
							62 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							62 lines
						
					
					
						
							1.7 KiB
						
					
					
				
								package pb
							 | 
						|
								
							 | 
						|
								import (
							 | 
						|
									"github.com/seaweedfs/seaweedfs/weed/glog"
							 | 
						|
									"reflect"
							 | 
						|
								)
							 | 
						|
								
							 | 
						|
								// ServerDiscovery encodes a way to find at least 1 instance of a service,
							 | 
						|
								// and provides utility functions to refresh the instance list
							 | 
						|
								type ServerDiscovery struct {
							 | 
						|
									list      []ServerAddress
							 | 
						|
									srvRecord *ServerSrvAddress
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								func NewServiceDiscoveryFromMap(m map[string]ServerAddress) (sd *ServerDiscovery) {
							 | 
						|
									sd = &ServerDiscovery{}
							 | 
						|
									for _, s := range m {
							 | 
						|
										sd.list = append(sd.list, s)
							 | 
						|
									}
							 | 
						|
									return sd
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// RefreshBySrvIfAvailable performs a DNS SRV lookup and updates list with the results
							 | 
						|
								// of the lookup
							 | 
						|
								func (sd *ServerDiscovery) RefreshBySrvIfAvailable() {
							 | 
						|
									if sd.srvRecord == nil {
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
									newList, err := sd.srvRecord.LookUp()
							 | 
						|
									if err != nil {
							 | 
						|
										glog.V(0).Infof("failed to lookup SRV for %s: %v", *sd.srvRecord, err)
							 | 
						|
									}
							 | 
						|
									if newList == nil || len(newList) == 0 {
							 | 
						|
										glog.V(0).Infof("looked up SRV for %s, but found no well-formed names", *sd.srvRecord)
							 | 
						|
										return
							 | 
						|
									}
							 | 
						|
									if !reflect.DeepEqual(sd.list, newList) {
							 | 
						|
										sd.list = newList
							 | 
						|
									}
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// GetInstances returns a copy of the latest known list of addresses
							 | 
						|
								// call RefreshBySrvIfAvailable prior to this in order to get a more up-to-date view
							 | 
						|
								func (sd *ServerDiscovery) GetInstances() (addresses []ServerAddress) {
							 | 
						|
									for _, a := range sd.list {
							 | 
						|
										addresses = append(addresses, a)
							 | 
						|
									}
							 | 
						|
									return addresses
							 | 
						|
								}
							 | 
						|
								func (sd *ServerDiscovery) GetInstancesAsStrings() (addresses []string) {
							 | 
						|
									for _, i := range sd.list {
							 | 
						|
										addresses = append(addresses, string(i))
							 | 
						|
									}
							 | 
						|
									return addresses
							 | 
						|
								}
							 | 
						|
								func (sd *ServerDiscovery) GetInstancesAsMap() (addresses map[string]ServerAddress) {
							 | 
						|
									addresses = make(map[string]ServerAddress)
							 | 
						|
									for _, i := range sd.list {
							 | 
						|
										addresses[string(i)] = i
							 | 
						|
									}
							 | 
						|
									return addresses
							 | 
						|
								}
							 |