Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions web/lm_unit.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import web.middleware.auth_merger
import web.middleware.json_params
import web.middleware.json_response
import web.middleware.disuse_db_conn_response
import web.module.capabilities
import web.module.machines
import web.module.requests
Expand Down Expand Up @@ -97,5 +98,10 @@ async def obtain_request(request):
else:
logger.info(f'<< obtained')

if settings.app['db']['sanic_fresh_db_each_request']:
lm_unit_webserver.register_middleware(
web.middleware.disuse_db_conn_response.disuse_db_conn_response,
'response'
)

lm_unit_webserver.config.KEEP_ALIVE = settings.app['sanic_keepalive']
9 changes: 9 additions & 0 deletions web/middleware/disuse_db_conn_response.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from web.modeltr.connection import Connection


async def disuse_db_conn_response(request, response):
try:
Connection.disuse()
except:
pass

23 changes: 23 additions & 0 deletions web/modeltr/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,15 @@ def _connect(self):
raise DbConnectionError("Connection to the DB wasn't successful [async mode]")
self._last_usage_timestamp = time.time()

def _disconnect(self):
try:
if self.client is not None:
self.client.close()
self.acursor = None
self.client = None
except Exception:
self.__logger.warning('Error disconnecting the db server', exc_info=True)

def _refresh_conn_on_every_usage(self):
return "socket_reusability" in self._connection_params and \
self._connection_params["socket_reusability"] == "never"
Expand Down Expand Up @@ -240,3 +249,17 @@ def use(cls, alias=DEFAULT_CONNECTION_NAME):
f'Exception when calling use(): {repr(ex)}', exc_info=True
)
return connection["connection"]

@classmethod
def disuse(cls, alias=DEFAULT_CONNECTION_NAME):
if alias not in cls.__connections:
raise ValueError(f'connection {alias} has not been initialized before, '
f'please use connect method')

connection = cls.__connections[alias]
try:
connection["connection"]._disconnect()
except Exception as ex:
logging.getLogger(__name__).error(
f'Exception when calling use(): {repr(ex)}', exc_info=True
)
1 change: 1 addition & 0 deletions web/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class Settings:
'username': None,
'password': None,
'socket_reusability': 'never',
'sanic_fresh_db_each_request': False,
'async_polling': {
"sleep_time": 0.2,
"warning_time": 10,
Expand Down