tamar-file-hub-client 0.0.5__py3-none-any.whl → 0.0.7__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.
- file_hub_client/client.py +34 -0
- file_hub_client/utils/retry.py +40 -0
- {tamar_file_hub_client-0.0.5.dist-info → tamar_file_hub_client-0.0.7.dist-info}/METADATA +1 -1
- {tamar_file_hub_client-0.0.5.dist-info → tamar_file_hub_client-0.0.7.dist-info}/RECORD +6 -6
- {tamar_file_hub_client-0.0.5.dist-info → tamar_file_hub_client-0.0.7.dist-info}/WHEEL +0 -0
- {tamar_file_hub_client-0.0.5.dist-info → tamar_file_hub_client-0.0.7.dist-info}/top_level.txt +0 -0
file_hub_client/client.py
CHANGED
@@ -23,6 +23,8 @@ from .services import (
|
|
23
23
|
)
|
24
24
|
from .schemas.context import UserContext, RequestContext
|
25
25
|
|
26
|
+
MAX_MESSAGE_LENGTH = 2 ** 31 - 1 # 对于32位系统
|
27
|
+
|
26
28
|
|
27
29
|
class AsyncTamarFileHubClient:
|
28
30
|
"""异步文件管理系统客户端"""
|
@@ -41,6 +43,7 @@ class AsyncTamarFileHubClient:
|
|
41
43
|
request_context: Optional[RequestContext] = None,
|
42
44
|
enable_logging: bool = True,
|
43
45
|
log_level: str = "INFO",
|
46
|
+
options: Optional[list] = None,
|
44
47
|
):
|
45
48
|
"""
|
46
49
|
初始化客户端
|
@@ -56,6 +59,13 @@ class AsyncTamarFileHubClient:
|
|
56
59
|
default_metadata: 默认的元数据(如 org_id, user_id 等)
|
57
60
|
user_context: 用户上下文
|
58
61
|
request_context: 请求上下文
|
62
|
+
enable_logging: 是否启用日志
|
63
|
+
log_level: 日志级别
|
64
|
+
options: gRPC 通道选项列表,例如:
|
65
|
+
[
|
66
|
+
('grpc.max_send_message_length', MAX_MESSAGE_LENGTH),
|
67
|
+
('grpc.max_receive_message_length', MAX_MESSAGE_LENGTH),
|
68
|
+
]
|
59
69
|
|
60
70
|
环境变量:
|
61
71
|
FILE_HUB_HOST: gRPC 服务器地址
|
@@ -86,11 +96,19 @@ class AsyncTamarFileHubClient:
|
|
86
96
|
if default_metadata is None:
|
87
97
|
default_metadata = {}
|
88
98
|
|
99
|
+
# 设置默认的 gRPC 选项(增加消息大小限制)
|
100
|
+
if options is None:
|
101
|
+
options = [
|
102
|
+
('grpc.max_send_message_length', MAX_MESSAGE_LENGTH),
|
103
|
+
('grpc.max_receive_message_length', MAX_MESSAGE_LENGTH),
|
104
|
+
]
|
105
|
+
|
89
106
|
self._client = AsyncGrpcClient(
|
90
107
|
self._host,
|
91
108
|
self._port,
|
92
109
|
self._secure,
|
93
110
|
credentials,
|
111
|
+
options=options,
|
94
112
|
retry_count=self._retry_count,
|
95
113
|
retry_delay=self._retry_delay,
|
96
114
|
default_metadata=default_metadata,
|
@@ -228,6 +246,7 @@ class TamarFileHubClient:
|
|
228
246
|
request_context: Optional[RequestContext] = None,
|
229
247
|
enable_logging: bool = True,
|
230
248
|
log_level: str = "INFO",
|
249
|
+
options: Optional[list] = None,
|
231
250
|
):
|
232
251
|
"""
|
233
252
|
初始化客户端
|
@@ -243,6 +262,13 @@ class TamarFileHubClient:
|
|
243
262
|
default_metadata: 默认的元数据(如 org_id, user_id 等)
|
244
263
|
user_context: 用户上下文
|
245
264
|
request_context: 请求上下文
|
265
|
+
enable_logging: 是否启用日志
|
266
|
+
log_level: 日志级别
|
267
|
+
options: gRPC 通道选项列表,例如:
|
268
|
+
[
|
269
|
+
('grpc.max_send_message_length', 100 * 1024 * 1024), # 100MB
|
270
|
+
('grpc.max_receive_message_length', 100 * 1024 * 1024), # 100MB
|
271
|
+
]
|
246
272
|
|
247
273
|
环境变量:
|
248
274
|
FILE_HUB_HOST: gRPC 服务器地址
|
@@ -273,11 +299,19 @@ class TamarFileHubClient:
|
|
273
299
|
if default_metadata is None:
|
274
300
|
default_metadata = {}
|
275
301
|
|
302
|
+
# 设置默认的 gRPC 选项(增加消息大小限制)
|
303
|
+
if options is None:
|
304
|
+
options = [
|
305
|
+
('grpc.max_send_message_length', 100 * 1024 * 1024), # 100MB
|
306
|
+
('grpc.max_receive_message_length', 100 * 1024 * 1024), # 100MB
|
307
|
+
]
|
308
|
+
|
276
309
|
self._client = SyncGrpcClient(
|
277
310
|
self._host,
|
278
311
|
self._port,
|
279
312
|
self._secure,
|
280
313
|
credentials,
|
314
|
+
options=options,
|
281
315
|
retry_count=self._retry_count,
|
282
316
|
retry_delay=self._retry_delay,
|
283
317
|
default_metadata=default_metadata,
|
file_hub_client/utils/retry.py
CHANGED
@@ -59,8 +59,12 @@ def retry_with_backoff(
|
|
59
59
|
is_retryable, _ = ErrorClassifier.is_retryable(e)
|
60
60
|
|
61
61
|
if not is_retryable:
|
62
|
+
# 尝试从 kwargs 中获取 request_id
|
63
|
+
request_id = kwargs.get('request_id', 'unknown')
|
64
|
+
|
62
65
|
logger.debug(
|
63
66
|
f"🚫 不可重试错误 | 操作: {func.__name__} | "
|
67
|
+
f"request_id: {request_id} | "
|
64
68
|
f"错误: {type(e).__name__}: {str(e)} | "
|
65
69
|
f"直接抛出异常"
|
66
70
|
)
|
@@ -76,8 +80,12 @@ def retry_with_backoff(
|
|
76
80
|
# HTTP 错误
|
77
81
|
error_details = f"HTTP {e.response.status_code}: {str(e)}"
|
78
82
|
|
83
|
+
# 尝试从 kwargs 中获取 request_id
|
84
|
+
request_id = kwargs.get('request_id', 'unknown')
|
85
|
+
|
79
86
|
logger.warning(
|
80
87
|
f"🔄 触发重试 | 操作: {func.__name__} | "
|
88
|
+
f"request_id: {request_id} | "
|
81
89
|
f"尝试: {attempt + 1}/{max_retries + 1} | "
|
82
90
|
f"错误类型: {type(e).__name__} | "
|
83
91
|
f"错误详情: {error_details} | "
|
@@ -86,8 +94,12 @@ def retry_with_backoff(
|
|
86
94
|
await asyncio.sleep(delay)
|
87
95
|
delay = min(delay * backoff_factor, max_delay)
|
88
96
|
else:
|
97
|
+
# 尝试从 kwargs 中获取 request_id
|
98
|
+
request_id = kwargs.get('request_id', 'unknown')
|
99
|
+
|
89
100
|
logger.error(
|
90
101
|
f"❌ 重试失败 | 操作: {func.__name__} | "
|
102
|
+
f"request_id: {request_id} | "
|
91
103
|
f"已达最大重试次数: {max_retries} | "
|
92
104
|
f"最终错误: {type(e).__name__}: {str(e)}"
|
93
105
|
)
|
@@ -111,8 +123,12 @@ def retry_with_backoff(
|
|
111
123
|
is_retryable, _ = ErrorClassifier.is_retryable(e)
|
112
124
|
|
113
125
|
if not is_retryable:
|
126
|
+
# 尝试从 kwargs 中获取 request_id
|
127
|
+
request_id = kwargs.get('request_id', 'unknown')
|
128
|
+
|
114
129
|
logger.debug(
|
115
130
|
f"🚫 不可重试错误 | 操作: {func.__name__} | "
|
131
|
+
f"request_id: {request_id} | "
|
116
132
|
f"错误: {type(e).__name__}: {str(e)} | "
|
117
133
|
f"直接抛出异常"
|
118
134
|
)
|
@@ -128,8 +144,12 @@ def retry_with_backoff(
|
|
128
144
|
# HTTP 错误
|
129
145
|
error_details = f"HTTP {e.response.status_code}: {str(e)}"
|
130
146
|
|
147
|
+
# 尝试从 kwargs 中获取 request_id
|
148
|
+
request_id = kwargs.get('request_id', 'unknown')
|
149
|
+
|
131
150
|
logger.warning(
|
132
151
|
f"🔄 触发重试 | 操作: {func.__name__} | "
|
152
|
+
f"request_id: {request_id} | "
|
133
153
|
f"尝试: {attempt + 1}/{max_retries + 1} | "
|
134
154
|
f"错误类型: {type(e).__name__} | "
|
135
155
|
f"错误详情: {error_details} | "
|
@@ -138,8 +158,12 @@ def retry_with_backoff(
|
|
138
158
|
time.sleep(delay)
|
139
159
|
delay = min(delay * backoff_factor, max_delay)
|
140
160
|
else:
|
161
|
+
# 尝试从 kwargs 中获取 request_id
|
162
|
+
request_id = kwargs.get('request_id', 'unknown')
|
163
|
+
|
141
164
|
logger.error(
|
142
165
|
f"❌ 重试失败 | 操作: {func.__name__} | "
|
166
|
+
f"request_id: {request_id} | "
|
143
167
|
f"已达最大重试次数: {max_retries} | "
|
144
168
|
f"最终错误: {type(e).__name__}: {str(e)}"
|
145
169
|
)
|
@@ -193,8 +217,12 @@ def retry_on_lock_conflict(
|
|
193
217
|
if 'error_message' in result:
|
194
218
|
conflict_details += f" - {result['error_message']}"
|
195
219
|
|
220
|
+
# 尝试从 kwargs 中获取 request_id
|
221
|
+
request_id = kwargs.get('request_id', 'unknown')
|
222
|
+
|
196
223
|
logger.warning(
|
197
224
|
f"🔒 锁冲突重试 | 操作: {func.__name__} | "
|
225
|
+
f"request_id: {request_id} | "
|
198
226
|
f"尝试: {attempt + 1}/{max_retries + 1} | "
|
199
227
|
f"冲突详情: {conflict_details} | "
|
200
228
|
f"延迟: {delay:.1f}秒"
|
@@ -203,8 +231,12 @@ def retry_on_lock_conflict(
|
|
203
231
|
delay = min(delay * backoff_factor, max_delay)
|
204
232
|
continue
|
205
233
|
else:
|
234
|
+
# 尝试从 kwargs 中获取 request_id
|
235
|
+
request_id = kwargs.get('request_id', 'unknown')
|
236
|
+
|
206
237
|
logger.error(
|
207
238
|
f"❌ 锁冲突重试失败 | 操作: {func.__name__} | "
|
239
|
+
f"request_id: {request_id} | "
|
208
240
|
f"已达最大重试次数: {max_retries} | "
|
209
241
|
f"返回最后的冲突结果"
|
210
242
|
)
|
@@ -238,8 +270,12 @@ def retry_on_lock_conflict(
|
|
238
270
|
if 'error_message' in result:
|
239
271
|
conflict_details += f" - {result['error_message']}"
|
240
272
|
|
273
|
+
# 尝试从 kwargs 中获取 request_id
|
274
|
+
request_id = kwargs.get('request_id', 'unknown')
|
275
|
+
|
241
276
|
logger.warning(
|
242
277
|
f"🔒 锁冲突重试 | 操作: {func.__name__} | "
|
278
|
+
f"request_id: {request_id} | "
|
243
279
|
f"尝试: {attempt + 1}/{max_retries + 1} | "
|
244
280
|
f"冲突详情: {conflict_details} | "
|
245
281
|
f"延迟: {delay:.1f}秒"
|
@@ -248,8 +284,12 @@ def retry_on_lock_conflict(
|
|
248
284
|
delay = min(delay * backoff_factor, max_delay)
|
249
285
|
continue
|
250
286
|
else:
|
287
|
+
# 尝试从 kwargs 中获取 request_id
|
288
|
+
request_id = kwargs.get('request_id', 'unknown')
|
289
|
+
|
251
290
|
logger.error(
|
252
291
|
f"❌ 锁冲突重试失败 | 操作: {func.__name__} | "
|
292
|
+
f"request_id: {request_id} | "
|
253
293
|
f"已达最大重试次数: {max_retries} | "
|
254
294
|
f"返回最后的冲突结果"
|
255
295
|
)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
file_hub_client/__init__.py,sha256=5pOOgw8YLzsQ49o81j5xCFtiH7VHFObNlbAYZwsU7ts,2918
|
2
|
-
file_hub_client/client.py,sha256=
|
2
|
+
file_hub_client/client.py,sha256=kOis7hw0WAi-YAmEM_1PEzp0hsOD9JSxLbJi2cvTd_o,17338
|
3
3
|
file_hub_client/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
|
4
4
|
file_hub_client/enums/__init__.py,sha256=e3Io6-IC9Nezbdc8H4TzuWqiDw0T1fsdbSi-fsgSQM4,203
|
5
5
|
file_hub_client/enums/export_format.py,sha256=C9P0q8v5eTszUBqKBmERxoA9UrTgLuX3a_bZeUxkdlQ,296
|
@@ -48,10 +48,10 @@ file_hub_client/utils/download_helper.py,sha256=Mc8TQSWjHxIglJMkKlGy9r3LZe8e_Mwe
|
|
48
48
|
file_hub_client/utils/file_utils.py,sha256=Ly8R5KJS_3lbgJxNZkc4sSBKuGgn-fYeh17GEY4pyy8,4359
|
49
49
|
file_hub_client/utils/idempotency.py,sha256=zuXDlpAc9VTkTsarlnkO0VuJ77yON6j1TX0GvL9Xd9k,6029
|
50
50
|
file_hub_client/utils/logging.py,sha256=IxcvWkA0G9s9BMiXIeFAdJX5G-Lc5-JFlS2yxOX1Swo,11741
|
51
|
-
file_hub_client/utils/retry.py,sha256=
|
51
|
+
file_hub_client/utils/retry.py,sha256=A2MBdJCEY-Ks0guq8dd5wXX22sD27N30Qy3nQIW1B_s,18019
|
52
52
|
file_hub_client/utils/smart_retry.py,sha256=RjBhyG6SNDfMXxNxKU_qayWDD6Ihp7ow6_BPjhgflM0,16465
|
53
53
|
file_hub_client/utils/upload_helper.py,sha256=gEtn9OXVJiGUpVev_fqrDnRQ6AFiiP9goLzFrVpqXmU,22569
|
54
|
-
tamar_file_hub_client-0.0.
|
55
|
-
tamar_file_hub_client-0.0.
|
56
|
-
tamar_file_hub_client-0.0.
|
57
|
-
tamar_file_hub_client-0.0.
|
54
|
+
tamar_file_hub_client-0.0.7.dist-info/METADATA,sha256=L5oYQPn0MWDeZjntI6wK449X8iZguUJ3UI-XHYA-wFI,64873
|
55
|
+
tamar_file_hub_client-0.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
56
|
+
tamar_file_hub_client-0.0.7.dist-info/top_level.txt,sha256=9wcR7hyAJQdJg_kuH6WR3nmpJ8O-j8aJNK8f_kcFy6U,16
|
57
|
+
tamar_file_hub_client-0.0.7.dist-info/RECORD,,
|
File without changes
|
{tamar_file_hub_client-0.0.5.dist-info → tamar_file_hub_client-0.0.7.dist-info}/top_level.txt
RENAMED
File without changes
|