Skip to content

Native Iceberg write panics generating the partition path for a timestamptz partition column #5694

Description

@andygrove

Describe the bug

Writing to a table partitioned on a timestamptz column panics in iceberg-rust while generating the data file's partition path:

org.apache.comet.CometNativeException: called `Option::unwrap()` on a `None` value
    at core::option::unwrap_failed
    at iceberg::spec::values::temporal::timestamptz::microseconds_to_datetimetz
    at <iceberg::spec::values::datum::Datum as core::fmt::Display>::fmt
    at <iceberg::spec::values::datum::Datum>::to_human_string
    at <iceberg::spec::transform::Transform>::to_human_string
    at <iceberg::spec::partition::PartitionSpec>::partition_to_path::{closure#0}
    at <iceberg::spec::partition::PartitionSpec>::partition_to_path
    at <...DefaultLocationGenerator as ...LocationGenerator>::generate_location
    at <...RollingFileWriter<ParquetWriterBuilder, DefaultLocationGenerator, ...>>

microseconds_to_datetimetz unwraps a None when converting the partition value to its human-readable form for the directory name, so the task dies with a Rust panic crossing the JNI boundary rather than an error.

Steps to reproduce

Spark 4.1.3, Iceberg 1.11.0, spark.comet.iceberg.write.enabled=true plus the Iceberg Spark SQL test setup from dev/diffs/iceberg/1.11.0.diff:

./gradlew -DsparkVersions=4.1 -DscalaVersion=2.13 -DflinkVersions= -DkafkaVersions= \
  :iceberg-spark:iceberg-spark-4.1_2.13:test --tests '*TestSparkDataFile*' -Pquick=true -x javadoc

Failing cases:

  • TestSparkDataFile.testValueConversionPartitionedTable
  • TestSparkDataFile.testValueConversionWithEmptyStats

Both write to a table whose partition spec covers a wide set of column types, including timestamptz.

Expected behavior

The partition path is generated for timestamptz partition values the same way iceberg-java generates it, and the write succeeds. Any value the conversion genuinely cannot represent produces an error rather than a panic.

Additional context

Found by turning the two Iceberg write flags on by default in #5677.

The panic is in iceberg-rust rather than in Comet's own code, so the fix may need to go upstream. Worth checking whether the value reaching microseconds_to_datetimetz is itself wrong (a unit or epoch mismatch on the way in) before concluding the conversion is at fault.

Part of #5649.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions