From 2a209b364919831adb91f1ca2182b908d42540f3 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 3 Dec 2025 17:05:52 +0000 Subject: [PATCH 1/6] Begin removing void field shim --- tensorstore/driver/zarr3/chunk_cache.cc | 18 ++++++++++++------ tensorstore/driver/zarr3/chunk_cache.h | 14 ++++++++++---- tensorstore/driver/zarr3/driver.cc | 16 +++++++++------- tensorstore/driver/zarr3/metadata.cc | 18 ++++++++++++------ tensorstore/driver/zarr3/metadata.h | 6 ++++-- tensorstore/driver/zarr3/metadata_test.cc | 2 +- 6 files changed, 48 insertions(+), 26 deletions(-) diff --git a/tensorstore/driver/zarr3/chunk_cache.cc b/tensorstore/driver/zarr3/chunk_cache.cc index 64b6d69fd..9ca93554b 100644 --- a/tensorstore/driver/zarr3/chunk_cache.cc +++ b/tensorstore/driver/zarr3/chunk_cache.cc @@ -75,10 +75,12 @@ ZarrChunkCache::~ZarrChunkCache() = default; ZarrLeafChunkCache::ZarrLeafChunkCache( kvstore::DriverPtr store, ZarrCodecChain::PreparedState::Ptr codec_state, - ZarrDType dtype, internal::CachePool::WeakPtr /*data_cache_pool*/) + ZarrDType dtype, internal::CachePool::WeakPtr /*data_cache_pool*/, + bool open_as_void) : Base(std::move(store)), codec_state_(std::move(codec_state)), - dtype_(std::move(dtype)) {} + dtype_(std::move(dtype)), + open_as_void_(open_as_void) {} void ZarrLeafChunkCache::Read(ZarrChunkCache::ReadRequest request, AnyFlowReceiver chunk_indices, absl::InlinedVector, 1> field_arrays(num_fields); // Special case: void access - return raw bytes directly - if (num_fields == 1 && dtype_.fields[0].name == "") { + if (open_as_void_) { TENSORSTORE_ASSIGN_OR_RETURN( field_arrays[0], codec_state_->DecodeArray(grid().components[0].shape(), std::move(data))); @@ -221,11 +223,13 @@ kvstore::Driver* ZarrLeafChunkCache::GetKvStoreDriver() { ZarrShardedChunkCache::ZarrShardedChunkCache( kvstore::DriverPtr store, ZarrCodecChain::PreparedState::Ptr codec_state, - ZarrDType dtype, internal::CachePool::WeakPtr data_cache_pool) + ZarrDType dtype, internal::CachePool::WeakPtr data_cache_pool, + bool open_as_void) : base_kvstore_(std::move(store)), codec_state_(std::move(codec_state)), dtype_(std::move(dtype)), - data_cache_pool_(std::move(data_cache_pool)) {} + data_cache_pool_(std::move(data_cache_pool)), + open_as_void_(open_as_void) {} Result> TranslateCellToSourceTransformForShard( IndexTransform<> transform, span grid_cell_indices, @@ -517,6 +521,7 @@ void ZarrShardedChunkCache::Entry::DoInitialize() { cache.GetChunkStorageKeyParser().FormatKey(cell_indices()), cache.executor(), internal::CachePool::WeakPtr(cache.pool())); ZarrChunkCache* zarr_chunk_cache; + std::cout << "The cached value of open_as_void_ from line 524 in chunk_cache.cc is " << cache.open_as_void_ << std::endl; internal::GetCache( // `cache.pool()` is the metadata cache pool, which may or may not be // equal to the data cache pool. If the sub-chunk cache is a leaf cache @@ -534,11 +539,12 @@ void ZarrShardedChunkCache::Entry::DoInitialize() { *sharding_state.sub_chunk_codec_chain, std::move(sharding_kvstore), cache.executor(), ZarrShardingCodec::PreparedState::Ptr(&sharding_state), - cache.dtype_, cache.data_cache_pool_); + cache.dtype_, cache.data_cache_pool_, cache.open_as_void_); zarr_chunk_cache = new_cache.release(); return std::unique_ptr(&zarr_chunk_cache->cache()); }) .release(); + std::cout << "The cached value of open_as_void_ from line 547 in chunk_cache.cc is " << cache.open_as_void_ << std::endl; sub_chunk_cache = ZarrChunkCache::Ptr(zarr_chunk_cache, internal::adopt_object_ref); sub_chunk_cache->parent_chunk_ = this; diff --git a/tensorstore/driver/zarr3/chunk_cache.h b/tensorstore/driver/zarr3/chunk_cache.h index 5933115d7..a39eb1dc8 100644 --- a/tensorstore/driver/zarr3/chunk_cache.h +++ b/tensorstore/driver/zarr3/chunk_cache.h @@ -158,7 +158,8 @@ class ZarrLeafChunkCache : public internal::KvsBackedChunkCache, explicit ZarrLeafChunkCache(kvstore::DriverPtr store, ZarrCodecChain::PreparedState::Ptr codec_state, ZarrDType dtype, - internal::CachePool::WeakPtr data_cache_pool); + internal::CachePool::WeakPtr data_cache_pool, + bool open_as_void = false); void Read(ZarrChunkCache::ReadRequest request, AnyFlowReceiver( @@ -246,6 +249,7 @@ class ZarrShardedChunkCache : public internal::Cache, public ZarrChunkCache { kvstore::DriverPtr base_kvstore_; ZarrCodecChain::PreparedState::Ptr codec_state_; ZarrDType dtype_; + bool open_as_void_; // Data cache pool, if it differs from `this->pool()` (which is equal to the // metadata cache pool). @@ -260,11 +264,13 @@ class ZarrShardSubChunkCache : public ChunkCacheImpl { explicit ZarrShardSubChunkCache( kvstore::DriverPtr store, Executor executor, ZarrShardingCodec::PreparedState::Ptr sharding_state, - ZarrDType dtype, internal::CachePool::WeakPtr data_cache_pool) + ZarrDType dtype, internal::CachePool::WeakPtr data_cache_pool, + bool open_as_void = false) : ChunkCacheImpl(std::move(store), ZarrCodecChain::PreparedState::Ptr( sharding_state->sub_chunk_codec_state), - std::move(dtype), std::move(data_cache_pool)), + std::move(dtype), std::move(data_cache_pool), + open_as_void), sharding_state_(std::move(sharding_state)), executor_(std::move(executor)) {} diff --git a/tensorstore/driver/zarr3/driver.cc b/tensorstore/driver/zarr3/driver.cc index dd95c711b..03794f205 100644 --- a/tensorstore/driver/zarr3/driver.cc +++ b/tensorstore/driver/zarr3/driver.cc @@ -155,9 +155,11 @@ class ZarrDriverSpec jb::Validate( [](const auto& options, ZarrDriverSpec* obj) -> absl::Status { // At this point, Projection has already set obj->open_as_void - if (obj->open_as_void) { - obj->selected_field = ""; - } + // if (obj->open_as_void) { + // obj->selected_field = ""; + // } + std::cout << "I have the open_as_void flag present in my driver spec" << std::endl; + // obj->open_as_void = true; return absl::OkStatus(); }, jb::Projection<&ZarrDriverSpec::open_as_void>( @@ -626,9 +628,9 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { const void* metadata_ptr, size_t component_index) override { const auto& metadata = *static_cast(metadata_ptr); - // Check if this is void access by examining the cache's dtype - const bool is_void_access = (ChunkCacheImpl::dtype_.fields.size() == 1 && - ChunkCacheImpl::dtype_.fields[0].name == ""); + // Check if this is void access by examining the stored flag + const bool is_void_access = ChunkCacheImpl::open_as_void_; + std::cout << "The chunk cache impl value of open as void is " << is_void_access << std::endl; if (is_void_access) { // For void access, create transform with extra bytes dimension @@ -847,7 +849,7 @@ class ZarrDriver::OpenState : public ZarrDriver::OpenStateBase { ValidateMetadata(metadata, spec().metadata_constraints)); TENSORSTORE_ASSIGN_OR_RETURN( auto field_index, - GetFieldIndex(metadata.data_type, spec().selected_field)); + GetFieldIndex(metadata.data_type, spec().selected_field, spec().open_as_void)); // For void access, map to component index 0 if (field_index == kVoidFieldIndex) { field_index = 0; diff --git a/tensorstore/driver/zarr3/metadata.cc b/tensorstore/driver/zarr3/metadata.cc index 9aef7bd0b..617aba7c4 100644 --- a/tensorstore/driver/zarr3/metadata.cc +++ b/tensorstore/driver/zarr3/metadata.cc @@ -799,12 +799,16 @@ std::string GetFieldNames(const ZarrDType& dtype) { constexpr size_t kVoidFieldIndex = size_t(-1); Result GetFieldIndex(const ZarrDType& dtype, - std::string_view selected_field) { - // Special case: "" requests raw byte access (works for any dtype) - if (selected_field == "") { + std::string_view selected_field, + bool open_as_void) { + // Special case: open_as_void requests raw byte access (works for any dtype) + + std::cout << "The value of selected_field is '" << selected_field << "' and the value of open_as_void is `" << open_as_void << "'" << std::endl; + + if (open_as_void) { if (dtype.fields.empty()) { return absl::FailedPreconditionError( - "Requested field \"\" but dtype has no fields"); + "Requested void access but dtype has no fields"); } return kVoidFieldIndex; } @@ -1138,9 +1142,11 @@ absl::Status ValidateMetadataSchema(const ZarrMetadata& metadata, Result> GetNewMetadata( const ZarrMetadataConstraints& metadata_constraints, const Schema& schema, - std::string_view selected_field) { + std::string_view selected_field, bool open_as_void) { auto metadata = std::make_shared(); + std::cout << "The value of open as void from GetNewMetadata is " << open_as_void << std::endl; + metadata->zarr_format = metadata_constraints.zarr_format.value_or(3); metadata->chunk_key_encoding = metadata_constraints.chunk_key_encoding.value_or(ChunkKeyEncoding{ @@ -1165,7 +1171,7 @@ Result> GetNewMetadata( } TENSORSTORE_ASSIGN_OR_RETURN( - size_t field_index, GetFieldIndex(metadata->data_type, selected_field)); + size_t field_index, GetFieldIndex(metadata->data_type, selected_field, open_as_void)); SpecRankAndFieldInfo info; info.field = &metadata->data_type.fields[field_index]; info.chunked_rank = metadata_constraints.rank; diff --git a/tensorstore/driver/zarr3/metadata.h b/tensorstore/driver/zarr3/metadata.h index 4c7871b0d..857210546 100644 --- a/tensorstore/driver/zarr3/metadata.h +++ b/tensorstore/driver/zarr3/metadata.h @@ -230,12 +230,14 @@ absl::Status ValidateMetadataSchema(const ZarrMetadata& metadata, /// unspecified. Result> GetNewMetadata( const ZarrMetadataConstraints& metadata_constraints, - const Schema& schema, std::string_view selected_field = {}); + const Schema& schema, std::string_view selected_field = {}, + bool open_as_void = false); absl::Status ValidateDataType(DataType dtype); Result GetFieldIndex(const ZarrDType& dtype, - std::string_view selected_field); + std::string_view selected_field, + bool open_as_void = false); struct SpecRankAndFieldInfo { DimensionIndex chunked_rank = dynamic_rank; diff --git a/tensorstore/driver/zarr3/metadata_test.cc b/tensorstore/driver/zarr3/metadata_test.cc index 11c97619f..ba7a26593 100644 --- a/tensorstore/driver/zarr3/metadata_test.cc +++ b/tensorstore/driver/zarr3/metadata_test.cc @@ -438,7 +438,7 @@ Result> TestGetNewMetadata( TENSORSTORE_RETURN_IF_ERROR(status); TENSORSTORE_ASSIGN_OR_RETURN( auto constraints, ZarrMetadataConstraints::FromJson(constraints_json)); - return GetNewMetadata(constraints, schema); + return GetNewMetadata(constraints, schema, /*selected_field=*/{}, /*open_as_void=*/false); } TEST(GetNewMetadataTest, DuplicateDimensionNames) { From df37113c2b920e4297b80a0e7a03bc19df5bf82f Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 3 Dec 2025 18:52:41 +0000 Subject: [PATCH 2/6] Fully removed void string shim --- tensorstore/driver/zarr3/driver.cc | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/tensorstore/driver/zarr3/driver.cc b/tensorstore/driver/zarr3/driver.cc index 03794f205..4b151ee2d 100644 --- a/tensorstore/driver/zarr3/driver.cc +++ b/tensorstore/driver/zarr3/driver.cc @@ -594,10 +594,7 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { grid_(DataCacheBase::GetChunkGridSpecification( metadata(), // Check if this is void access by examining the dtype - (ChunkCacheImpl::dtype_.fields.size() == 1 && - ChunkCacheImpl::dtype_.fields[0].name == "") - ? kVoidFieldIndex - : 0)) {} + ChunkCacheImpl::open_as_void_ ? kVoidFieldIndex : 0)) {} const internal::LexicographicalGridIndexKeyParser& GetChunkStorageKeyParser() final { @@ -633,10 +630,12 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { std::cout << "The chunk cache impl value of open as void is " << is_void_access << std::endl; if (is_void_access) { + std::cout << "I am now in the external to internal block" << std::endl; // For void access, create transform with extra bytes dimension const DimensionIndex rank = metadata.rank; const Index bytes_per_element = metadata.data_type.bytes_per_outer_element; const DimensionIndex total_rank = rank + 1; + std::cout << "\t1" << std::endl; std::string_view normalized_dimension_names[kMaxRank]; for (DimensionIndex i = 0; i < rank; ++i) { @@ -644,6 +643,7 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { normalized_dimension_names[i] = *name; } } + std::cout << "\t2" << std::endl; auto builder = tensorstore::IndexTransformBuilder<>(total_rank, total_rank); @@ -651,16 +651,19 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { full_shape.push_back(bytes_per_element); builder.input_shape(full_shape); builder.input_labels(span(&normalized_dimension_names[0], total_rank)); + std::cout << "\t3" << std::endl; DimensionSet implicit_upper_bounds(false); for (DimensionIndex i = 0; i < rank; ++i) { implicit_upper_bounds[i] = true; } builder.implicit_upper_bounds(implicit_upper_bounds); + std::cout << "\t4" << std::endl; for (DimensionIndex i = 0; i < total_rank; ++i) { builder.output_single_input_dimension(i, i); } + std::cout << "\t5" << std::endl; return builder.Finalize(); } @@ -804,7 +807,7 @@ class ZarrDriver::OpenState : public ZarrDriver::OpenStateBase { TENSORSTORE_ASSIGN_OR_RETURN( auto metadata, internal_zarr3::GetNewMetadata(spec().metadata_constraints, - spec().schema), + spec().schema, spec().selected_field, spec().open_as_void), tensorstore::MaybeAnnotateStatus( _, "Cannot create using specified \"metadata\" and schema")); return metadata; @@ -821,15 +824,17 @@ class ZarrDriver::OpenState : public ZarrDriver::OpenStateBase { *static_cast(initializer.metadata.get()); // For void access, modify the dtype to indicate special handling ZarrDType dtype = metadata.data_type; - if (spec().selected_field == "") { + // if (spec().selected_field == "") { + if (spec().open_as_void) { + std::cout << "open_as_void was specified so I will create the 'synthetic' dtype" << std::endl; // Create a synthetic dtype for void access dtype = ZarrDType{ /*.has_fields=*/false, /*.fields=*/{ZarrDType::Field{ - ZarrDType::BaseDType{"", dtype_v, + ZarrDType::BaseDType{"", dtype_v, {metadata.data_type.bytes_per_outer_element}}, /*.outer_shape=*/{}, - /*.name=*/"", + /*.name=*/"", /*.field_shape=*/{metadata.data_type.bytes_per_outer_element}, /*.num_inner_elements=*/metadata.data_type.bytes_per_outer_element, /*.byte_offset=*/0, @@ -839,7 +844,8 @@ class ZarrDriver::OpenState : public ZarrDriver::OpenStateBase { return internal_zarr3::MakeZarrChunkCache( *metadata.codecs, std::move(initializer), spec().store.path, metadata.codec_state, dtype, - /*data_cache_pool=*/*cache_pool()); + /*data_cache_pool=*/*cache_pool(), + spec().open_as_void); } Result GetComponentIndex(const void* metadata_ptr, From 4372c7179568e872dfeca054e19bde5c5138ef37 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 3 Dec 2025 18:56:40 +0000 Subject: [PATCH 3/6] Cleanup debug prints --- tensorstore/driver/zarr3/chunk_cache.cc | 2 -- tensorstore/driver/zarr3/driver.cc | 17 +---------------- tensorstore/driver/zarr3/metadata.cc | 4 ---- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/tensorstore/driver/zarr3/chunk_cache.cc b/tensorstore/driver/zarr3/chunk_cache.cc index 9ca93554b..f14efd607 100644 --- a/tensorstore/driver/zarr3/chunk_cache.cc +++ b/tensorstore/driver/zarr3/chunk_cache.cc @@ -521,7 +521,6 @@ void ZarrShardedChunkCache::Entry::DoInitialize() { cache.GetChunkStorageKeyParser().FormatKey(cell_indices()), cache.executor(), internal::CachePool::WeakPtr(cache.pool())); ZarrChunkCache* zarr_chunk_cache; - std::cout << "The cached value of open_as_void_ from line 524 in chunk_cache.cc is " << cache.open_as_void_ << std::endl; internal::GetCache( // `cache.pool()` is the metadata cache pool, which may or may not be // equal to the data cache pool. If the sub-chunk cache is a leaf cache @@ -544,7 +543,6 @@ void ZarrShardedChunkCache::Entry::DoInitialize() { return std::unique_ptr(&zarr_chunk_cache->cache()); }) .release(); - std::cout << "The cached value of open_as_void_ from line 547 in chunk_cache.cc is " << cache.open_as_void_ << std::endl; sub_chunk_cache = ZarrChunkCache::Ptr(zarr_chunk_cache, internal::adopt_object_ref); sub_chunk_cache->parent_chunk_ = this; diff --git a/tensorstore/driver/zarr3/driver.cc b/tensorstore/driver/zarr3/driver.cc index 4b151ee2d..08b5783ee 100644 --- a/tensorstore/driver/zarr3/driver.cc +++ b/tensorstore/driver/zarr3/driver.cc @@ -154,13 +154,7 @@ class ZarrDriverSpec jb::Member("open_as_void", jb::Validate( [](const auto& options, ZarrDriverSpec* obj) -> absl::Status { - // At this point, Projection has already set obj->open_as_void - // if (obj->open_as_void) { - // obj->selected_field = ""; - // } - std::cout << "I have the open_as_void flag present in my driver spec" << std::endl; - // obj->open_as_void = true; - return absl::OkStatus(); + return absl::OkStatus(); // TODO: Remove the validation from here. This was part of the void field shim. }, jb::Projection<&ZarrDriverSpec::open_as_void>( jb::DefaultValue( @@ -627,15 +621,12 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { // Check if this is void access by examining the stored flag const bool is_void_access = ChunkCacheImpl::open_as_void_; - std::cout << "The chunk cache impl value of open as void is " << is_void_access << std::endl; if (is_void_access) { - std::cout << "I am now in the external to internal block" << std::endl; // For void access, create transform with extra bytes dimension const DimensionIndex rank = metadata.rank; const Index bytes_per_element = metadata.data_type.bytes_per_outer_element; const DimensionIndex total_rank = rank + 1; - std::cout << "\t1" << std::endl; std::string_view normalized_dimension_names[kMaxRank]; for (DimensionIndex i = 0; i < rank; ++i) { @@ -643,7 +634,6 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { normalized_dimension_names[i] = *name; } } - std::cout << "\t2" << std::endl; auto builder = tensorstore::IndexTransformBuilder<>(total_rank, total_rank); @@ -651,19 +641,16 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { full_shape.push_back(bytes_per_element); builder.input_shape(full_shape); builder.input_labels(span(&normalized_dimension_names[0], total_rank)); - std::cout << "\t3" << std::endl; DimensionSet implicit_upper_bounds(false); for (DimensionIndex i = 0; i < rank; ++i) { implicit_upper_bounds[i] = true; } builder.implicit_upper_bounds(implicit_upper_bounds); - std::cout << "\t4" << std::endl; for (DimensionIndex i = 0; i < total_rank; ++i) { builder.output_single_input_dimension(i, i); } - std::cout << "\t5" << std::endl; return builder.Finalize(); } @@ -824,9 +811,7 @@ class ZarrDriver::OpenState : public ZarrDriver::OpenStateBase { *static_cast(initializer.metadata.get()); // For void access, modify the dtype to indicate special handling ZarrDType dtype = metadata.data_type; - // if (spec().selected_field == "") { if (spec().open_as_void) { - std::cout << "open_as_void was specified so I will create the 'synthetic' dtype" << std::endl; // Create a synthetic dtype for void access dtype = ZarrDType{ /*.has_fields=*/false, diff --git a/tensorstore/driver/zarr3/metadata.cc b/tensorstore/driver/zarr3/metadata.cc index 617aba7c4..ba4454de4 100644 --- a/tensorstore/driver/zarr3/metadata.cc +++ b/tensorstore/driver/zarr3/metadata.cc @@ -803,8 +803,6 @@ Result GetFieldIndex(const ZarrDType& dtype, bool open_as_void) { // Special case: open_as_void requests raw byte access (works for any dtype) - std::cout << "The value of selected_field is '" << selected_field << "' and the value of open_as_void is `" << open_as_void << "'" << std::endl; - if (open_as_void) { if (dtype.fields.empty()) { return absl::FailedPreconditionError( @@ -1145,8 +1143,6 @@ Result> GetNewMetadata( std::string_view selected_field, bool open_as_void) { auto metadata = std::make_shared(); - std::cout << "The value of open as void from GetNewMetadata is " << open_as_void << std::endl; - metadata->zarr_format = metadata_constraints.zarr_format.value_or(3); metadata->chunk_key_encoding = metadata_constraints.chunk_key_encoding.value_or(ChunkKeyEncoding{ From dc137d9a1c646d32bb41f892078abf0cab134332 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 3 Dec 2025 19:01:41 +0000 Subject: [PATCH 4/6] Remove shimmed validation --- tensorstore/driver/zarr3/driver.cc | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tensorstore/driver/zarr3/driver.cc b/tensorstore/driver/zarr3/driver.cc index 08b5783ee..424ad367c 100644 --- a/tensorstore/driver/zarr3/driver.cc +++ b/tensorstore/driver/zarr3/driver.cc @@ -151,14 +151,9 @@ class ZarrDriverSpec [](auto* obj) { *obj = std::string{}; }))), // NEW: wrap the open_as_void projection in a Validate - jb::Member("open_as_void", - jb::Validate( - [](const auto& options, ZarrDriverSpec* obj) -> absl::Status { - return absl::OkStatus(); // TODO: Remove the validation from here. This was part of the void field shim. - }, - jb::Projection<&ZarrDriverSpec::open_as_void>( + jb::Member("open_as_void", jb::Projection<&ZarrDriverSpec::open_as_void>( jb::DefaultValue( - [](auto* v) { *v = false; }))))); + [](auto* v) { *v = false; })))); From 3cad1ec4ff5b407b602534c382f24eaa3c2f7248 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 3 Dec 2025 19:02:44 +0000 Subject: [PATCH 5/6] Remove unnecessary comment --- tensorstore/driver/zarr3/driver.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/tensorstore/driver/zarr3/driver.cc b/tensorstore/driver/zarr3/driver.cc index 424ad367c..eeb1c53d9 100644 --- a/tensorstore/driver/zarr3/driver.cc +++ b/tensorstore/driver/zarr3/driver.cc @@ -149,8 +149,6 @@ class ZarrDriverSpec jb::Member("field", jb::Projection<&ZarrDriverSpec::selected_field>( jb::DefaultValue( [](auto* obj) { *obj = std::string{}; }))), - - // NEW: wrap the open_as_void projection in a Validate jb::Member("open_as_void", jb::Projection<&ZarrDriverSpec::open_as_void>( jb::DefaultValue( [](auto* v) { *v = false; })))); From 179a6702f598982d70553206c6f300be146d2f75 Mon Sep 17 00:00:00 2001 From: BrianMichell Date: Wed, 3 Dec 2025 19:04:48 +0000 Subject: [PATCH 6/6] Prefer false over zero for ternary clarity --- tensorstore/driver/zarr3/driver.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tensorstore/driver/zarr3/driver.cc b/tensorstore/driver/zarr3/driver.cc index eeb1c53d9..f4c0ad9d7 100644 --- a/tensorstore/driver/zarr3/driver.cc +++ b/tensorstore/driver/zarr3/driver.cc @@ -581,7 +581,7 @@ class ZarrDataCache : public ChunkCacheImpl, public DataCacheBase { grid_(DataCacheBase::GetChunkGridSpecification( metadata(), // Check if this is void access by examining the dtype - ChunkCacheImpl::open_as_void_ ? kVoidFieldIndex : 0)) {} + ChunkCacheImpl::open_as_void_ ? kVoidFieldIndex : false)) {} const internal::LexicographicalGridIndexKeyParser& GetChunkStorageKeyParser() final {