NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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))