You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Row format MessagePack writes to /api/v1/write/msgpack are accepted with HTTP 204 but silently dropped during buffer flush. Arc logs Failed to flush aged buffer error=\"no time data in batch\" and no Parquet files are written. Data is lost.
Columnar format writes to the same endpoint work correctly end-to-end.
SHOW TABLES FROM default returns empty. No Parquet files exist on disk.
Arc logs
INF arrow_writer.go:1597 > Flushing aged buffer age=6699.66 buffer_key=default/row_test component=arrow-buffer shard=3
ERR arrow_writer.go:1607 > Failed to flush aged buffer error=\"no time data in batch\" buffer_key=default/row_test component=arrow-buffer
ERR duckdb.go:234 > Query failed error=\"IO Error: No files found that match the pattern /app/data/arc/default/row_test/**/*.parquet\"
Tested payload shapes (all fail)
Tested all four variants, all return 204 but get dropped with the same error:
Single bare row map: {\"m\": \"...\", \"t\": ..., \"fields\": {...}}
Array of 1 row: [{\"m\": \"...\", \"t\": ..., \"fields\": {...}}]
Array of 2 rows: [row1, row2]
Batch wrapper: {\"batch\": [row1, row2]}
All use valid int64 microsecond timestamps in the t field.
Root cause investigation
The error no time data in batch comes from internal/ingest/arrow_writer.go:2104:
decodeRow returns *models.Record with Time: time.Time set, Timestamp: 0
Write() groups row records by measurement (arrow_writer.go:1177-1197)
rowsToColumnar() converts to ColumnarRecord with columns[\"time\"] = append(columns[\"time\"], timestamp) where timestamp is int64 microseconds (arrow_writer.go:1118)
writeColumnar() calls convertColumnsToTyped() which should produce typed[\"time\"] = []int64{...}
On flush, merged.Data[\"time\"] is either missing or not []int64, triggering the error
Something between step 3 and step 5 is either dropping the time column or producing the wrong type. The columnar path works because it skips rowsToColumnar entirely and constructs the columns directly from the decoded payload.
Impact
Silent data loss for any client using row format
x_benthos_extra tests, Telegraf when row format is selected, and any other integration using row-format msgpack are all affected
Summary
Row format MessagePack writes to
/api/v1/write/msgpackare accepted with HTTP 204 but silently dropped during buffer flush. Arc logsFailed to flush aged buffer error=\"no time data in batch\"and no Parquet files are written. Data is lost.Columnar format writes to the same endpoint work correctly end-to-end.
Reproduction
Start Arc:
Send a row format payload (any shape works: single bare map, array of rows, or
{\"batch\": [...]}wrapper):Output:
Wait ~6 seconds (MaxBufferAgeMS default 5000ms), then query:
Result:
{\"success\":false,\"error\":\"Query execution failed\",\"row_count\":0}SHOW TABLES FROM defaultreturns empty. No Parquet files exist on disk.Arc logs
Tested payload shapes (all fail)
Tested all four variants, all return 204 but get dropped with the same error:
{\"m\": \"...\", \"t\": ..., \"fields\": {...}}[{\"m\": \"...\", \"t\": ..., \"fields\": {...}}][row1, row2]{\"batch\": [row1, row2]}All use valid int64 microsecond timestamps in the
tfield.Root cause investigation
The error
no time data in batchcomes frominternal/ingest/arrow_writer.go:2104:The flow for row format:
decodeRowreturns*models.RecordwithTime: time.Timeset,Timestamp: 0Write()groups row records by measurement (arrow_writer.go:1177-1197)rowsToColumnar()converts toColumnarRecordwithcolumns[\"time\"] = append(columns[\"time\"], timestamp)where timestamp is int64 microseconds (arrow_writer.go:1118)writeColumnar()callsconvertColumnsToTyped()which should producetyped[\"time\"] = []int64{...}merged.Data[\"time\"]is either missing or not[]int64, triggering the errorSomething between step 3 and step 5 is either dropping the time column or producing the wrong type. The columnar path works because it skips
rowsToColumnarentirely and constructs the columns directly from the decoded payload.Impact
x_benthos_extratests, Telegraf when row format is selected, and any other integration using row-format msgpack are all affectedEnvironment
ghcr.io/basekick-labs/arc:latestas of 2026-04-14)Suggested next steps
rowsToColumnarandconvertColumnsToTypedto trace what happens to the time columnArrowBuffer.Write()level that sends row records and asserts the Parquet file is produced