Supported configurations at a glance
Operational procedures
Reloading or force-committing a partial-upsert table
Before reloading segments or force-committing on a partial-upsert table, set the following cluster config:This setting takes effect immediately — no server restart is required. It is applied at the next segment commit. Never set this mode to
UNSAFE.PROTECTED mode is planned to become the default in an upcoming release.
Rebalancing a partial-upsert or dedup table
Pause ingestion before rebalancing, and resume it after the rebalance completes. Rebalancing while consuming can cause per-key state to diverge across the moved replicas.Migrating or cloning a live upsert table
1
Pause the Segment Refresh Task on the source table
A refresh run that overlaps the copy can replace segments mid-migration, leaving the clone with missing rows.
2
Perform the migration or clone
Copy the table using your normal procedure.
3
Compare row counts between source and destination
Verify total row counts (and per-partition counts for large tables) match before resuming tasks and cutting traffic over.
Running SegmentRefreshTask alongside FileIngestionTask
If a table runs both tasks, exclude file-ingested segments from refresh runs by adding a segment selector to theSegmentRefreshTask config:
Protections that are on by default
These behaviors are active without appearing in your table config:In-order consumption enforcement (enforceConsumptionInOrder)
Since release 0.15, partial-upsert, dedup, and dropOutOfOrderRecord tables enforce in-order consumption automatically, which improves data correctness. You can confirm it is active by looking for ConsumerCoordinator entries in server logs.
Snapshot tasks
UpsertSnapshotCreationTask and DedupSnapshotCreationTask run automatically every 12 hours for upsert and dedup tables (since release 0.10). On releases before 0.15, any table-config update permanently cancelled this default schedule — if snapshots stopped after a config change on an older release, re-apply the schedule or upgrade.
Troubleshooting
Segment Refresh Task or compaction task keeps failing
Recent releases add safety guards that fail a task rather than risk data corruption. Mitigation:- Set cluster config
pinot.server.consuming.segment.consistency.mode: PROTECTED - Set table config
parallelSegmentConsumptionPolicy: DISALLOW_ALWAYS
Wrong or flip-flopping query results
Alternating results between runs of the same query usually means replicas have diverged.Stale derived column after a partial-upsert merge
If a derived column shows a stale value after partial-upsert merges, compute the value in the query (from the source columns) as a workaround while a fix is in progress.Roadmap
An upcoming release converts the “not supported” items above into hard blocks at table-creation/config time, and makesPROTECTED consistency mode the default. Longer term, a simplified upsert data model is planned that reduces configuration surface and removes most of these exceptions.
