Alasdair Ellis
10/15/2026, 2:21 PMkapa.ai
10/15/2026, 2:21 PMairbyte-server — are very consistent with a known issue in the S3 source connector related to per-file STATE message emission.
Root Cause: STATE Message Bloat On the legacy DefaultFileBasedCursor path used by source-s3, the connector emits a STATE message after every single file. Each STATE message embeds the entire file-history dict. With 3 streams × up to 10,000 files each, this means:
• Thousands of STATE messages per sync
• Each message growing larger as history fills up
• The platform/orchestrator buffers un-ACKed STATE messages, which can OOM the replication pod before the destination ACKs them
This was documented internally as oncall #12663 and is exactly what you're experiencing. [source-s3 throttle PR]
Why You See Phantom Attempts and Temporal Issues The large state buffer causes the replication pod to struggle or crash, which Temporal interprets as a workflow failure and retries. This explains:
• The 5+ retry attempts shown in the UI
• airbyte-server CPU/memory spikes (processing repeated Temporal workflow task retries)
• context deadline exceeded and Workflow task already started errors in Temporal logs [Temporal deadline issue]
The Temporal persistence errors (context deadline exceeded) can also indicate the Temporal DB is under stress from the volume of workflow state being written, though your RDS metrics (~27% CPU) suggest it's not critically overloaded yet. [Temporal stability issue]
The Fix A ThrottledFileBasedStream wrapper was introduced in source-s3 to limit STATE emission to at most once every 10 minutes, while still guaranteeing a final STATE is emitted at end of stream. [throttled_stream.py]
The throttle logic:
• Passes the first STATE immediately (cold start)
• Suppresses subsequent STATEs within the 600-second window
• Emits the latest held STATE at end of stream so the cursor is always up to date
This fix was introduced in the connector-local ThrottledFileBasedStream and is being migrated into the CDK itself (PR #83750), but the connector-local version is already present in the codebase.
What You Should Do 1. Upgrade source-s3 — you are on 4.5.18. Check the changelog for the version that introduced ThrottledFileBasedStream (it was added for oncall #12663). The throttle is present in the current master code. Upgrading to a recent version (e.g. 4.13.x or later) should include this fix.
2. Check your STATE history size — the S3 source caps history at 10,000 files per stream. With 1,000 files/day across 3 streams, you will hit this cap quickly. Once full, older entries are dropped and the connector falls back to a date-range window (Days to Sync if History is Full). [S3 state docs]
3. Consider days_to_sync_if_history_is_full — tune this parameter to avoid re-reading large bands of files once history eviction kicks in.
4. Monitor Temporal DB — even at 27% average CPU, peak load during large syncs can spike significantly. Consider upgrading from db.t4g.medium if you see latency spikes during sync windows. [Temporal stability issue]
5. Stagger syncs — if you have multiple large S3 connections, avoid running them concurrently to reduce Temporal queue pressure.
The core fix is upgrading the S3 source connector to a version that includes the STATE throttle — this should dramatically reduce the platform instability you're seeing with large file-count streams. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Alasdair Ellis
10/15/2026, 2:24 PMkapa.ai
10/15/2026, 2:24 PMThrottledFileBasedStream in favour of the CDK's implementation) is explicitly marked as draft in the knowledge sources, pending CDK PR #1104. [CDK throttle PR]
However, the connector-local ThrottledFileBasedStream is a separate, earlier fix that is already present in the codebase at source_s3/v4/throttled_stream.py. [throttled_stream.py] The changelog entry that most clearly corresponds to this fix is:
> 4.15.6 — 2026-06-02 — Throttle per-slice state-message emission to once every 10 minutes to prevent the orchestrator's state buffer OOMing on streams with many files. Final state is force-emitted at end of stream so the destination always sees the latest cursor. [changelog]
What I Cannot Confirm The knowledge sources do not explicitly state which exact version first shipped the connector-local throttle (the changelog entries between your version 4.5.18 and 4.15.6 mostly just say "Update dependencies"). I cannot reliably trace the exact merge commit from the changelog alone.
Recommendation • 4.15.6 is the version where the throttle behaviour is explicitly documented in the changelog — upgrading to at least this version is the safest bet.
• You are currently on 4.5.18, which is well below this, so upgrading is strongly advisable regardless.
• I'd recommend checking the GitHub releases directly to confirm the exact first version if you need to pin a minimum version. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Alasdair Ellis
10/15/2026, 2:25 PMkapa.ai
10/15/2026, 2:25 PM4.15.6 is explicitly documented as the version that introduced the STATE emission throttle, and you are on 4.15.18, so the ThrottledFileBasedStream fix is already active in your deployment. [changelog]
What This Means for Your Issue The throttle limits STATE emission to once every 10 minutes and forces a final STATE at end of stream. [throttled_stream.py] So the raw volume of STATE messages should already be reduced significantly compared to pre-4.15.6 behaviour.
However, the throttle does not fix the underlying size of each STATE message — with 3 streams each carrying up to 10,000 file history entries, each individual STATE message can still be very large. The knowledge sources note this explicitly as a separate concern from message frequency. [GCS throttle PR]
What to Investigate Next Given you already have the throttle, the remaining likely culprits are:
1. History eviction causing re-reads — at 1,000 files/day across 3 streams, your 10,000-entry history cap per stream will be hit. Once full, the connector drops older entries and falls back to the Days to Sync if History is Full date window, potentially re-selecting a large band of files every sync. [S3 state docs] Tuning days_to_sync_if_history_is_full to a tighter value would help here.
2. Temporal workflow timeouts unrelated to STATE volume — the phantom attempts and airbyte-server spikes you're seeing may be a Temporal/platform-level issue rather than purely a connector issue at this point. The knowledge sources do not contain enough detail about your specific Temporal configuration to say more with confidence.
3. Airbyte platform version — you mention 1.8.5. I cannot confirm from the knowledge sources whether there are known Temporal stability fixes in later platform versions that would apply to your situation.
I'd recommend opening a GitHub issue or checking the Airbyte community Slack with your specific Temporal logs, as the remaining issue may be above the connector layer. 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.Alasdair Ellis
10/15/2026, 2:30 PMkapa.ai
10/15/2026, 2:30 PMFailure during reporting of activity result to the server.
ActivityType = JobSuccessWithAttemptNumber
WorkflowType = ConnectionManagerWorkflow
NOT_FOUND: invalid activityID or activity already timed out or invoking workflow is completed
This is a well-documented pattern in the knowledge sources. [forum post] [forum post]
What is happening:
1. The sync actually completes successfully — the JobSuccessWithAttemptNumber activity fires and the success notification is sent
2. However, by the time the activity tries to report its result back to Temporal, the workflow has already timed out or been marked completed from Temporal's perspective
3. Temporal returns NOT_FOUND — the activity result is orphaned
4. The ConnectionManagerWorkflow then re-runs the attempt because it never received the ACK, producing the phantom retry attempts you see in the UI
This matches the known bug described in the knowledge sources where ApiCommandBase.isTerminal has no FAILED branch, causing the polling loop to exit without properly signalling state, and ReplicationCommand.getOutput treats a null attemptSummary as success-shaped output. [GitHub issue]
The Core Problem The knowledge sources do not contain enough information to confirm whether this specific bug is fixed in platform version 1.8.5. The fix described in the knowledge sources was still being prepared as a draft PR at the time of writing. [GitHub issue]
What I'd Recommend • Check whether a newer platform version than 1.8.5 addresses this — the GitHub issue #72448 is the one to track
• The phantom attempts are cosmetic in the sense that the sync data is likely landing correctly, but the repeated airbyte-server spikes are a real concern if the workflow keeps re-queuing
• Raising this directly against that GitHub issue with your Temporal logs would be the most productive path, as the root cause trace in that issue closely matches what you're seeing 👍 0 button 👎 0 button ℹ️ Tip: Mention @kapa.ai in the thread for follow-ups or DM the app for 1-to-1 help.