1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15+ import logging
1516import threading
1617import time
1718import sys
18- import heapq
1919from redis_store import RedisStore
2020
21+ logging .basicConfig (
22+ level = logging .DEBUG ,
23+ format = "[%(levelname)s %(asctime)s %(filename)s:%(lineno)d] %(message)s" )
24+
2125
2226class ServiceTable (object ):
2327 def __init__ (self , ip = '127.0.0.1' , port = 6379 , passwd = None ,
@@ -43,15 +47,16 @@ def __init__(self, ip='127.0.0.1', port=6379, passwd=None,
4347 # {fd: set(servers), }
4448 self ._fd_to_servers = {}
4549 self ._server_to_fds = {}
46- self ._fd_to_update = {}
50+ self ._fd_to_version = {}
4751 self ._fd_to_max_num = {}
4852
49- def is_servers_update (self , fd ):
50- ret = self ._fd_to_update [fd ]
51- self ._fd_to_update [fd ] = False
52- if ret is True :
53- return ret , list (self ._fd_to_servers [fd ])
54- return ret , []
53+ def is_servers_update (self , fd , version ):
54+ new_version = self ._fd_to_version [fd ]
55+
56+ if new_version > version : # is update
57+ return new_version , list (self ._fd_to_servers [fd ])
58+ else :
59+ return new_version , None
5560
5661 def get_servers (self , fd , num ):
5762 if fd not in self ._fd_to_service_name :
@@ -62,13 +67,12 @@ def get_servers(self, fd, num):
6267 if service_name not in self ._service_name_to_servers or \
6368 self ._service_name_to_update [service_name ] is True :
6469 self ._refresh_service (service_name )
65- self ._fd_to_update [fd ] = False
6670
6771 return list (self ._fd_to_servers [fd ])
6872
6973 def add_service_name (self , fd , service_name , num ):
7074 self ._fd_to_servers [fd ] = set ()
71- self ._fd_to_update [fd ] = False
75+ self ._fd_to_version [fd ] = 0
7276 self ._fd_to_max_num [fd ] = num
7377 print ('fd={}, service_name={}, max_num={}' .format (fd , service_name ,
7478 num ))
@@ -103,7 +107,7 @@ def rm_service_name(self, fd):
103107 del self ._fd_to_service_name [fd ]
104108
105109 del self ._fd_to_max_num [fd ]
106- del self ._fd_to_update [fd ]
110+ del self ._fd_to_version [fd ]
107111
108112 for server in self ._fd_to_servers [fd ]:
109113 self ._server_to_fds [server ].remove (fd )
@@ -163,7 +167,7 @@ def _refresh_service(self, service_name):
163167 with self ._mutex :
164168 if service_name not in self ._service_name_to_fds :
165169 for fd in update_fd :
166- self ._fd_to_update [fd ] = True
170+ self ._fd_to_version [fd ] += 1
167171 return
168172 fd_num = len (self ._service_name_to_fds [service_name ])
169173
@@ -172,7 +176,7 @@ def _refresh_service(self, service_name):
172176 if server_num == 0 :
173177 print ('service={} server_num=0' .format (service_name ))
174178 for fd in update_fd :
175- self ._fd_to_update [fd ] = True
179+ self ._fd_to_version [fd ] += 1
176180 return
177181 # assume: fd_num=3, server_num=97
178182 # assign: {fd0:32, fd1:32, fd2:32}
@@ -193,24 +197,23 @@ def _refresh_service(self, service_name):
193197 self ._fd_to_servers [fd ].remove (server )
194198 update_fd .add (fd )
195199 print ('pop fd={} server={}' .format (fd , server ))
196- # add heap
197- # heapq.heappush(server_conn, (len(self._server_to_fds[server]), server))
198-
199- # Todo. use ReadWrite Lock
200200 try :
201- # fd greed connect with server
202- for fd in self . _service_name_to_fds [ service_name ] :
201+ fds = self . _service_name_to_fds [ service_name ]
202+ for fd in fds :
203203 max_connect = min (fd_max_connect , self ._fd_to_max_num [fd ])
204- print ('fd={} max_connect={}' .format (fd , max_connect ))
204+ logging . info ('fd={} max_connect={}' .format (fd , max_connect ))
205205 if fd not in self ._fd_to_servers :
206206 self ._fd_to_servers [fd ] = set ()
207207 # limit connect of fd
208208 while len (self ._fd_to_servers [fd ]) > max_connect :
209209 server = self ._fd_to_servers [fd ].pop ()
210210 self ._server_to_fds [server ].remove (fd )
211211 update_fd .add (fd )
212- print ('pop1 fd={} server={}' .format (fd , server ))
212+ logging . info ('pop1 fd={} server={}' .format (fd , server ))
213213
214+ # fd greed connect with server
215+ for fd in fds :
216+ max_connect = min (fd_max_connect , self ._fd_to_max_num [fd ])
214217 for server in servers :
215218 if len (self ._fd_to_servers [fd ]) >= max_connect :
216219 break
@@ -222,12 +225,12 @@ def _refresh_service(self, service_name):
222225 self ._fd_to_servers [fd ].add (server )
223226 self ._server_to_fds [server ].add (fd )
224227 update_fd .add (fd )
225- print ('add fd={} server={}' .format (fd , server ))
228+ logging . info ('add fd={} server={}' .format (fd , server ))
226229 except Exception , e :
227230 sys .stderr .write (str (e ) + '\n ' )
228231
229232 for fd in update_fd :
230- self ._fd_to_update [fd ] = True
233+ self ._fd_to_version [fd ] += 1
231234
232235 def _refresh (self ):
233236 while True :
0 commit comments