addressCache.py (3490B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\script\net\addressCache.py 2 from cluster import SERVICE_ALL 3 from collections import defaultdict 4 from itertools import chain 5 6 class MachoAddressCache(object): 7 __guid__ = 'gps.AddressCache' 8 9 def __init__(self): 10 self._nodeIDsByServiceAddress = {} 11 self._nodeIDsByServiceMask = defaultdict(set) 12 self._deadNodes = set() 13 self._knownNodes = set() 14 15 @staticmethod 16 def _extractBits(i): 17 cur = 1 18 ret = [] 19 while i > 0: 20 if i & 1: 21 ret.append(cur) 22 cur = cur + 1 23 i = i >> 1 24 25 return ret 26 27 def GetByServiceAddress(self, service, address): 28 try: 29 return self._nodeIDsByServiceAddress[service, address] 30 except KeyError: 31 return None 32 33 def SetServiceAddress(self, service, address, nodeID): 34 key = (service, address) 35 result = key not in self._nodeIDsByServiceAddress 36 self._nodeIDsByServiceAddress[key] = nodeID 37 self._knownNodes.add(nodeID) 38 return result 39 40 def RemoveServiceAddress(self, service, address): 41 try: 42 del self._nodeIDsByServiceAddress[service, address] 43 return True 44 except KeyError: 45 return False 46 47 def GetCachedServiceAddressMap(self): 48 nodeMap = defaultdict(list) 49 for serviceAddress, nodeID in self._nodeIDsByServiceAddress.iteritems(): 50 nodeMap[nodeID].append(serviceAddress) 51 52 return nodeMap 53 54 def GetByServiceMask(self, serviceMask): 55 return self._nodeIDsByServiceMask[serviceMask] 56 57 def SetNodeForServiceMask(self, nodeID, serviceMask): 58 result = nodeID in self._nodeIDsByServiceMask[serviceMask] 59 if not result: 60 self._nodeIDsByServiceMask[serviceMask].add(nodeID) 61 self._knownNodes.add(nodeID) 62 return result 63 64 def LoadNodeToServiceMaskMapping(self, nodeID, serviceMask): 65 if serviceMask is None: 66 serviceMask = SERVICE_ALL 67 for bit in self._extractBits(serviceMask): 68 self._nodeIDsByServiceMask[bit].add(nodeID) 69 70 self._knownNodes.add(nodeID) 71 72 def ResolveServiceMask(self, serviceMask): 73 nodeIDs = set() 74 for bit in self._extractBits(serviceMask): 75 nodeIDs.update(self.GetByServiceMask(bit)) 76 77 return nodeIDs 78 79 def IsDeadNode(self, nodeID): 80 return nodeID in self._deadNodes 81 82 def MarkDeadNode(self, nodeID): 83 self.RemoveAllForNode(nodeID) 84 self._deadNodes.add(nodeID) 85 86 def UnmarkDeadNode(self, nodeID): 87 self._deadNodes.discard(nodeID) 88 89 def RemoveAllForNode(self, nodeID): 90 for serviceAddress in {sAddr for sAddr, nID in self._nodeIDsByServiceAddress.iteritems() if nID == nodeID}: 91 del self._nodeIDsByServiceAddress[serviceAddress] 92 93 for serviceMaskMapping in self._nodeIDsByServiceMask.itervalues(): 94 serviceMaskMapping.discard(nodeID) 95 96 def GetCachedServiceMaskMap(self): 97 return self._nodeIDsByServiceMask 98 99 def IsKnownNode(self, nodeID): 100 return nodeID in self._knownNodes 101 102 def Clear(self): 103 self._nodeIDsByServiceAddress.clear() 104 self._nodeIDsByServiceMask.clear() 105 106 def Report(self): 107 return '%d service addresses cached along with %d serviceMask addresses' % (len(self._nodeIDsByServiceAddress), len(self._nodeIDsByServiceMask))