perf: 修改 signals

pull/9494/head
ibuler 2023-02-10 14:44:59 +08:00
parent 37a52c420f
commit 6a0fbc6ac2
4 changed files with 43 additions and 27 deletions

View File

@ -10,6 +10,7 @@ from common.const.signals import PRE_ADD, POST_REMOVE, PRE_CLEAR
from common.decorators import on_transaction_commit, merge_delay_run
from common.utils import get_logger
from orgs.utils import tmp_to_org
from ..tasks import check_node_assets_amount_task
logger = get_logger(__file__)
@ -33,13 +34,18 @@ def on_node_asset_change(sender, action, instance, reverse, pk_set, **kwargs):
node_ids = [instance.id]
else:
node_ids = pk_set
update_node_assets_amount(*node_ids)
update_nodes_assets_amount(*node_ids)
@merge_delay_run(ttl=5)
def update_node_assets_amount(*node_ids):
def update_nodes_assets_amount(*node_ids):
nodes = list(Node.objects.filter(id__in=node_ids))
logger.info('Update nodes assets amount: {} nodes'.format(len(node_ids)))
if len(node_ids) > 100:
check_node_assets_amount_task.delay()
return
for node in nodes:
node.assets_amount = node.get_assets_amount()

View File

@ -1,12 +1,12 @@
# ~*~ coding: utf-8 ~*~
#
from collections import defaultdict
from common.db.models import output_as_string
from common.struct import Stack
from common.utils import get_logger, dict_get_any, is_uuid, get_object_or_none, timeit
from common.utils.http import is_true
from common.struct import Stack
from common.db.models import output_as_string
from orgs.utils import ensure_in_real_or_default_org, current_org
from ..locks import NodeTreeUpdateLock
from ..models import Node, Asset
@ -25,11 +25,11 @@ def check_node_assets_amount():
for node in nodes:
nodeid_nodekey_mapper[node.id] = node.key
for nodeid, assetid in nodeid_assetid_pairs:
if nodeid not in nodeid_nodekey_mapper:
for node_id, asset_id in nodeid_assetid_pairs:
if node_id not in nodeid_nodekey_mapper:
continue
nodekey = nodeid_nodekey_mapper[nodeid]
nodekey_assetids_mapper[nodekey].add(assetid)
node_key = nodeid_nodekey_mapper[node_id]
nodekey_assetids_mapper[node_key].add(asset_id)
util = NodeAssetsUtil(nodes, nodekey_assetids_mapper)
util.generate()

View File

@ -2,6 +2,7 @@
#
import uuid
from celery import shared_task
from django.apps import apps
from django.conf import settings
from django.contrib.auth import BACKEND_SESSION_KEY
@ -26,6 +27,7 @@ from common.signals import django_ready
from common.utils import get_request_ip, get_logger, get_syslogger
from common.utils.encode import data_to_json
from jumpserver.utils import current_request
from orgs.utils import org_aware_func
from terminal.models import Session, Command
from terminal.serializers import SessionSerializer, SessionCommandSerializer
from users.models import User
@ -69,24 +71,18 @@ M2M_ACTION = {
}
@receiver(m2m_changed)
def on_m2m_changed(sender, action, instance, reverse, model, pk_set, **kwargs):
if action not in M2M_ACTION:
return
if not instance:
return
return
resource_type = instance._meta.verbose_name
@shared_task(verbose_name=_("Create m2m operate log"))
@org_aware_func('instance')
def create_m2m_operate_log(instance, action, model, pk_set):
current_instance = model_to_dict(instance, include_model_fields=False)
resource_type = instance._meta.verbose_name
field_name = str(model._meta.verbose_name)
action = M2M_ACTION[action]
instance_id = current_instance.get('id')
log_id, before_instance = get_instance_dict_from_cache(instance_id)
field_name = str(model._meta.verbose_name)
objs = model.objects.filter(pk__in=pk_set)
objs_display = [str(o) for o in objs]
action = M2M_ACTION[action]
changed_field = current_instance.get(field_name, [])
after, before, before_value = None, None, None
@ -107,10 +103,20 @@ def on_m2m_changed(sender, action, instance, reverse, model, pk_set, **kwargs):
create_or_update_operate_log(
ActionChoices.update, resource_type,
resource=instance, log_id=log_id, before=before, after=after
resource=instance, log_id=log_id,
before=before, after=after
)
@receiver(m2m_changed)
def on_m2m_changed(sender, action, instance, model, pk_set, **kwargs):
if action not in M2M_ACTION:
return
if not instance:
return
create_m2m_operate_log.delay(instance, action, model, pk_set)
def signal_of_operate_log_whether_continue(sender, instance, created, update_fields=None):
condition = True
if not instance:
@ -129,16 +135,21 @@ def signal_of_operate_log_whether_continue(sender, instance, created, update_fie
return condition
@shared_task(verbose_name=_("Create operate log"))
@org_aware_func('instance')
def create_operate_log(instance, created, update_fields=None):
pass
@receiver(pre_save)
def on_object_pre_create_or_update(sender, instance=None, raw=False, using=None, update_fields=None, **kwargs):
def on_object_pre_create_or_update(sender, instance=None, update_fields=None, **kwargs):
ok = signal_of_operate_log_whether_continue(
sender, instance, False, update_fields
)
if not ok:
return
# users.PrivateToken Model 没有 id 有 pk字段
instance_id = getattr(instance, 'id', getattr(instance, 'pk', None))
instance_id = getattr(instance, 'pk', None)
instance_before_data = {'id': instance_id}
raw_instance = type(instance).objects.filter(pk=instance_id).first()
@ -152,7 +163,6 @@ def on_object_pre_create_or_update(sender, instance=None, raw=False, using=None,
@receiver(post_save)
def on_object_created_or_update(sender, instance=None, created=False, update_fields=None, **kwargs):
return
ok = signal_of_operate_log_whether_continue(
sender, instance, created, update_fields
)

View File

@ -65,7 +65,7 @@ def _run_func_if_is_last(ttl, suffix_key, org, func, *args, **kwargs):
logger.error('delay run error: %s' % e)
executor = ThreadPoolExecutor(10)
executor = ThreadPoolExecutor(20)
def delay_run(ttl=5, key=None):