mirror of https://github.com/jumpserver/jumpserver
fix: 创建节点的时候加锁,可以并发调用
parent
7c03af7668
commit
bee5500425
|
@ -28,6 +28,7 @@ from ..tasks import (
|
||||||
)
|
)
|
||||||
from .. import serializers
|
from .. import serializers
|
||||||
from .mixin import SerializeToTreeNodeMixin
|
from .mixin import SerializeToTreeNodeMixin
|
||||||
|
from assets.locks import NodeAddChildrenLock
|
||||||
|
|
||||||
|
|
||||||
logger = get_logger(__file__)
|
logger = get_logger(__file__)
|
||||||
|
@ -114,15 +115,16 @@ class NodeChildrenApi(generics.ListCreateAPIView):
|
||||||
return super().initial(request, *args, **kwargs)
|
return super().initial(request, *args, **kwargs)
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
data = serializer.validated_data
|
with NodeAddChildrenLock(self.instance):
|
||||||
_id = data.get("id")
|
data = serializer.validated_data
|
||||||
value = data.get("value")
|
_id = data.get("id")
|
||||||
if not value:
|
value = data.get("value")
|
||||||
value = self.instance.get_next_child_preset_name()
|
if not value:
|
||||||
node = self.instance.create_child(value=value, _id=_id)
|
value = self.instance.get_next_child_preset_name()
|
||||||
# 避免查询 full value
|
node = self.instance.create_child(value=value, _id=_id)
|
||||||
node._full_value = node.value
|
# 避免查询 full value
|
||||||
serializer.instance = node
|
node._full_value = node.value
|
||||||
|
serializer.instance = node
|
||||||
|
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
pk = self.kwargs.get('pk') or self.request.query_params.get('id')
|
pk = self.kwargs.get('pk') or self.request.query_params.get('id')
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from orgs.utils import current_org
|
from orgs.utils import current_org
|
||||||
from common.utils.lock import DistributedLock
|
from common.utils.lock import DistributedLock
|
||||||
|
from assets.models import Node
|
||||||
|
|
||||||
|
|
||||||
class NodeTreeUpdateLock(DistributedLock):
|
class NodeTreeUpdateLock(DistributedLock):
|
||||||
|
@ -18,3 +19,11 @@ class NodeTreeUpdateLock(DistributedLock):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
name = self.get_name()
|
name = self.get_name()
|
||||||
super().__init__(name=name, release_on_transaction_commit=True, reentrant=True)
|
super().__init__(name=name, release_on_transaction_commit=True, reentrant=True)
|
||||||
|
|
||||||
|
|
||||||
|
class NodeAddChildrenLock(DistributedLock):
|
||||||
|
name_template = 'assets.node.add_children.<org_id:{org_id}>'
|
||||||
|
|
||||||
|
def __init__(self, node: Node):
|
||||||
|
name = self.name_template.format(org_id=node.org_id)
|
||||||
|
super().__init__(name=name, release_on_transaction_commit=True)
|
||||||
|
|
Loading…
Reference in New Issue