Description
We’ve observed the following error twice in the past week - Register blob request failed: HTTP Status: 307 ErrorBody: .. Looking at the SDK logs, on both occasions the same pattern appeared: two flush calls were running concurrently (triggered internally by the SDK, not by our code), and those concurrent flushes happened to share a common channel.
First occurrence: The first batch failed.
Second occurrence: The second batch failed.
In both cases, no rows were ingested for the channels in the failed batch. The committed offset never advanced, which caused our pipelines to stall.
Channel Invalidation
In these scenarios, I would expect all channels in the failed batch to be invalidated. However:
- In the first case, only the overlapping channel was invalidated. The error returned was
The client provided an out-of-order message, please reopen the channel
- In the second case, no channels were invalidated at all.
Question: Is this the expected behavior? If yes, what is the recommended way to handle it?
Stack Trace
2025-08-22 02:59:50,914 WARN [net.sno.ing.con.ServiceResponseHandler] (ingest-register-thread) 307 Status hit from STREAMING_REGISTER_BLOB, requestId:
2025-08-22 02:59:50,920 ERROR [net.sno.ing.str.int.FlushService] (ingest-register-thread) [SF_INGEST] Background flush task failed, client=<redacted>, exception=net.snowflake.ingest.utils.SFException: Register blob request failed: HTTP Status: 307 ErrorBody: ., detail=Register blob request failed: HTTP Status: 307 ErrorBody: ., trace=
net.snowflake.ingest.streaming.internal.SnowflakeStreamingIngestClientInternal.registerBlobs(SnowflakeStreamingIngestClientInternal.java:609)
net.snowflake.ingest.streaming.internal.SnowflakeStreamingIngestClientInternal.registerBlobs(SnowflakeStreamingIngestClientInternal.java:535)
net.snowflake.ingest.streaming.internal.RegisterService.registerBlobs(RegisterService.java:197)
net.snowflake.ingest.streaming.internal.FlushService.lambda$registerFuture$4(FlushService.java:237)
java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(Unknown Source)
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
java.base/java.lang.Thread.run(Unknown Source)
Environment
SDK: snowflake-ingest-sdk 4.0.0
Java version: 21
Description
We’ve observed the following error twice in the past week -
Register blob request failed: HTTP Status: 307 ErrorBody: .. Looking at the SDK logs, on both occasions the same pattern appeared: two flush calls were running concurrently (triggered internally by the SDK, not by our code), and those concurrent flushes happened to share a common channel.First occurrence: The first batch failed.
Second occurrence: The second batch failed.
In both cases, no rows were ingested for the channels in the failed batch. The committed offset never advanced, which caused our pipelines to stall.
Channel Invalidation
In these scenarios, I would expect all channels in the failed batch to be invalidated. However:
The client provided an out-of-order message, please reopen the channelQuestion: Is this the expected behavior? If yes, what is the recommended way to handle it?
Stack Trace
Environment
SDK: snowflake-ingest-sdk 4.0.0
Java version: 21