import uvloop to improve performance and add a monitor for zombie devices on PN server

This commit is contained in:
ryanzhao 2023-02-08 11:00:49 +11:00
parent e6cb3d01bd
commit 7eece1b92c
5 changed files with 38 additions and 2 deletions

View File

@ -16,3 +16,4 @@ setuptools~=41.4.0
telepot~=12.7
Werkzeug~=2.1.2
aioapns==2.1
uvloop

View File

@ -4,6 +4,8 @@ import resource
import json
import http
import logging
import asyncio
import uvloop
from flask import Flask, request, jsonify, abort
from flask_httpauth import HTTPBasicAuth
@ -22,6 +24,7 @@ from crypto import parse_junk
resource.setrlimit(resource.RLIMIT_NOFILE, (65536, 65536))
urllib3.disable_warnings()
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
def handle_exit(sig, frame):

View File

@ -1,12 +1,12 @@
from tasks.observeTask import ObserveTask
from tasks.syncDatabaseTask import SyncDatabaseTask
from tasks.pushNotificationTask import PushNotificationTask
from tools.lokiLogger import LokiLogger
from tasks.cleanDatabaseTask import CleanDatabaseTask
class TaskRunner:
def __init__(self):
self.tasks = [PushNotificationTask(), SyncDatabaseTask(), ObserveTask()]
self.tasks = [PushNotificationTask(), SyncDatabaseTask(), ObserveTask(), CleanDatabaseTask()]
def run_tasks(self):
for task in self.tasks:

View File

@ -0,0 +1,24 @@
from tasks.baseTask import *
from tools.observer import Observer
from tools.databaseHelperV2 import DatabaseHelperV2
from tools.pushNotificationHandler import PushNotificationHelperV2
class CleanDatabaseTask(BaseTask):
def __init__(self):
super().__init__()
self.observer = Observer()
self.database_helper = DatabaseHelperV2()
self.notification_helper = PushNotificationHelperV2()
async def task(self):
while self.is_running:
try:
await asyncio.sleep(30 * 24 * 60 * 60)
zombies = len(self.database_helper.device_cache.keys()) - len(self.notification_helper.latest_activity_timestamp.keys())
self.observer.push_info(f"In last 30 days, {zombies} users have been marked as zombies.")
self.notification_helper.latest_activity_timestamp = {}
except Exception as e:
error_message = f"Flush exception: {e}"
self.logger.error(error_message)

View File

@ -1,4 +1,5 @@
import asyncio
import time
from utils import *
from model.pushNotificationStats import PushNotificationStats
@ -27,6 +28,7 @@ class PushNotificationHelperV2(metaclass=Singleton):
push_admin.initialize_app(Environment.HUAWEI_APP_ID, Environment.HUAWEI_APP_SECRET)
self.push_fails = {}
self.latest_activity_timestamp = {}
self.stats_data = PushNotificationStats()
self.logger = LokiLogger().logger
@ -47,6 +49,8 @@ class PushNotificationHelperV2(metaclass=Singleton):
return None
def register(self, device_token, session_id, device_type):
self.latest_activity_timestamp[session_id] = time.time()
self.remove_device_token(device_token)
device = self.database_helper.get_device(session_id)
@ -66,6 +70,8 @@ class PushNotificationHelperV2(metaclass=Singleton):
return session_id
def subscribe_closed_group(self, closed_group_id, session_id):
self.latest_activity_timestamp[session_id] = time.time()
closed_group = self.database_helper.get_closed_group(closed_group_id)
if closed_group is None:
closed_group = ClosedGroup()
@ -74,6 +80,8 @@ class PushNotificationHelperV2(metaclass=Singleton):
closed_group.save_to_cache(self.database_helper)
def unsubscribe_closed_group(self, closed_group_id, session_id):
self.latest_activity_timestamp[session_id] = time.time()
closed_group = self.database_helper.get_closed_group(closed_group_id)
if closed_group:
closed_group.remove_member(session_id)