mirror of
https://github.com/GNS3/gns3-server.git
synced 2025-01-31 13:23:48 +02:00
Fix issue with notification queue that prevented to properly close projects. Fix #1493
This commit is contained in:
parent
161c05a310
commit
a896346c77
@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import asyncio
|
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from ..notification_queue import NotificationQueue
|
from ..notification_queue import NotificationQueue
|
||||||
@ -43,8 +42,10 @@ class Notification:
|
|||||||
queue = NotificationQueue()
|
queue = NotificationQueue()
|
||||||
self._project_listeners.setdefault(project.id, set())
|
self._project_listeners.setdefault(project.id, set())
|
||||||
self._project_listeners[project.id].add(queue)
|
self._project_listeners[project.id].add(queue)
|
||||||
yield queue
|
try:
|
||||||
self._project_listeners[project.id].remove(queue)
|
yield queue
|
||||||
|
finally:
|
||||||
|
self._project_listeners[project.id].remove(queue)
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def controller_queue(self):
|
def controller_queue(self):
|
||||||
@ -55,8 +56,10 @@ class Notification:
|
|||||||
"""
|
"""
|
||||||
queue = NotificationQueue()
|
queue = NotificationQueue()
|
||||||
self._controller_listeners.append(queue)
|
self._controller_listeners.append(queue)
|
||||||
yield queue
|
try:
|
||||||
self._controller_listeners.remove(queue)
|
yield queue
|
||||||
|
finally:
|
||||||
|
self._controller_listeners.remove(queue)
|
||||||
|
|
||||||
def controller_emit(self, action, event):
|
def controller_emit(self, action, event):
|
||||||
"""
|
"""
|
||||||
|
@ -44,15 +44,17 @@ class NotificationHandler:
|
|||||||
|
|
||||||
request.app['websockets'].add(ws)
|
request.app['websockets'].add(ws)
|
||||||
asyncio.ensure_future(process_websocket(ws))
|
asyncio.ensure_future(process_websocket(ws))
|
||||||
with notifications.queue() as queue:
|
|
||||||
try:
|
try:
|
||||||
|
with notifications.queue() as queue:
|
||||||
while True:
|
while True:
|
||||||
notification = await queue.get_json(1)
|
notification = await queue.get_json(1)
|
||||||
if ws.closed:
|
if ws.closed:
|
||||||
break
|
break
|
||||||
await ws.send_str(notification)
|
await ws.send_str(notification)
|
||||||
finally:
|
finally:
|
||||||
if not ws.closed:
|
if not ws.closed:
|
||||||
await ws.close()
|
await ws.close()
|
||||||
request.app['websockets'].discard(ws)
|
request.app['websockets'].discard(ws)
|
||||||
|
|
||||||
return ws
|
return ws
|
||||||
|
@ -67,16 +67,16 @@ class NotificationHandler:
|
|||||||
|
|
||||||
request.app['websockets'].add(ws)
|
request.app['websockets'].add(ws)
|
||||||
asyncio.ensure_future(process_websocket(ws))
|
asyncio.ensure_future(process_websocket(ws))
|
||||||
with controller.notification.controller_queue() as queue:
|
try:
|
||||||
try:
|
with controller.notification.controller_queue() as queue:
|
||||||
while True:
|
while True:
|
||||||
notification = await queue.get_json(5)
|
notification = await queue.get_json(5)
|
||||||
if ws.closed:
|
if ws.closed:
|
||||||
break
|
break
|
||||||
await ws.send_str(notification)
|
await ws.send_str(notification)
|
||||||
finally:
|
finally:
|
||||||
if not ws.closed:
|
if not ws.closed:
|
||||||
await ws.close()
|
await ws.close()
|
||||||
request.app['websockets'].discard(ws)
|
request.app['websockets'].discard(ws)
|
||||||
|
|
||||||
return ws
|
return ws
|
||||||
|
@ -259,24 +259,24 @@ class ProjectHandler:
|
|||||||
|
|
||||||
request.app['websockets'].add(ws)
|
request.app['websockets'].add(ws)
|
||||||
asyncio.ensure_future(process_websocket(ws))
|
asyncio.ensure_future(process_websocket(ws))
|
||||||
with controller.notification.project_queue(project) as queue:
|
try:
|
||||||
try:
|
with controller.notification.project_queue(project) as queue:
|
||||||
while True:
|
while True:
|
||||||
notification = await queue.get_json(5)
|
notification = await queue.get_json(5)
|
||||||
if ws.closed:
|
if ws.closed:
|
||||||
break
|
break
|
||||||
await ws.send_str(notification)
|
await ws.send_str(notification)
|
||||||
finally:
|
finally:
|
||||||
if not ws.closed:
|
if not ws.closed:
|
||||||
await ws.close()
|
await ws.close()
|
||||||
request.app['websockets'].discard(ws)
|
request.app['websockets'].discard(ws)
|
||||||
|
|
||||||
if project.auto_close:
|
if project.auto_close:
|
||||||
# To avoid trouble with client connecting disconnecting we sleep few seconds before checking
|
# To avoid trouble with client connecting disconnecting we sleep few seconds before checking
|
||||||
# if someone else is not connected
|
# if someone else is not connected
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(5)
|
||||||
if not controller.notification.project_has_listeners(project):
|
if not controller.notification.project_has_listeners(project):
|
||||||
await project.close()
|
await project.close()
|
||||||
|
|
||||||
return ws
|
return ws
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user