Add Salesforce upsert sink
Implemented the first Salesforce sink slice in SeaTunnel's existing connector, with external-ID upserts, bounded batching, per-record result inspection, transient retries, checkpoint flushing, and typed row serialization.
apache/seatunnel · #12245
Enterprise connector feature
SeaTunnel can now upsert ordered, checkpoint-aware batches into Salesforce objects through the REST sObject Collections API.
Problem
SeaTunnel could read Salesforce data but could not write records back through a supported sink. A production path needed to respect API count and byte limits, detect partial record failures, preserve repeated-key order, recover a session safely, and surface checkpoint flush failures.
Approach
Adds an external-ID-based sObject Collections writer with `allOrNone` response validation, bounded retry and one session refresh, count and UTF-8 byte batching, and flushes on limits, checkpoints, engine callbacks, and normal close. Parsed configuration masks Salesforce secrets.
Impact and scope
- Completes a bidirectional Salesforce integration path for incremental synchronization and enterprise data workflows.
- Prevents silent partial success by inspecting every Salesforce result and failing the batch when any record is rejected or malformed.
- Coordinates delivery with SeaTunnel checkpoints while documenting at-least-once replay and downstream trigger implications.
Validation
- All 67 connector tests passed on Java 8 and Java 11, with seven shared configuration tests passing on Java 11.
- Eight Docker E2E cases passed across Zeta, Flink 1.18, Flink 1.20, and Spark 3.3, covering successful upserts, final-batch flushing, and record-error job failure.
- A SeaTunnel maintainer approved the feature with explicit recognition; final checks passed and the GitHub-verified merge commit credits Goutam Adwant. Tests used MockServer rather than a live Salesforce organization, and GH-10753 remains open as the connector umbrella.