durabletask 0.0.0.dev45__tar.gz → 0.0.0.dev48__tar.gz

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.
Files changed (33) hide show
  1. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/PKG-INFO +1 -1
  2. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/client.py +42 -4
  3. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask.egg-info/PKG-INFO +1 -1
  4. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/pyproject.toml +1 -1
  5. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/LICENSE +0 -0
  6. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/README.md +0 -0
  7. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/__init__.py +0 -0
  8. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/__init__.py +0 -0
  9. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/durable_entity.py +0 -0
  10. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/entity_context.py +0 -0
  11. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/entity_instance_id.py +0 -0
  12. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/entity_lock.py +0 -0
  13. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/entity_metadata.py +0 -0
  14. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/entities/entity_operation_failed_exception.py +0 -0
  15. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/entity_state_shim.py +0 -0
  16. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/exceptions.py +0 -0
  17. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/grpc_interceptor.py +0 -0
  18. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/helpers.py +0 -0
  19. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/json_encode_output_exception.py +0 -0
  20. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/orchestration_entity_context.py +0 -0
  21. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/orchestrator_service_pb2.py +0 -0
  22. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/orchestrator_service_pb2.pyi +0 -0
  23. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/orchestrator_service_pb2_grpc.py +0 -0
  24. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/proto_task_hub_sidecar_service_stub.py +0 -0
  25. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/internal/shared.py +0 -0
  26. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/py.typed +0 -0
  27. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/task.py +0 -0
  28. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask/worker.py +0 -0
  29. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask.egg-info/SOURCES.txt +0 -0
  30. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask.egg-info/dependency_links.txt +0 -0
  31. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask.egg-info/requires.txt +0 -0
  32. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/durabletask.egg-info/top_level.txt +0 -0
  33. {durabletask-0.0.0.dev45 → durabletask-0.0.0.dev48}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durabletask
3
- Version: 0.0.0.dev45
3
+ Version: 0.0.0.dev48
4
4
  Summary: A Durable Task Client SDK for Python
5
5
  License: MIT License
6
6
 
@@ -63,6 +63,12 @@ class PurgeInstancesResult:
63
63
  is_complete: bool
64
64
 
65
65
 
66
+ @dataclass
67
+ class CleanEntityStorageResult:
68
+ empty_entities_removed: int
69
+ orphaned_locks_released: int
70
+
71
+
66
72
  class OrchestrationFailedError(Exception):
67
73
  def __init__(self, message: str, failure_details: task.FailureDetails):
68
74
  super().__init__(message)
@@ -147,7 +153,7 @@ class TaskHubGrpcClient:
147
153
  req = pb.CreateInstanceRequest(
148
154
  name=name,
149
155
  instanceId=instance_id if instance_id else uuid.uuid4().hex,
150
- input=helpers.get_string_value(shared.to_json(input)),
156
+ input=helpers.get_string_value(shared.to_json(input) if input is not None else None),
151
157
  scheduledStartTimestamp=helpers.new_timestamp(start_at) if start_at else None,
152
158
  version=helpers.get_string_value(version if version else self.default_version),
153
159
  orchestrationIdReusePolicy=reuse_id_policy,
@@ -269,7 +275,8 @@ class TaskHubGrpcClient:
269
275
  req = pb.RaiseEventRequest(
270
276
  instanceId=instance_id,
271
277
  name=event_name,
272
- input=helpers.get_string_value(shared.to_json(data)))
278
+ input=helpers.get_string_value(shared.to_json(data) if data is not None else None)
279
+ )
273
280
 
274
281
  self._logger.info(f"Raising event '{event_name}' for instance '{instance_id}'.")
275
282
  self._stub.RaiseEvent(req)
@@ -279,7 +286,7 @@ class TaskHubGrpcClient:
279
286
  recursive: bool = True):
280
287
  req = pb.TerminateRequest(
281
288
  instanceId=instance_id,
282
- output=helpers.get_string_value(shared.to_json(output)),
289
+ output=helpers.get_string_value(shared.to_json(output) if output is not None else None),
283
290
  recursive=recursive)
284
291
 
285
292
  self._logger.info(f"Terminating instance '{instance_id}'.")
@@ -329,7 +336,7 @@ class TaskHubGrpcClient:
329
336
  req = pb.SignalEntityRequest(
330
337
  instanceId=str(entity_instance_id),
331
338
  name=operation_name,
332
- input=helpers.get_string_value(shared.to_json(input)),
339
+ input=helpers.get_string_value(shared.to_json(input) if input is not None else None),
333
340
  requestId=str(uuid.uuid4()),
334
341
  scheduledTime=None,
335
342
  parentTraceContext=None,
@@ -405,3 +412,34 @@ class TaskHubGrpcClient:
405
412
  else:
406
413
  break
407
414
  return entities
415
+
416
+ def clean_entity_storage(self,
417
+ remove_empty_entities: bool = True,
418
+ release_orphaned_locks: bool = True,
419
+ _continuation_token: Optional[pb2.StringValue] = None
420
+ ) -> CleanEntityStorageResult:
421
+ self._logger.info("Cleaning entity storage")
422
+
423
+ empty_entities_removed = 0
424
+ orphaned_locks_released = 0
425
+
426
+ while True:
427
+ req = pb.CleanEntityStorageRequest(
428
+ removeEmptyEntities=remove_empty_entities,
429
+ releaseOrphanedLocks=release_orphaned_locks,
430
+ continuationToken=_continuation_token
431
+ )
432
+ resp: pb.CleanEntityStorageResponse = self._stub.CleanEntityStorage(req)
433
+ empty_entities_removed += resp.emptyEntitiesRemoved
434
+ orphaned_locks_released += resp.orphanedLocksReleased
435
+
436
+ if resp.continuationToken and resp.continuationToken.value and resp.continuationToken.value != "0":
437
+ self._logger.info(f"Received continuation token with value {resp.continuationToken.value}, cleaning next page...")
438
+ if _continuation_token and _continuation_token.value and _continuation_token.value == resp.continuationToken.value:
439
+ self._logger.warning(f"Received the same continuation token value {resp.continuationToken.value} again, stopping to avoid infinite loop.")
440
+ break
441
+ _continuation_token = resp.continuationToken
442
+ else:
443
+ break
444
+
445
+ return CleanEntityStorageResult(empty_entities_removed, orphaned_locks_released)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: durabletask
3
- Version: 0.0.0.dev45
3
+ Version: 0.0.0.dev48
4
4
  Summary: A Durable Task Client SDK for Python
5
5
  License: MIT License
6
6
 
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "durabletask"
12
- version = "0.0.0.dev45"
12
+ version = "0.0.0.dev48"
13
13
  description = "A Durable Task Client SDK for Python"
14
14
  keywords = [
15
15
  "durable",