正在显示
1 个修改的文件
包含
198 行增加
和
167 行删除
@@ -368,7 +368,8 @@ class RESTServers(object): | @@ -368,7 +368,8 @@ class RESTServers(object): | ||
368 | self.__nodes = [] | 368 | self.__nodes = [] |
369 | 369 | ||
370 | self.__last_update = datetime.datetime.now(); | 370 | self.__last_update = datetime.datetime.now(); |
371 | - server_ip = "192.168.1.142"; | 371 | + |
372 | + self.__lock = threading.Lock() | ||
372 | 373 | ||
373 | def __get_node(self, device_id): | 374 | def __get_node(self, device_id): |
374 | for node in self.__nodes: | 375 | for node in self.__nodes: |
@@ -415,28 +416,33 @@ class RESTServers(object): | @@ -415,28 +416,33 @@ class RESTServers(object): | ||
415 | ''' | 416 | ''' |
416 | def POST(self): | 417 | def POST(self): |
417 | enable_crossdomain() | 418 | enable_crossdomain() |
418 | - | ||
419 | - req = cherrypy.request.body.read() | ||
420 | - trace("post to nodes, req=%s"%(req)) | 419 | + |
421 | try: | 420 | try: |
422 | - json_req = json.loads(req) | ||
423 | - except Exception, ex: | ||
424 | - code = Error.system_parse_json | ||
425 | - trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code)) | ||
426 | - return json.dumps({"code":code, "data": None}) | 421 | + self.__lock.acquire() |
422 | + | ||
423 | + req = cherrypy.request.body.read() | ||
424 | + trace("post to nodes, req=%s"%(req)) | ||
425 | + try: | ||
426 | + json_req = json.loads(req) | ||
427 | + except Exception, ex: | ||
428 | + code = Error.system_parse_json | ||
429 | + trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code)) | ||
430 | + return json.dumps({"code":code, "data": None}) | ||
431 | + | ||
432 | + device_id = json_req["device_id"] | ||
433 | + node = self.__get_node(device_id) | ||
434 | + if node is None: | ||
435 | + node = ArmServer() | ||
436 | + self.__nodes.append(node) | ||
437 | + | ||
438 | + node.ip = json_req["ip"] | ||
439 | + node.device_id = device_id | ||
440 | + node.public_ip = cherrypy.request.remote.ip | ||
441 | + node.heartbeat = time.time() | ||
427 | 442 | ||
428 | - device_id = json_req["device_id"] | ||
429 | - node = self.__get_node(device_id) | ||
430 | - if node is None: | ||
431 | - node = ArmServer() | ||
432 | - self.__nodes.append(node) | ||
433 | - | ||
434 | - node.ip = json_req["ip"] | ||
435 | - node.device_id = device_id | ||
436 | - node.public_ip = cherrypy.request.remote.ip | ||
437 | - node.heartbeat = time.time() | ||
438 | - | ||
439 | - return json.dumps({"code":Error.success, "data": {"id":node.id}}) | 443 | + return json.dumps({"code":Error.success, "data": {"id":node.id}}) |
444 | + finally: | ||
445 | + self.__lock.release() | ||
440 | 446 | ||
441 | ''' | 447 | ''' |
442 | id canbe: | 448 | id canbe: |
@@ -455,58 +461,63 @@ class RESTServers(object): | @@ -455,58 +461,63 @@ class RESTServers(object): | ||
455 | def GET(self, id=None, action="play", stream="live/livestream", index=None, local="false", device_id=None): | 461 | def GET(self, id=None, action="play", stream="live/livestream", index=None, local="false", device_id=None): |
456 | enable_crossdomain() | 462 | enable_crossdomain() |
457 | 463 | ||
458 | - self.__refresh_nodes() | ||
459 | - data = self.__json_dump_nodes(self.__nodes) | ||
460 | - | ||
461 | - server_ip = "demo.chnvideo.com" | ||
462 | - ip = cherrypy.request.remote.ip | ||
463 | - if type is not None: | ||
464 | - peers = self.__get_peers_for_play(device_id) | ||
465 | - if len(peers) > 0: | ||
466 | - server_ip = self.__select_peer(peers, device_id) | 464 | + try: |
465 | + self.__lock.acquire() | ||
467 | 466 | ||
468 | - # demo, srs meeting urls. | ||
469 | - if id == "meeting": | ||
470 | - if index is None: | ||
471 | - url = "http://%s:8085"%(server_ip) | ||
472 | - elif local == "true": | ||
473 | - url = "http://%s:8085/api/v1/servers?id=%s&index=%s&local=false"%(server_ip, id, index) | ||
474 | - else: | ||
475 | - rtmp_url = root.api.v1.chats.get_url_by_index(index) | ||
476 | - if rtmp_url is None: | ||
477 | - return "meeting stream not found" | ||
478 | - urls = rtmp_url.replace("...vhost...", "?vhost=").replace("rtmp://", "").split("/") | ||
479 | - hls_url = "http://%s:8080/%s/%s.m3u8"%(urls[0].strip(":19350").strip(":1935"), urls[1].split("?")[0], urls[2]) | ||
480 | - return self.__generate_hls(hls_url) | ||
481 | - # raspberry-pi urls. | ||
482 | - elif id == "ingest" or id == "pi": | ||
483 | - if action == "play": | ||
484 | - url = "http://%s:8080/%s.html"%(server_ip, stream) | ||
485 | - elif action == "rtmp": | ||
486 | - url = "../../players/srs_player.html?server=%s&vhost=%s&app=%s&stream=%s&autostart=true"%(server_ip, server_ip, stream.split("/")[0], stream.split("/")[1]) | ||
487 | - elif action == "hls": | ||
488 | - hls_url = "http://%s:8080/%s.m3u8"%(server_ip, stream); | ||
489 | - if stream.startswith("http://"): | ||
490 | - hls_url = stream; | ||
491 | - return self.__generate_hls(hls_url.replace(".m3u8.m3u8", ".m3u8")) | 467 | + self.__refresh_nodes() |
468 | + data = self.__json_dump_nodes(self.__nodes) | ||
469 | + | ||
470 | + server_ip = "demo.chnvideo.com" | ||
471 | + ip = cherrypy.request.remote.ip | ||
472 | + if type is not None: | ||
473 | + peers = self.__get_peers_for_play(device_id) | ||
474 | + if len(peers) > 0: | ||
475 | + server_ip = self.__select_peer(peers, device_id) | ||
476 | + | ||
477 | + # demo, srs meeting urls. | ||
478 | + if id == "meeting": | ||
479 | + if index is None: | ||
480 | + url = "http://%s:8085"%(server_ip) | ||
481 | + elif local == "true": | ||
482 | + url = "http://%s:8085/api/v1/servers?id=%s&index=%s&local=false"%(server_ip, id, index) | ||
483 | + else: | ||
484 | + rtmp_url = root.api.v1.chats.get_url_by_index(index) | ||
485 | + if rtmp_url is None: | ||
486 | + return "meeting stream not found" | ||
487 | + urls = rtmp_url.replace("...vhost...", "?vhost=").replace("rtmp://", "").split("/") | ||
488 | + hls_url = "http://%s:8080/%s/%s.m3u8"%(urls[0].strip(":19350").strip(":1935"), urls[1].split("?")[0], urls[2]) | ||
489 | + return self.__generate_hls(hls_url) | ||
490 | + # raspberry-pi urls. | ||
491 | + elif id == "ingest" or id == "pi": | ||
492 | + if action == "play": | ||
493 | + url = "http://%s:8080/%s.html"%(server_ip, stream) | ||
494 | + elif action == "rtmp": | ||
495 | + url = "../../players/srs_player.html?server=%s&vhost=%s&app=%s&stream=%s&autostart=true"%(server_ip, server_ip, stream.split("/")[0], stream.split("/")[1]) | ||
496 | + elif action == "hls": | ||
497 | + hls_url = "http://%s:8080/%s.m3u8"%(server_ip, stream); | ||
498 | + if stream.startswith("http://"): | ||
499 | + hls_url = stream; | ||
500 | + return self.__generate_hls(hls_url.replace(".m3u8.m3u8", ".m3u8")) | ||
501 | + else: | ||
502 | + url = "http://%s:8080/api/v1/versions"%(server_ip) | ||
503 | + elif id == "gslb": | ||
504 | + return json.dumps({"code":Error.success, "data": { | ||
505 | + "edge":server_ip, "client":ip, | ||
506 | + "peers":self.__json_dump_nodes(peers), | ||
507 | + "streams": { | ||
508 | + "hls-livestream-sales": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-arm&stream=live/livestream", | ||
509 | + "hls-cztv-sales": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-arm&stream=live/rtmp_cztv01-sd", | ||
510 | + "hls-livestream-dev": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-arm&stream=live/livestream", | ||
511 | + "hls-cztv-dev": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-arm&stream=live/rtmp_cztv01-sd" | ||
512 | + } | ||
513 | + }}) | ||
514 | + # others, default. | ||
492 | else: | 515 | else: |
493 | - url = "http://%s:8080/api/v1/versions"%(server_ip) | ||
494 | - elif id == "gslb": | ||
495 | - return json.dumps({"code":Error.success, "data": { | ||
496 | - "edge":server_ip, "client":ip, | ||
497 | - "peers":self.__json_dump_nodes(peers), | ||
498 | - "streams": { | ||
499 | - "hls-livestream-sales": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-arm&stream=live/livestream", | ||
500 | - "hls-cztv-sales": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-sales-arm&stream=live/rtmp_cztv01-sd", | ||
501 | - "hls-livestream-dev": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-arm&stream=live/livestream", | ||
502 | - "hls-cztv-dev": "http://demo.chnvideo.com:8085/api/v1/servers?id=ingest&action=hls&device_id=chnvideo-dev-arm&stream=live/rtmp_cztv01-sd" | ||
503 | - } | ||
504 | - }}) | ||
505 | - # others, default. | ||
506 | - else: | ||
507 | - return json.dumps(data) | ||
508 | - #return "id=%s, action=%s, stream=%s, url=%s, index=%s, local=%s"%(id, action, stream, url, index, local) | ||
509 | - raise cherrypy.HTTPRedirect(url) | 516 | + return json.dumps(data) |
517 | + #return "id=%s, action=%s, stream=%s, url=%s, index=%s, local=%s"%(id, action, stream, url, index, local) | ||
518 | + raise cherrypy.HTTPRedirect(url) | ||
519 | + finally: | ||
520 | + self.__lock.release() | ||
510 | 521 | ||
511 | def DELETE(self, id): | 522 | def DELETE(self, id): |
512 | enable_crossdomain() | 523 | enable_crossdomain() |
@@ -577,6 +588,10 @@ class RESTNodes(object): | @@ -577,6 +588,10 @@ class RESTNodes(object): | ||
577 | 588 | ||
578 | def __init__(self): | 589 | def __init__(self): |
579 | self.__nodes = [] | 590 | self.__nodes = [] |
591 | + # @remark, if there is shared data, such as the self.__nodes, | ||
592 | + # we must use lock for cherrypy, or the cpu of cherrypy will high | ||
593 | + # and performance suffer. | ||
594 | + self.__lock = threading.Lock() | ||
580 | 595 | ||
581 | def __get_node(self, id): | 596 | def __get_node(self, id): |
582 | for node in self.__nodes: | 597 | for node in self.__nodes: |
@@ -629,113 +644,128 @@ class RESTNodes(object): | @@ -629,113 +644,128 @@ class RESTNodes(object): | ||
629 | def GET(self, type=None, format=None, origin=None, vhost=None, port=None, stream=None, node_id=None): | 644 | def GET(self, type=None, format=None, origin=None, vhost=None, port=None, stream=None, node_id=None): |
630 | enable_crossdomain() | 645 | enable_crossdomain() |
631 | 646 | ||
632 | - self.__refresh_nodes() | ||
633 | - data = self.__json_dump_nodes(self.__nodes) | ||
634 | - | ||
635 | - ip = cherrypy.request.remote.ip | ||
636 | - if type is not None: | ||
637 | - server = origin | ||
638 | - peers = self.__get_peers_for_play(ip) | ||
639 | - if len(peers) > 0: | ||
640 | - server = self.__select_peer(peers, ip) | ||
641 | - if type == "hls": | ||
642 | - hls_url = "http://%s:%s/%s.m3u8"%(server, port, stream) | ||
643 | - hls_url = hls_url.replace(".m3u8.m3u8", ".m3u8") | ||
644 | - if format == "html": | ||
645 | - return SrsUtility().hls_html(hls_url) | ||
646 | - else: | ||
647 | - #return hls_url | ||
648 | - raise cherrypy.HTTPRedirect(hls_url) | ||
649 | - elif type == "rtmp": | ||
650 | - rtmp_url = "rtmp://%s:%s/%s?vhost=%s/%s"%(server, port, stream.split("/")[0], vhost, stream.split("/")[1]) | ||
651 | - if format == "html": | ||
652 | - html = "%s?server=%s&port=%s&vhost=%s&app=%s&stream=%s&autostart=true"%( | ||
653 | - "http://demo.chnvideo.com:8085/srs/trunk/research/players/srs_player.html", | ||
654 | - server, port, vhost, stream.split("/")[0], stream.split("/")[1]) | ||
655 | - #return html | ||
656 | - raise cherrypy.HTTPRedirect(html) | ||
657 | - return rtmp_url | ||
658 | - elif type == "gslb": | ||
659 | - return json.dumps({"code":Error.success, "data": { | ||
660 | - "edge":server, "client":ip, | ||
661 | - "peers":self.__json_dump_nodes(peers), | ||
662 | - "streams": { | ||
663 | - "hls-cztv-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/rtmp_cztv01-sd", | ||
664 | - "hls-cztv-m3u8": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=m3u8&origin=demo.chnvideo.com&port=8080&stream=live/rtmp_cztv01-sd", | ||
665 | - "rtmp-cztv-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=rtmp&format=html&origin=demo.chnvideo.com&vhost=__defaultVhost__&port=1935&stream=live/rtmp_cztv01-sd", | ||
666 | - "hls-livestream-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/livestream", | ||
667 | - "hls-livestream-m3u8": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=m3u8&origin=demo.chnvideo.com&port=8080&stream=live/livestream", | ||
668 | - "rtmp-livestream-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=rtmp&format=html&origin=demo.chnvideo.com&vhost=demo.srs.com&port=1935&stream=live/livestream", | ||
669 | - "apk": "http://demo.chnvideo.com/android.srs.apk" | ||
670 | - } | ||
671 | - }}) | 647 | + try: |
648 | + self.__lock.acquire() | ||
672 | 649 | ||
673 | - return json.dumps({"code":Error.success, "data": data}) | 650 | + self.__refresh_nodes() |
651 | + data = self.__json_dump_nodes(self.__nodes) | ||
652 | + | ||
653 | + ip = cherrypy.request.remote.ip | ||
654 | + if type is not None: | ||
655 | + server = origin | ||
656 | + peers = self.__get_peers_for_play(ip) | ||
657 | + if len(peers) > 0: | ||
658 | + server = self.__select_peer(peers, ip) | ||
659 | + if type == "hls": | ||
660 | + hls_url = "http://%s:%s/%s.m3u8"%(server, port, stream) | ||
661 | + hls_url = hls_url.replace(".m3u8.m3u8", ".m3u8") | ||
662 | + if format == "html": | ||
663 | + return SrsUtility().hls_html(hls_url) | ||
664 | + else: | ||
665 | + #return hls_url | ||
666 | + raise cherrypy.HTTPRedirect(hls_url) | ||
667 | + elif type == "rtmp": | ||
668 | + rtmp_url = "rtmp://%s:%s/%s?vhost=%s/%s"%(server, port, stream.split("/")[0], vhost, stream.split("/")[1]) | ||
669 | + if format == "html": | ||
670 | + html = "%s?server=%s&port=%s&vhost=%s&app=%s&stream=%s&autostart=true"%( | ||
671 | + "http://demo.chnvideo.com:8085/srs/trunk/research/players/srs_player.html", | ||
672 | + server, port, vhost, stream.split("/")[0], stream.split("/")[1]) | ||
673 | + #return html | ||
674 | + raise cherrypy.HTTPRedirect(html) | ||
675 | + return rtmp_url | ||
676 | + elif type == "gslb": | ||
677 | + return json.dumps({"code":Error.success, "data": { | ||
678 | + "edge":server, "client":ip, | ||
679 | + "peers":self.__json_dump_nodes(peers), | ||
680 | + "streams": { | ||
681 | + "hls-cztv-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/rtmp_cztv01-sd", | ||
682 | + "hls-cztv-m3u8": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=m3u8&origin=demo.chnvideo.com&port=8080&stream=live/rtmp_cztv01-sd", | ||
683 | + "rtmp-cztv-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=rtmp&format=html&origin=demo.chnvideo.com&vhost=__defaultVhost__&port=1935&stream=live/rtmp_cztv01-sd", | ||
684 | + "hls-livestream-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=html&origin=demo.chnvideo.com&port=8080&stream=live/livestream", | ||
685 | + "hls-livestream-m3u8": "http://demo.chnvideo.com:8085/api/v1/nodes?type=hls&format=m3u8&origin=demo.chnvideo.com&port=8080&stream=live/livestream", | ||
686 | + "rtmp-livestream-html": "http://demo.chnvideo.com:8085/api/v1/nodes?type=rtmp&format=html&origin=demo.chnvideo.com&vhost=demo.srs.com&port=1935&stream=live/livestream", | ||
687 | + "apk": "http://demo.chnvideo.com/android.srs.apk" | ||
688 | + } | ||
689 | + }}) | ||
690 | + | ||
691 | + return json.dumps({"code":Error.success, "data": data}) | ||
692 | + finally: | ||
693 | + self.__lock.release() | ||
674 | 694 | ||
675 | def PUT(self): | 695 | def PUT(self): |
676 | enable_crossdomain() | 696 | enable_crossdomain() |
677 | - | ||
678 | - req = cherrypy.request.body.read() | ||
679 | - trace("put to nodes, req=%s"%(req)) | ||
680 | - try: | ||
681 | - json_req = json.loads(req) | ||
682 | - except Exception, ex: | ||
683 | - code = Error.system_parse_json | ||
684 | - trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code)) | ||
685 | - return json.dumps({"code":code, "data": None}) | ||
686 | 697 | ||
687 | - id = str(json_req["id"]) | ||
688 | - node = self.__get_node(id) | ||
689 | - if node is None: | ||
690 | - code = Error.cdn_node_not_exists | ||
691 | - trace("cdn node not exists, req=%s, id=%s, code=%s"%(req, id, code)) | ||
692 | - return json.dumps({"code":code, "data": None}) | ||
693 | - | ||
694 | - node.heartbeat = time.time() | ||
695 | - node.srs_status = str(json_req["srs_status"]) | ||
696 | - node.ip = str(json_req["ip"]) | ||
697 | - if "origin" in json_req: | ||
698 | - node.origin = str(json_req["origin"]); | ||
699 | - node.public_ip = cherrypy.request.remote.ip | ||
700 | - # reset if restart. | ||
701 | - if node.srs_status != "running": | ||
702 | - node.clients = 0 | 698 | + try: |
699 | + self.__lock.acquire() | ||
700 | + | ||
701 | + req = cherrypy.request.body.read() | ||
702 | + trace("put to nodes, req=%s"%(req)) | ||
703 | + try: | ||
704 | + json_req = json.loads(req) | ||
705 | + except Exception, ex: | ||
706 | + code = Error.system_parse_json | ||
707 | + trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code)) | ||
708 | + return json.dumps({"code":code, "data": None}) | ||
703 | 709 | ||
704 | - self.__refresh_nodes() | ||
705 | - peers = self.__get_peers(node) | ||
706 | - peers_data = self.__json_dump_nodes(peers) | 710 | + id = str(json_req["id"]) |
711 | + node = self.__get_node(id) | ||
712 | + if node is None: | ||
713 | + code = Error.cdn_node_not_exists | ||
714 | + trace("cdn node not exists, req=%s, id=%s, code=%s"%(req, id, code)) | ||
715 | + return json.dumps({"code":code, "data": None}) | ||
707 | 716 | ||
708 | - res = json.dumps({"code":Error.success, "data": {"id":node.id, "peers":peers_data}}) | ||
709 | - trace(res) | ||
710 | - return res | 717 | + node.heartbeat = time.time() |
718 | + node.srs_status = str(json_req["srs_status"]) | ||
719 | + node.ip = str(json_req["ip"]) | ||
720 | + if "origin" in json_req: | ||
721 | + node.origin = str(json_req["origin"]); | ||
722 | + node.public_ip = cherrypy.request.remote.ip | ||
723 | + # reset if restart. | ||
724 | + if node.srs_status != "running": | ||
725 | + node.clients = 0 | ||
726 | + | ||
727 | + self.__refresh_nodes() | ||
728 | + peers = self.__get_peers(node) | ||
729 | + peers_data = self.__json_dump_nodes(peers) | ||
730 | + | ||
731 | + res = json.dumps({"code":Error.success, "data": {"id":node.id, "peers":peers_data}}) | ||
732 | + trace(res) | ||
733 | + return res | ||
734 | + finally: | ||
735 | + self.__lock.release() | ||
711 | 736 | ||
712 | def POST(self): | 737 | def POST(self): |
713 | enable_crossdomain() | 738 | enable_crossdomain() |
714 | - | ||
715 | - req = cherrypy.request.body.read() | ||
716 | - trace("post to nodes, req=%s"%(req)) | 739 | + |
717 | try: | 740 | try: |
718 | - json_req = json.loads(req) | ||
719 | - except Exception, ex: | ||
720 | - code = Error.system_parse_json | ||
721 | - trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code)) | ||
722 | - return json.dumps({"code":code, "data": None}) | ||
723 | - | ||
724 | - node = CdnNode() | ||
725 | - node.ip = str(json_req["ip"]); | ||
726 | - node.os = str(json_req["os"]); | ||
727 | - if "origin" in json_req: | ||
728 | - node.origin = str(json_req["origin"]); | ||
729 | - node.srs_status = str(json_req["srs_status"]) | ||
730 | - self.__nodes.append(node) | 741 | + self.__lock.acquire() |
742 | + | ||
743 | + req = cherrypy.request.body.read() | ||
744 | + trace("post to nodes, req=%s"%(req)) | ||
745 | + try: | ||
746 | + json_req = json.loads(req) | ||
747 | + except Exception, ex: | ||
748 | + code = Error.system_parse_json | ||
749 | + trace("parse the request to json failed, req=%s, ex=%s, code=%s"%(req, ex, code)) | ||
750 | + return json.dumps({"code":code, "data": None}) | ||
751 | + | ||
752 | + node = CdnNode() | ||
753 | + node.ip = str(json_req["ip"]); | ||
754 | + node.os = str(json_req["os"]); | ||
755 | + if "origin" in json_req: | ||
756 | + node.origin = str(json_req["origin"]); | ||
757 | + node.srs_status = str(json_req["srs_status"]) | ||
758 | + self.__nodes.append(node) | ||
759 | + | ||
760 | + self.__refresh_nodes() | ||
761 | + peers = self.__get_peers(node) | ||
762 | + peers_data = self.__json_dump_nodes(peers) | ||
731 | 763 | ||
732 | - self.__refresh_nodes() | ||
733 | - peers = self.__get_peers(node) | ||
734 | - peers_data = self.__json_dump_nodes(peers) | ||
735 | - | ||
736 | - res = json.dumps({"code":Error.success, "data": {"id":node.id, "peers":peers_data}}) | ||
737 | - trace(res) | ||
738 | - return res | 764 | + res = json.dumps({"code":Error.success, "data": {"id":node.id, "peers":peers_data}}) |
765 | + trace(res) | ||
766 | + return res | ||
767 | + finally: | ||
768 | + self.__lock.release() | ||
739 | 769 | ||
740 | def OPTIONS(self, *args, **kwargs): | 770 | def OPTIONS(self, *args, **kwargs): |
741 | enable_crossdomain() | 771 | enable_crossdomain() |
@@ -966,7 +996,8 @@ conf = { | @@ -966,7 +996,8 @@ conf = { | ||
966 | 'server.socket_port': port, | 996 | 'server.socket_port': port, |
967 | 'tools.encode.on': True, | 997 | 'tools.encode.on': True, |
968 | 'tools.staticdir.on': True, | 998 | 'tools.staticdir.on': True, |
969 | - 'tools.encode.encoding': "utf-8" | 999 | + 'tools.encode.encoding': "utf-8", |
1000 | + 'server.thread_pool': 2, # single thread server. | ||
970 | }, | 1001 | }, |
971 | '/': { | 1002 | '/': { |
972 | 'tools.staticdir.dir': static_dir, | 1003 | 'tools.staticdir.dir': static_dir, |
-
请 注册 或 登录 后发表评论