winlin

update api, select the lowest load of peer

@@ -430,6 +430,8 @@ class CdnNode: @@ -430,6 +430,8 @@ class CdnNode:
430 430
431 self.public_ip = cherrypy.request.remote.ip 431 self.public_ip = cherrypy.request.remote.ip
432 self.heartbeat = time.time() 432 self.heartbeat = time.time()
  433 +
  434 + self.clients = 0
433 435
434 def dead(self): 436 def dead(self):
435 dead_time_seconds = 10 437 dead_time_seconds = 10
@@ -446,6 +448,7 @@ class CdnNode: @@ -446,6 +448,7 @@ class CdnNode:
446 data["public_ip"] = self.public_ip 448 data["public_ip"] = self.public_ip
447 data["heartbeat"] = self.heartbeat 449 data["heartbeat"] = self.heartbeat
448 data["heartbeat_h"] = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.heartbeat)) 450 data["heartbeat_h"] = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.heartbeat))
  451 + data["clients"] = self.clients
449 return data 452 return data
450 453
451 ''' 454 '''
@@ -494,6 +497,16 @@ class RESTNodes(object): @@ -494,6 +497,16 @@ class RESTNodes(object):
494 for node in peers: 497 for node in peers:
495 data.append(node.json_dump()) 498 data.append(node.json_dump())
496 return data 499 return data
  500 +
  501 + def __select_peer(self, peers, ip):
  502 + target = None
  503 + for peer in peers:
  504 + if target is None or target.clients > peer.clients:
  505 + target = peer
  506 + if target is None:
  507 + return None
  508 + target.clients += 1
  509 + return target.ip
497 510
498 def GET(self, type=None, format=None, origin=None, vhost=None, port=None, stream=None): 511 def GET(self, type=None, format=None, origin=None, vhost=None, port=None, stream=None):
499 enable_crossdomain() 512 enable_crossdomain()
@@ -506,7 +519,7 @@ class RESTNodes(object): @@ -506,7 +519,7 @@ class RESTNodes(object):
506 server = origin 519 server = origin
507 peers = self.__get_peers_for_play(ip) 520 peers = self.__get_peers_for_play(ip)
508 if len(peers) > 0: 521 if len(peers) > 0:
509 - server = peers[0].ip 522 + server = self.__select_peer(peers, ip)
510 if type == "hls": 523 if type == "hls":
511 hls_url = "http://%s:%s/%s.m3u8"%(server, port, stream) 524 hls_url = "http://%s:%s/%s.m3u8"%(server, port, stream)
512 hls_url = hls_url.replace(".m3u8.m3u8", ".m3u8") 525 hls_url = hls_url.replace(".m3u8.m3u8", ".m3u8")
@@ -548,6 +561,11 @@ class RESTNodes(object): @@ -548,6 +561,11 @@ class RESTNodes(object):
548 561
549 node.heartbeat = time.time() 562 node.heartbeat = time.time()
550 node.srs_status = str(json_req["srs_status"]) 563 node.srs_status = str(json_req["srs_status"])
  564 + node.ip = str(json_req["ip"])
  565 + node.public_ip = cherrypy.request.remote.ip
  566 + # reset if restart.
  567 + if node.srs_status != "running":
  568 + node.clients = 0
551 569
552 self.__refresh_nodes() 570 self.__refresh_nodes()
553 peers = self.__get_peers(node) 571 peers = self.__get_peers(node)