mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-01-29 21:51:31 +00:00
perf: 优化 tree nodes 避免太慢 (#12472)
* perf: 优化 tree nodes 避免太慢 perf: 优化大量资产上的资产数生成比较慢 perf: 优化节点树 perf: 修改 tree nooooooooodes perf: 优化一些 api 比较大的问题 perf: 优化平台 api perf: 分页返回同步树 perf: 优化节点树 perf: 深度优化节点树 * perf: remove unused config --------- Co-authored-by: ibuler <ibuler@qq.com>
This commit is contained in:
@@ -98,12 +98,17 @@ class QuerySetMixin:
|
||||
return queryset
|
||||
if self.action == 'metadata':
|
||||
queryset = queryset.none()
|
||||
if self.action in ['list', 'metadata']:
|
||||
serializer_class = self.get_serializer_class()
|
||||
if serializer_class and hasattr(serializer_class, 'setup_eager_loading'):
|
||||
queryset = serializer_class.setup_eager_loading(queryset)
|
||||
return queryset
|
||||
|
||||
def paginate_queryset(self, queryset):
|
||||
page = super().paginate_queryset(queryset)
|
||||
serializer_class = self.get_serializer_class()
|
||||
if page and serializer_class and hasattr(serializer_class, 'setup_eager_loading'):
|
||||
ids = [i.id for i in page]
|
||||
page = self.get_queryset().filter(id__in=ids)
|
||||
page = serializer_class.setup_eager_loading(page)
|
||||
return page
|
||||
|
||||
|
||||
class ExtraFilterFieldsMixin:
|
||||
"""
|
||||
|
||||
@@ -65,7 +65,7 @@ class EventLoopThread(threading.Thread):
|
||||
|
||||
|
||||
_loop_thread = EventLoopThread()
|
||||
_loop_thread.setDaemon(True)
|
||||
_loop_thread.daemon = True
|
||||
_loop_thread.start()
|
||||
executor = ThreadPoolExecutor(
|
||||
max_workers=10,
|
||||
|
||||
@@ -62,7 +62,7 @@ def digest_sql_query():
|
||||
method = current_request.method
|
||||
path = current_request.get_full_path()
|
||||
|
||||
print(">>> [{}] {}".format(method, path))
|
||||
print(">>>. [{}] {}".format(method, path))
|
||||
for table_name, queries in table_queries.items():
|
||||
if table_name.startswith('rbac_') or table_name.startswith('auth_permission'):
|
||||
continue
|
||||
@@ -77,9 +77,9 @@ def digest_sql_query():
|
||||
sql = query['sql']
|
||||
if not sql or not sql.startswith('SELECT'):
|
||||
continue
|
||||
print('\t{}. {}'.format(i, sql))
|
||||
print('\t{}.[{}s] {}'.format(i, round(float(query['time']), 2), sql[:1000]))
|
||||
|
||||
logger.debug(">>> [{}] {}".format(method, path))
|
||||
# logger.debug(">>> [{}] {}".format(method, path))
|
||||
for name, counter in counters:
|
||||
logger.debug("Query {:3} times using {:.2f}s {}".format(
|
||||
counter.counter, counter.time, name)
|
||||
|
||||
@@ -220,7 +220,7 @@ def timeit(func):
|
||||
now = time.time()
|
||||
result = func(*args, **kwargs)
|
||||
using = (time.time() - now) * 1000
|
||||
msg = "End call {}, using: {:.1f}ms".format(name, using)
|
||||
msg = "Ends call: {}, using: {:.1f}ms".format(name, using)
|
||||
logger.debug(msg)
|
||||
return result
|
||||
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
from functools import wraps
|
||||
import threading
|
||||
from functools import wraps
|
||||
|
||||
from django.db import transaction
|
||||
from redis_lock import (
|
||||
Lock as RedisLock, NotAcquired, UNLOCK_SCRIPT,
|
||||
EXTEND_SCRIPT, RESET_SCRIPT, RESET_ALL_SCRIPT
|
||||
)
|
||||
from redis import Redis
|
||||
from django.db import transaction
|
||||
|
||||
from common.utils import get_logger
|
||||
from common.utils.inspect import copy_function_args
|
||||
from common.utils.connection import get_redis_client
|
||||
from jumpserver.const import CONFIG
|
||||
from common.local import thread_local
|
||||
from common.utils import get_logger
|
||||
from common.utils.connection import get_redis_client
|
||||
from common.utils.inspect import copy_function_args
|
||||
|
||||
logger = get_logger(__file__)
|
||||
|
||||
@@ -76,6 +74,7 @@ class DistributedLock(RedisLock):
|
||||
# 要创建一个新的锁对象
|
||||
with self.__class__(**self.kwargs_copy):
|
||||
return func(*args, **kwds)
|
||||
|
||||
return inner
|
||||
|
||||
@classmethod
|
||||
@@ -95,7 +94,6 @@ class DistributedLock(RedisLock):
|
||||
if self.locked():
|
||||
owner_id = self.get_owner_id()
|
||||
local_owner_id = getattr(thread_local, self.name, None)
|
||||
|
||||
if local_owner_id and owner_id == local_owner_id:
|
||||
return True
|
||||
return False
|
||||
@@ -140,14 +138,16 @@ class DistributedLock(RedisLock):
|
||||
logger.debug(f'Released reentrant-lock: lock_id={self.id} owner_id={self.get_owner_id()} lock={self.name}')
|
||||
return
|
||||
else:
|
||||
self._raise_exc_with_log(f'Reentrant-lock is not acquired: lock_id={self.id} owner_id={self.get_owner_id()} lock={self.name}')
|
||||
self._raise_exc_with_log(
|
||||
f'Reentrant-lock is not acquired: lock_id={self.id} owner_id={self.get_owner_id()} lock={self.name}')
|
||||
|
||||
def _release_on_reentrant_locked_by_me(self):
|
||||
logger.debug(f'Release reentrant-lock locked by me: lock_id={self.id} lock={self.name}')
|
||||
|
||||
id = getattr(thread_local, self.name, None)
|
||||
if id != self.id:
|
||||
raise PermissionError(f'Reentrant-lock is not locked by me: lock_id={self.id} owner_id={self.get_owner_id()} lock={self.name}')
|
||||
raise PermissionError(
|
||||
f'Reentrant-lock is not locked by me: lock_id={self.id} owner_id={self.get_owner_id()} lock={self.name}')
|
||||
try:
|
||||
# 这里要保证先删除 thread_local 的标记,
|
||||
delattr(thread_local, self.name)
|
||||
@@ -191,7 +191,7 @@ class DistributedLock(RedisLock):
|
||||
# 处理是否在事务提交时才释放锁
|
||||
if self._release_on_transaction_commit:
|
||||
logger.debug(
|
||||
f'Release lock on transaction commit ... :lock_id={self.id} lock={self.name}')
|
||||
f'Release lock on transaction commit:lock_id={self.id} lock={self.name}')
|
||||
transaction.on_commit(_release)
|
||||
else:
|
||||
_release()
|
||||
|
||||
Reference in New Issue
Block a user