You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 486df93
Browse filesBrowse the repository at this point in the historyBrowse files
* Recover verified ambiguous payload uploads on HTTP 409 `BlobAlreadyExists` as well as HTTP 412, while rejecting unrelated conflicts.
6
+
* Change the default large-payload externalization threshold from 900,000 bytes to 256 KiB, matching .NET.
7
+
* Align the large-payload worker estimator threshold with the 256 KiB storage default, resolve externalized entity-operation failure traces, recover verified ambiguous blob uploads, and recognize `$root` payload tokens.
8
+
* Preserve transient verification-download failures during ambiguous blob-upload recovery instead of reporting the original permanent precondition failure.
9
+
* Propagate transient large-payload upload failures without completing work items; abandon failed activity and orchestration completions for scheduler redelivery instead of terminating the worker polling thread.
10
+
* Ensure the export container exists before every upload, allowing export retries to recover containers deleted between uploads.
11
+
* Preserve custom and empty property objects in exported failure details, including nested failures, matching .NET's history conversion.
12
+
* Capture the default continuous-export completion-time lower bound when creation options are constructed, matching .NET and preserving the window through worker queue delays.
5
13
* Recreate a deleted large-payload container and retry the upload once, without allowing stale concurrent failures to invalidate a newly recreated container.
6
14
* Preserve backend timestamp precision in orchestration history and client metadata, including export blob names, while retaining existing orchestration replay timestamp behavior.
7
15
* Export entity operations and locks using the .NET-compatible `EventSent`/`EventRaised` message representation instead of Java-native entity event objects, preserving missing stack traces in failure details.
@@ -43,7 +43,7 @@ LargePayloadStorageOptions payloadOptions = new LargePayloadStorageOptions()
43
43
44
44
## Defaults and limits
45
45
46
-
- Payloads of at least 900,000 bytes are externalized by default.
46
+
- Payloads of at least 256 KiB (262,144 bytes) are externalized by default.
47
47
- The threshold can be configured up to 1 MiB.
48
48
- The default maximum externalized payload size is 10 MiB.
49
49
- Payloads are gzip-compressed by default.
@@ -52,6 +52,44 @@ LargePayloadStorageOptions payloadOptions = new LargePayloadStorageOptions()
52
52
53
53
The storage identity needs permission to create the container and read and write blobs. Payload blobs are retained after orchestration processing, so configure an Azure Storage lifecycle policy appropriate for the application's retention requirements.
54
54
55
+
## Upload failures
56
+
57
+
Transient upload failures (including HTTP 408, 429, and 5xx responses) propagate without sending a worker
58
+
completion, allowing the work item to be retried rather than recording a task failure. Permanent activity and
59
+
orchestration upload failures become non-retriable failure completions. Entity upload failures propagate without
60
+
completing the batch, matching .NET. The worker logs failed completions and abandons the affected work item for
61
+
scheduler redelivery without terminating its polling thread.
62
+
63
+
Uploads use conditional creation to prevent overwriting an existing payload. If a PUT commits but its response is
64
+
lost, a retried PUT can return HTTP 412 or HTTP 409 `BlobAlreadyExists`. Other HTTP 409 errors are not recovered.
65
+
The store recovers only after verifying that the stored bytes and content
66
+
encoding exactly match the attempted upload. A verification download failure propagates with its own status so
67
+
transient failures remain retryable. Payload tokens also support Azure's `$root` container.
Copy file name to clipboardExpand all lines: azure-blob-payloads/src/main/java/com/microsoft/durabletask/azureblobpayloads/LargePayloadInterceptor.java
Copy file name to clipboardExpand all lines: azure-blob-payloads/src/main/java/com/microsoft/durabletask/azureblobpayloads/LargePayloadStorageOptions.java
+2-2Lines changed: 2 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,7 @@ public final class LargePayloadStorageOptions {
31
31
32
32
privatestaticfinalintONE_MIB = 1024 * 1024;
33
33
34
-
privateintthresholdBytes = 900_000;
34
+
privateintthresholdBytes = 256 * 1024;
35
35
privateintmaxPayloadBytes = 10 * ONE_MIB;
36
36
privateStringconnectionString;
37
37
privateURIaccountUri;
@@ -41,7 +41,7 @@ public final class LargePayloadStorageOptions {
41
41
42
42
/**
43
43
* Gets the threshold in bytes at which payloads are externalized to blob storage.
44
-
* Payloads smaller than this threshold are sent inline. Default is 900,000 bytes.
44
+
* Payloads smaller than this threshold are sent inline. Default is 256 KiB (262,144 bytes).
0 commit comments