atlan-application-sdk 0.1.1rc56__py3-none-any.whl → 0.1.1rc58__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- application_sdk/activities/lock_management.py +1 -2
- application_sdk/constants.py +1 -1
- application_sdk/interceptors/lock.py +11 -4
- application_sdk/version.py +1 -1
- {atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/METADATA +1 -1
- {atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/RECORD +9 -9
- {atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/WHEEL +0 -0
- {atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/licenses/LICENSE +0 -0
- {atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/licenses/NOTICE +0 -0
|
@@ -13,7 +13,6 @@ from temporalio.exceptions import ApplicationError
|
|
|
13
13
|
|
|
14
14
|
from application_sdk.clients.redis import RedisClientAsync
|
|
15
15
|
from application_sdk.common.error_codes import ActivityError
|
|
16
|
-
from application_sdk.constants import APPLICATION_NAME
|
|
17
16
|
from application_sdk.observability.logger_adaptor import get_logger
|
|
18
17
|
|
|
19
18
|
logger = get_logger(__name__)
|
|
@@ -50,7 +49,7 @@ async def acquire_distributed_lock(
|
|
|
50
49
|
non_retryable=True,
|
|
51
50
|
)
|
|
52
51
|
slot = random.randint(0, max_locks - 1)
|
|
53
|
-
resource_id = f"{
|
|
52
|
+
resource_id = f"{lock_name}:{slot}"
|
|
54
53
|
|
|
55
54
|
try:
|
|
56
55
|
async with RedisClientAsync() as redis_client:
|
application_sdk/constants.py
CHANGED
|
@@ -256,7 +256,7 @@ REDIS_SENTINEL_HOSTS = os.getenv("REDIS_SENTINEL_HOSTS", "")
|
|
|
256
256
|
#: Whether to enable strict locking
|
|
257
257
|
IS_LOCKING_DISABLED = os.getenv("IS_LOCKING_DISABLED", "true").lower() == "true"
|
|
258
258
|
#: Retry interval for lock acquisition
|
|
259
|
-
|
|
259
|
+
LOCK_RETRY_INTERVAL_SECONDS = int(os.getenv("LOCK_RETRY_INTERVAL_SECONDS", "60"))
|
|
260
260
|
|
|
261
261
|
# MCP Configuration
|
|
262
262
|
#: Flag to indicate if MCP should be enabled or not. Turning this to true will setup an MCP server along
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Manages distributed locks for activities decorated with @needs_lock using
|
|
4
4
|
separate lock acquisition and release activities to avoid workflow deadlocks.
|
|
5
|
+
|
|
6
|
+
IMPORTANT: Uses regular activities (not local activities) for lock operations to prevent
|
|
7
|
+
workflow task blocking and deadlocks. Local activities would block the workflow task during
|
|
8
|
+
lock acquisition retries, preventing lock releases from executing and causing infinite deadlock
|
|
9
|
+
when all lock slots are taken.
|
|
5
10
|
"""
|
|
6
11
|
|
|
7
12
|
from datetime import timedelta
|
|
@@ -22,7 +27,7 @@ from application_sdk.constants import (
|
|
|
22
27
|
APPLICATION_NAME,
|
|
23
28
|
IS_LOCKING_DISABLED,
|
|
24
29
|
LOCK_METADATA_KEY,
|
|
25
|
-
|
|
30
|
+
LOCK_RETRY_INTERVAL_SECONDS,
|
|
26
31
|
)
|
|
27
32
|
from application_sdk.observability.logger_adaptor import get_logger
|
|
28
33
|
|
|
@@ -109,12 +114,14 @@ class RedisLockOutboundInterceptor(WorkflowOutboundInterceptor):
|
|
|
109
114
|
try:
|
|
110
115
|
# Step 1: Acquire lock via dedicated activity with Temporal retry policy
|
|
111
116
|
schedule_to_close_timeout = workflow.info().execution_timeout
|
|
112
|
-
lock_result = await workflow.
|
|
117
|
+
lock_result = await workflow.execute_activity(
|
|
113
118
|
"acquire_distributed_lock",
|
|
114
119
|
args=[lock_name, max_locks, ttl_seconds, owner_id],
|
|
115
120
|
start_to_close_timeout=timedelta(seconds=30),
|
|
116
121
|
retry_policy=RetryPolicy(
|
|
117
|
-
initial_interval=timedelta(
|
|
122
|
+
initial_interval=timedelta(
|
|
123
|
+
seconds=int(LOCK_RETRY_INTERVAL_SECONDS)
|
|
124
|
+
),
|
|
118
125
|
backoff_coefficient=1.0,
|
|
119
126
|
),
|
|
120
127
|
schedule_to_close_timeout=schedule_to_close_timeout,
|
|
@@ -129,7 +136,7 @@ class RedisLockOutboundInterceptor(WorkflowOutboundInterceptor):
|
|
|
129
136
|
# Step 3: Release lock (fire-and-forget with short timeout)
|
|
130
137
|
if lock_result is not None:
|
|
131
138
|
try:
|
|
132
|
-
await workflow.
|
|
139
|
+
await workflow.execute_activity(
|
|
133
140
|
"release_distributed_lock",
|
|
134
141
|
args=[lock_result["resource_id"], lock_result["owner_id"]],
|
|
135
142
|
start_to_close_timeout=timedelta(seconds=5),
|
application_sdk/version.py
CHANGED
{atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atlan-application-sdk
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1rc58
|
|
4
4
|
Summary: Atlan Application SDK is a Python library for developing applications on the Atlan Platform
|
|
5
5
|
Project-URL: Repository, https://github.com/atlanhq/application-sdk
|
|
6
6
|
Project-URL: Documentation, https://github.com/atlanhq/application-sdk/README.md
|
{atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/RECORD
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
application_sdk/__init__.py,sha256=2e2mvmLJ5dxmJGPELtb33xwP-j6JMdoIuqKycEn7hjg,151
|
|
2
|
-
application_sdk/constants.py,sha256=
|
|
3
|
-
application_sdk/version.py,sha256=
|
|
2
|
+
application_sdk/constants.py,sha256=WDw0I9u_OoXIE79IFDFBHJYmIS9KAsghMeGOxfshnpg,10994
|
|
3
|
+
application_sdk/version.py,sha256=GfLIvCy7o6Bup3dK-TlbQNu-KhQHzePlpsQ45bXgCqg,88
|
|
4
4
|
application_sdk/worker.py,sha256=i5f0AeKI39IfsLO05QkwC6uMz0zDPSJqP7B2byri1VI,7489
|
|
5
5
|
application_sdk/activities/__init__.py,sha256=L5WXkTwOwGtjWAlXrUJRCKGwyIyp3z8fBv8BZVCRFQI,11175
|
|
6
|
-
application_sdk/activities/lock_management.py,sha256=
|
|
6
|
+
application_sdk/activities/lock_management.py,sha256=6Wdf3jMKitoarHQP91PIJOoGFz4aaOLS_40c7n1yAOA,3902
|
|
7
7
|
application_sdk/activities/.cursor/BUGBOT.md,sha256=FNykX5aMkdOhzgpiGqstOnSp9JN63iR2XP3onU4AGh8,15843
|
|
8
8
|
application_sdk/activities/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
9
|
application_sdk/activities/common/models.py,sha256=43MF_w0EzEQiJvGIqF_FNet4X6MEmwqYd3YAsHdQn08,1362
|
|
@@ -68,7 +68,7 @@ application_sdk/inputs/.cursor/BUGBOT.md,sha256=hwKGDbopv3NU0bpC_ElpAPDFcS59GWS3
|
|
|
68
68
|
application_sdk/interceptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
69
69
|
application_sdk/interceptors/cleanup.py,sha256=JlFcM_2Y5AIEfGTSNe0aoon7eoE68MIXI0rA3LHsSeY,5966
|
|
70
70
|
application_sdk/interceptors/events.py,sha256=TeStWmBbc4v1-dm2DWeKYsUfUhJLR8CtTQhu3TWOZWM,6524
|
|
71
|
-
application_sdk/interceptors/lock.py,sha256=
|
|
71
|
+
application_sdk/interceptors/lock.py,sha256=5ETm20zrTaH2b9fepN4Ckp1tGJV-uINqDrno_5RW3aw,6169
|
|
72
72
|
application_sdk/interceptors/.cursor/BUGBOT.md,sha256=pxmUF2c7dtaXAX8yAa1-LBa6FCrj_uw7aQcHrppjf1A,14570
|
|
73
73
|
application_sdk/observability/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
74
74
|
application_sdk/observability/logger_adaptor.py,sha256=00c0F7maDkp1xrHttW6VQbWFDGr6NkXeDPjmf97ojlY,29989
|
|
@@ -157,8 +157,8 @@ application_sdk/workflows/metadata_extraction/__init__.py,sha256=jHUe_ZBQ66jx8bg
|
|
|
157
157
|
application_sdk/workflows/metadata_extraction/sql.py,sha256=6ZaVt84n-8U2ZvR9GR7uIJKv5v8CuyQjhlnoRJvDszc,12435
|
|
158
158
|
application_sdk/workflows/query_extraction/__init__.py,sha256=n066_CX5RpJz6DIxGMkKS3eGSRg03ilaCtsqfJWQb7Q,117
|
|
159
159
|
application_sdk/workflows/query_extraction/sql.py,sha256=kT_JQkLCRZ44ZpaC4QvPL6DxnRIIVh8gYHLqRbMI-hA,4826
|
|
160
|
-
atlan_application_sdk-0.1.
|
|
161
|
-
atlan_application_sdk-0.1.
|
|
162
|
-
atlan_application_sdk-0.1.
|
|
163
|
-
atlan_application_sdk-0.1.
|
|
164
|
-
atlan_application_sdk-0.1.
|
|
160
|
+
atlan_application_sdk-0.1.1rc58.dist-info/METADATA,sha256=sLmqBn4MVdNZQluPCk4z_iItSspSM4W_W1RZGqyPL1c,5730
|
|
161
|
+
atlan_application_sdk-0.1.1rc58.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
162
|
+
atlan_application_sdk-0.1.1rc58.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
163
|
+
atlan_application_sdk-0.1.1rc58.dist-info/licenses/NOTICE,sha256=A-XVVGt3KOYuuMmvSMIFkg534F1vHiCggEBp4Ez3wGk,1041
|
|
164
|
+
atlan_application_sdk-0.1.1rc58.dist-info/RECORD,,
|
{atlan_application_sdk-0.1.1rc56.dist-info → atlan_application_sdk-0.1.1rc58.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|