Hassan Ait Brik
04/13/2026, 8:10 AMorg.apache.pinot.spi.utils.retry.RetriableOperationException:
org.apache.pinot.common.exception.HttpErrorStatusException:
Got error status code: 400 (Bad Request) with reason: ""
while sending request:
/segments?enableParallelPushProtection=true&tableName=success_board&tableType=REALTIME
at org.apache.pinot.spi.utils.retry.BaseRetryPolicy.attempt(BaseRetryPolicy.java:63)
at org.apache.pinot.plugin.minion.tasks.SegmentConversionUtils.uploadSegment(SegmentConversionUtils.java:140)
at org.apache.pinot.plugin.minion.tasks.BaseMultipleSegmentsConversionExecutor.pushSegment(BaseMultipleSegmentsConversionExecutor.java:538)
at org.apache.pinot.plugin.minion.tasks.BaseMultipleSegmentsConversionExecutor.executeTask(BaseMultipleSegmentsConversionExecutor.java:316)
at org.apache.pinot.plugin.minion.tasks.BaseMultipleSegmentsConversionExecutor.executeTask(BaseMultipleSegmentsConversionExecutor.java:84)
This looks similar to another UpsertCompactMergeTask failure I had before:
• task generation succeeds
• source segments seem valid
• failure happens when uploading the merged segment back to the controller
• the request includes enableParallelPushProtection=true
Questions:
1. What are the common reasons for the controller to return 400 Bad Request on /segments?enableParallelPushProtection=true... for UpsertCompactMergeTask ?
2. Does this usually indicate:
• parallel push conflict,
• segment lineage changed while the task was running,
• or another controller-side validation failure ?
3. Is there a recommended way to debug the exact controller-side reason when the response body is empty ?
4. Are there recommended limits for maxNumSegmentsPerTask / maxNumRecordsPerTask to reduce the chance of this happening?
Thanks!Subbu Subramaniam
04/13/2026, 1:46 PMHassan Ait Brik
04/13/2026, 1:54 PMMathieu Alexandre
04/13/2026, 1:56 PM2026/04/13 13:29:39.811 WARN [TablesResource] [grizzly-http-server-8] Found that validDocIds is missing for segments [our_table__8__26__20230605T0837Z,...]
while processing validDocIdsMetadata for table our_table_REALTIME while reading the validDocIds with validDocIdType SNAPSHOT.Hassan Ait Brik
04/13/2026, 2:31 PM"task": {
"taskTypeConfigsMap": {
"UpsertCompactMergeTask": {
"schedule": "0 0 * ? * *",
"bufferTimePeriod": "0d",
"maxNumRecordsPerSegment": "5000000",
"maxNumRecordsPerTask": "20000000",
"maxNumSegmentsPerTask": "300",
"outputSegmentMaxSize": "200MB",
"numSegmentsBatchPerServerRequest": "500"
}
}
},
"upsertConfig": {
"consistencyMode": "NONE",
"allowPartialUpsertConsumptionDuringCommit": false,
"snapshot": "ENABLE",
"mode": "FULL",
"hashFunction": "NONE",
"defaultPartialUpsertStrategy": "OVERWRITE",
"dropOutOfOrderRecord": false,
"preload": "DEFAULT",
"metadataTTL": 0,
"deletedKeysTTL": 0,
"enableDeletedKeysCompactionConsistency": false,
"upsertViewRefreshIntervalMs": 3000,
"newSegmentTrackingTimeMs": 10000,
"enableSnapshot": true,
"enablePreload": false
},
Controller with
controller.task.scheduler.enabled=trueHassan Ait Brik
04/13/2026, 4:05 PMHassan Ait Brik
04/13/2026, 4:08 PMHassan Ait Brik
04/13/2026, 4:09 PMSubbu Subramaniam
04/13/2026, 6:35 PMgrizzly-http-server-8 (this is the thread that processed the rest request to the controller at the time), then start looking around the source code in controller. start with the TableResource class.Hassan Ait Brik
04/15/2026, 2:19 PM