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 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,
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tamar-file-hub-client
3
- Version: 0.0.5
3
+ Version: 0.0.7
4
4
  Summary: A Python SDK for gRPC-based file management system
5
5
  Home-page: https://github.com/Tamar-Edge-AI/file-hub-client
6
6
  Author: Oscar Ou
@@ -1,5 +1,5 @@
1
1
  file_hub_client/__init__.py,sha256=5pOOgw8YLzsQ49o81j5xCFtiH7VHFObNlbAYZwsU7ts,2918
2
- file_hub_client/client.py,sha256=FXYHibyzgtvmIG1NKyHTAjkLutdn5fbAc9XSqrCEAFs,15895
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=MyEAYHEGljoHvVs4Kh1hX_Y3iDGcppVCSUvVkNGbC28,15609
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.5.dist-info/METADATA,sha256=Ri0jUnjTvBxHIBNVmp1pc-7tSygTk3j_ff11O-Hxgxg,64873
55
- tamar_file_hub_client-0.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
56
- tamar_file_hub_client-0.0.5.dist-info/top_level.txt,sha256=9wcR7hyAJQdJg_kuH6WR3nmpJ8O-j8aJNK8f_kcFy6U,16
57
- tamar_file_hub_client-0.0.5.dist-info/RECORD,,
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,,