icechunk 1.1.16__tar.gz → 1.1.18__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. {icechunk-1.1.16 → icechunk-1.1.18}/PKG-INFO +1 -1
  2. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/Cargo.toml +3 -2
  3. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/change_set.rs +29 -1
  4. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/config.rs +88 -5
  5. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/session.rs +3 -2
  6. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/s3.rs +15 -3
  7. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/Cargo.toml +2 -2
  8. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_config.py +33 -0
  9. {icechunk-1.1.16 → icechunk-1.1.18}/LICENSE +0 -0
  10. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/examples/low_level_dataset.rs +0 -0
  11. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/examples/multithreaded_get_chunk_refs.rs +0 -0
  12. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/examples/multithreaded_store.rs +0 -0
  13. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/all.fbs +0 -0
  14. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/manifest.fbs +0 -0
  15. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/object_ids.fbs +0 -0
  16. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/snapshot.fbs +0 -0
  17. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/transaction_log.fbs +0 -0
  18. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/dataset.txt +0 -0
  19. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/format/manifest.txt +0 -0
  20. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/manifest.txt +0 -0
  21. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/session.txt +0 -0
  22. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/storage/mod.txt +0 -0
  23. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/storage/s3.txt +0 -0
  24. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/storage/virtual_ref.txt +0 -0
  25. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/asset_manager.rs +0 -0
  26. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/bin/icechunk/main.rs +0 -0
  27. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/cli/config.rs +0 -0
  28. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/cli/interface.rs +0 -0
  29. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/cli/mod.rs +0 -0
  30. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/conflicts/basic_solver.rs +0 -0
  31. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/conflicts/detector.rs +0 -0
  32. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/conflicts/mod.rs +0 -0
  33. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/error.rs +0 -0
  34. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/attributes.rs +0 -0
  35. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/flatbuffers/all_generated.rs +0 -0
  36. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/manifest.rs +0 -0
  37. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/mod.rs +0 -0
  38. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/serializers/mod.rs +0 -0
  39. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/snapshot.rs +0 -0
  40. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/transaction_log.rs +0 -0
  41. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/inspect.rs +0 -0
  42. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/lib.rs +0 -0
  43. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/gc.rs +0 -0
  44. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/manifests.rs +0 -0
  45. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/mod.rs +0 -0
  46. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/stats.rs +0 -0
  47. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/refs.rs +0 -0
  48. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/repository.rs +0 -0
  49. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/logging.rs +0 -0
  50. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/mod.rs +0 -0
  51. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/object_store.rs +0 -0
  52. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/store.rs +0 -0
  53. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/strategies.rs +0 -0
  54. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/stream_utils.rs +0 -0
  55. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/virtual_chunks.rs +0 -0
  56. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/common/mod.rs +0 -0
  57. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_concurrency.rs +0 -0
  58. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_distributed_writes.rs +0 -0
  59. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_gc.rs +0 -0
  60. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_large_manifests.rs +0 -0
  61. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_stats.rs +0 -0
  62. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_storage.rs +0 -0
  63. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_virtual_refs.rs +0 -0
  64. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-macros/Cargo.toml +0 -0
  65. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-macros/src/lib.rs +0 -0
  66. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/.gitignore +0 -0
  67. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/Cargo.lock +0 -0
  68. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/LICENSE +0 -0
  69. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/__init__.py +0 -0
  70. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/coiled_runner.py +0 -0
  71. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/conftest.py +0 -0
  72. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/create_era5.py +0 -0
  73. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/datasets.py +0 -0
  74. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/envs/icechunk-alpha-12.txt +0 -0
  75. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/envs/icechunk-alpha-release.txt +0 -0
  76. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/helpers.py +0 -0
  77. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/lib.py +0 -0
  78. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/most_recent.sh +0 -0
  79. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/pytest.ini +0 -0
  80. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/runner.py +0 -0
  81. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/tasks.py +0 -0
  82. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/test_benchmark_reads.py +0 -0
  83. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/test_benchmark_writes.py +0 -0
  84. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/bank_accounts.py +0 -0
  85. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/dask_write.py +0 -0
  86. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/high_concurrency.py +0 -0
  87. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/mpwrite.py +0 -0
  88. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/run_in_ci.sh +0 -0
  89. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/integration_tests/test_r2.py +0 -0
  90. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/__init__.py +0 -0
  91. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/_icechunk_python.pyi +0 -0
  92. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/credentials.py +0 -0
  93. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/dask.py +0 -0
  94. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/distributed.py +0 -0
  95. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/py.typed +0 -0
  96. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/repository.py +0 -0
  97. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/session.py +0 -0
  98. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/storage.py +0 -0
  99. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/store.py +0 -0
  100. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/testing/strategies.py +0 -0
  101. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/vendor/__init__.py +0 -0
  102. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/vendor/xarray.py +0 -0
  103. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/xarray.py +0 -0
  104. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/scripts/check_xarray_docs_sync.py +0 -0
  105. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/scripts/known-xarray-doc-diffs.json +0 -0
  106. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/config.rs +0 -0
  107. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/conflicts.rs +0 -0
  108. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/errors.rs +0 -0
  109. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/lib.rs +0 -0
  110. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/pickle.rs +0 -0
  111. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/repository.rs +0 -0
  112. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/session.rs +0 -0
  113. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/stats.rs +0 -0
  114. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/store.rs +0 -0
  115. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/streams.rs +0 -0
  116. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/__init__.py +0 -0
  117. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/conftest.py +0 -0
  118. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/28H289BT7JSZKZ6W5F70 +0 -0
  119. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/29CS30CK3D3CFVFBEZ80 +0 -0
  120. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/39KTEACWZDMQ42C0TK5G +0 -0
  121. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/3CQH7MY9P8QFNE5TWMZ0 +0 -0
  122. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/3JWEBSQZ1AQT9RK46JHG +0 -0
  123. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/4DCZD8GC46090M65S46G +0 -0
  124. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/4KXQX71CPA8ASE25X02G +0 -0
  125. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/5M551EG8VHX6GK2RVYEG +0 -0
  126. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/8Y59PE3EQ1NHY32W80PG +0 -0
  127. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/9JSXG2S6R7JW530266FG +0 -0
  128. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/9Q4DF3ZK93B35EW1Q0W0 +0 -0
  129. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/A14DFW1AMR9GJY82B480 +0 -0
  130. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/C43XA0532YJN8FFJQSV0 +0 -0
  131. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/DB0FK4TGE2CYP5N5H5MG +0 -0
  132. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/DN7QKGTXF72JRSP1R59G +0 -0
  133. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/E06NN106F0RD1DKC57B0 +0 -0
  134. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/E88W8NWPPQ0DDP6MAQE0 +0 -0
  135. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/EDKREXA5PA5KMVMYT1T0 +0 -0
  136. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/EMXV4G2NH651YQHCN5SG +0 -0
  137. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/F2FF589RGM5TQPJ4XS30 +0 -0
  138. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/FX2THCNDEF1TPJVVW6CG +0 -0
  139. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/GD7FA0K8HRGV0XK609W0 +0 -0
  140. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/HNW4TH4RRN5ECR7PH4Z0 +0 -0
  141. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/JH2K5GX77HJWDR3BRHN0 +0 -0
  142. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/KYA9AWYNRNH4KDN3YS1G +0 -0
  143. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/MHYQZGW0T34H7566ND30 +0 -0
  144. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/MJC2EWJ8DTBA7P46REFG +0 -0
  145. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/N4EXVBQKBGCMTXX6PEJ0 +0 -0
  146. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/P6C9986C6R2P9EP30XCG +0 -0
  147. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/P9JDEJ02DTDBGJDASRB0 +0 -0
  148. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/PAMW4ZQ7FVP7E1AZR2W0 +0 -0
  149. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/PZ5F8FQKKA144F08ANG0 +0 -0
  150. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/QDZDYMBSPJ4M0T34BEPG +0 -0
  151. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/QEDGZDXTPJEX179WCT6G +0 -0
  152. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/RQM2HG8XAD9KP8S2TRKG +0 -0
  153. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/T394Y31WDT1VCVFY3A80 +0 -0
  154. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/TXZ35HQMB7RHFJKRNXZG +0 -0
  155. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/V66JMMKW77DCFEGRVSK0 +0 -0
  156. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/VGFD4TNTAETR77B9RK8G +0 -0
  157. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/VJM5MNFQ7KQ7ERCWFNT0 +0 -0
  158. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/W4G0HS519TZDQBDAD01G +0 -0
  159. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/XZAFNSMV272D9X70HC50 +0 -0
  160. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YFGVD91WZJM9FKAB4PQG +0 -0
  161. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YGWDY7HYDBVBPKSJYK40 +0 -0
  162. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YQ0KA7YQ737KNCT5F0BG +0 -0
  163. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YRS4NW2FJM8P66MCF8E0 +0 -0
  164. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YWQDK4GG3H7JF189CN6G +0 -0
  165. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/Z50RSERZRJZNTFRPDW80 +0 -0
  166. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/config.yaml +0 -0
  167. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/15KJFGXKPM1KRGFZ52D0 +0 -0
  168. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/19KPV7V2275XRM01YAWG +0 -0
  169. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/2PQ1EA39NB2VK7QK688G +0 -0
  170. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/3QYVB4AX7J2XF0QAEX1G +0 -0
  171. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/62CS3ENEZP4MJHPAW12G +0 -0
  172. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/7V2NE5Q4H7SN9QF0ZHJ0 +0 -0
  173. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/7WT30WPG1HF0P2QXGV6G +0 -0
  174. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/88Z1G93EH4VF9X28BBHG +0 -0
  175. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/AAJX4KKQQH72RK949AA0 +0 -0
  176. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/B81H9ZEGPV7E15CWXA10 +0 -0
  177. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/CZMYYDSX2SX36J47WN9G +0 -0
  178. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/D5CVGKP2G5DP6C277YAG +0 -0
  179. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/D6QG80A0HJW564ZXRBRG +0 -0
  180. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/DDPY0EEPKZXW1ACW41HG +0 -0
  181. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/DNTQPT8BPWQJ1N2K3KN0 +0 -0
  182. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/EN0XHAX4APG96CNX1PF0 +0 -0
  183. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/F22E2GTDKW73XFV884JG +0 -0
  184. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/FM7YJ4BBE12X6CE0T4AG +0 -0
  185. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/HB9W7VCB4QA786S2XJBG +0 -0
  186. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/J3ZNDGTGA4AY29S8SJVG +0 -0
  187. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/KCR2FSZ5WFVV39SRQWB0 +0 -0
  188. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/MZG15YADGEG849HP3DPG +0 -0
  189. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/NGW2FB9H515MEMPRJCNG +0 -0
  190. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/NYEQXA5QV0780CE19HFG +0 -0
  191. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/PZCTNRCT17DDAH1Q8B00 +0 -0
  192. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/Q8WDWGQ0T78AEXKHRV40 +0 -0
  193. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/QDR73V4TZ4M6CW1PNPSG +0 -0
  194. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/QYDWRAXGKCFNV0645F80 +0 -0
  195. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/RF0DB8QD7R68HNHPAXVG +0 -0
  196. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/RNXAWAZHFV0CDV8JJVBG +0 -0
  197. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/RVXQ0DMYANQPV6X32690 +0 -0
  198. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/TTSZ8VYDX0Y7PB6A13H0 +0 -0
  199. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/WS2BZ61Q1V564ZG6GSJG +0 -0
  200. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/XXCGBC5VMRPB89PFMFGG +0 -0
  201. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/ZEQVP57D4FWAZJ0BJV6G +0 -0
  202. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/refs/branch.main/ref.json +0 -0
  203. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/BYJMXJ1CHYE86YSHESR0 +0 -0
  204. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/EH9VY081CEHEFY5Y11E0 +0 -0
  205. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/QYX6FZ0NZAKSV5XMDSGG +0 -0
  206. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/W1ZXYGWWEXKXS2J6TQGG +0 -0
  207. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/X8NA4KMB3XYEDM2FAJEG +0 -0
  208. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/BYJMXJ1CHYE86YSHESR0 +0 -0
  209. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/QYX6FZ0NZAKSV5XMDSGG +0 -0
  210. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/W1ZXYGWWEXKXS2J6TQGG +0 -0
  211. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/X8NA4KMB3XYEDM2FAJEG +0 -0
  212. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/09HEW2P03CSMHFAZY7DG +0 -0
  213. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/52H0E4NSPN8SVRK9EVGG +0 -0
  214. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/DWQ75SDC624XF9H326RG +0 -0
  215. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/RW938N1KP2R4BHMW62QG +0 -0
  216. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/config.yaml +0 -0
  217. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/CMYVHDWMSTG9R25780YG +0 -0
  218. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/G3W2W8V6ZG09J6C21WE0 +0 -0
  219. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/Q04J7QW5RQ8D17TPA10G +0 -0
  220. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/SHTEAP8C784YMZSJKBM0 +0 -0
  221. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/branch.main/ref.json +0 -0
  222. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/branch.my-branch/ref.json +0 -0
  223. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.deleted/ref.json +0 -0
  224. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.deleted/ref.json.deleted +0 -0
  225. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.it also works!/ref.json +0 -0
  226. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.it works!/ref.json +0 -0
  227. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/4QF8JA0YPDN51MHSSYVG +0 -0
  228. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/7XAF0Q905SH4938DN9CG +0 -0
  229. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/GC4YVH5SKBPEZCENYQE0 +0 -0
  230. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/NXH3M0HJ7EEJ0699DPP0 +0 -0
  231. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/P874YS3J196959RDHX7G +0 -0
  232. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/XDZ162T1TYBEJMK99NPG +0 -0
  233. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/4QF8JA0YPDN51MHSSYVG +0 -0
  234. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/7XAF0Q905SH4938DN9CG +0 -0
  235. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/GC4YVH5SKBPEZCENYQE0 +0 -0
  236. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/NXH3M0HJ7EEJ0699DPP0 +0 -0
  237. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/XDZ162T1TYBEJMK99NPG +0 -0
  238. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/run_xarray_backends_tests.py +0 -0
  239. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_can_read_old.py +0 -0
  240. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_commit_properties.py +0 -0
  241. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_concurrency.py +0 -0
  242. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_conflicts.py +0 -0
  243. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_credentials.py +0 -0
  244. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_dask.py +0 -0
  245. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_debuginfo.py +0 -0
  246. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_distributed_append.py +0 -0
  247. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_distributed_writers.py +0 -0
  248. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_error.py +0 -0
  249. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_gc.py +0 -0
  250. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_inspect.py +0 -0
  251. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_logs.py +0 -0
  252. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_manifest_splitting.py +0 -0
  253. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_pickle.py +0 -0
  254. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_regressions.py +0 -0
  255. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_session.py +0 -0
  256. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_stateful_repo_ops.py +0 -0
  257. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_stats.py +0 -0
  258. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_store.py +0 -0
  259. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_timetravel.py +0 -0
  260. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_virtual_ref.py +0 -0
  261. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_xarray.py +0 -0
  262. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/__init__.py +0 -0
  263. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_array.py +0 -0
  264. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_group.py +0 -0
  265. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_properties.py +0 -0
  266. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_stateful.py +0 -0
  267. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_store/__init__.py +0 -0
  268. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_store/test_core.py +0 -0
  269. {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_store/test_icechunk_store.py +0 -0
  270. {icechunk-1.1.16 → icechunk-1.1.18}/pyproject.toml +0 -0
  271. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/__init__.py +0 -0
  272. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/_icechunk_python.pyi +0 -0
  273. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/credentials.py +0 -0
  274. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/dask.py +0 -0
  275. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/distributed.py +0 -0
  276. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/py.typed +0 -0
  277. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/repository.py +0 -0
  278. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/session.py +0 -0
  279. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/storage.py +0 -0
  280. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/store.py +0 -0
  281. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/testing/strategies.py +0 -0
  282. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/vendor/__init__.py +0 -0
  283. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/vendor/xarray.py +0 -0
  284. {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/xarray.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: icechunk
3
- Version: 1.1.16
3
+ Version: 1.1.18
4
4
  Classifier: Programming Language :: Rust
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Python :: Implementation :: PyPy
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "icechunk"
3
- version = "0.3.19"
3
+ version = "0.3.21"
4
4
  description = "Transactional storage engine for Zarr designed for use on cloud object storage"
5
5
  readme = "README.md"
6
6
  repository = "https://github.com/earth-mover/icechunk"
@@ -40,10 +40,11 @@ rmp-serde = "1.3.1"
40
40
  url = "2.5.7"
41
41
  async-stream = "0.3.6"
42
42
  rmpv = { version = "1.3.1", features = ["serde", "with-serde"] }
43
- aws-sdk-s3 = "1.119.0"
43
+ aws-sdk-s3 = "1.120.0"
44
44
  aws-config = "1.8.12"
45
45
  aws-credential-types = "1.2.11"
46
46
  typed-path = "0.12.0"
47
+ aws-smithy-runtime = "1.8.5"
47
48
  aws-smithy-types-convert = { version = "0.60.11", features = [
48
49
  "convert-chrono",
49
50
  "convert-streams",
@@ -6,6 +6,7 @@ use std::{
6
6
  use bytes::Bytes;
7
7
  use itertools::{Either, Itertools as _};
8
8
  use serde::{Deserialize, Serialize};
9
+ use tracing::warn;
9
10
 
10
11
  use crate::{
11
12
  format::{
@@ -16,6 +17,13 @@ use crate::{
16
17
  session::{SessionResult, find_coord},
17
18
  };
18
19
 
20
+ // We have limitations on how many chunks we can save on a single commit.
21
+ // Mostly due to flatbuffers not supporting 64-bit offsets,
22
+ // but also because we can't do transaction log splitting (like we can with manifests).
23
+ // For now we suggest smaller commits as a solution.
24
+ // See discussion in https://github.com/earth-mover/icechunk/issues/1558 for more details
25
+ const NUM_CHUNKS_LIMIT: u64 = 50_000_000;
26
+
19
27
  #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
20
28
  pub struct ArrayData {
21
29
  pub shape: ArrayShape,
@@ -31,6 +39,13 @@ pub struct ChangeSet {
31
39
  updated_arrays: HashMap<NodeId, ArrayData>,
32
40
  updated_groups: HashMap<NodeId, Bytes>,
33
41
  set_chunks: BTreeMap<NodeId, HashMap<ManifestExtents, SplitManifest>>,
42
+
43
+ // Number of chunks added to this change set
44
+ num_chunks: u64,
45
+
46
+ // Did we already print a warning about too many chunks in this change set?
47
+ excessive_num_chunks_warned: bool,
48
+
34
49
  // This map keeps track of any chunk deletes that are
35
50
  // outside the domain of the current array shape. This is needed to handle
36
51
  // the very unlikely case of multiple resizes in the same session.
@@ -244,7 +259,8 @@ impl ChangeSet {
244
259
  let extent = splits.find(&coord).expect("logic bug. Trying to set chunk ref but can't find the appropriate split manifest.");
245
260
  // this implementation makes delete idempotent
246
261
  // it allows deleting a deleted chunk by repeatedly setting None.
247
- self.set_chunks
262
+ let old = self
263
+ .set_chunks
248
264
  .entry(node_id)
249
265
  .or_insert_with(|| {
250
266
  HashMap::<
@@ -255,6 +271,18 @@ impl ChangeSet {
255
271
  .entry(extent.clone())
256
272
  .or_default()
257
273
  .insert(coord, data);
274
+
275
+ if old.is_none() {
276
+ self.num_chunks += 1;
277
+ }
278
+
279
+ if self.num_chunks > NUM_CHUNKS_LIMIT && !self.excessive_num_chunks_warned {
280
+ warn!(
281
+ "There are more than {NUM_CHUNKS_LIMIT} chunk references being loaded into this commit. This is close to the maximum number of chunk modifications Icechunk supports in a single commit, we recommend to split into smaller commits."
282
+ );
283
+
284
+ self.excessive_num_chunks_warned = true;
285
+ }
258
286
  }
259
287
 
260
288
  pub fn get_chunk_ref(
@@ -450,6 +450,8 @@ impl RepositoryConfig {
450
450
  (Some(s), None) => Some(s.clone()),
451
451
  (Some(mine), Some(theirs)) => Some(mine.merge(theirs)),
452
452
  },
453
+ // For virtual_chunk_containers, replace rather than extend.
454
+ // This is consistent with other fields: if specified, it replaces.
453
455
  virtual_chunk_containers: match (
454
456
  &self.virtual_chunk_containers,
455
457
  other.virtual_chunk_containers,
@@ -457,11 +459,7 @@ impl RepositoryConfig {
457
459
  (None, None) => None,
458
460
  (None, Some(c)) => Some(c),
459
461
  (Some(c), None) => Some(c.clone()),
460
- (Some(mine), Some(theirs)) => {
461
- let mut merged = mine.clone();
462
- merged.extend(theirs);
463
- Some(merged)
464
- }
462
+ (Some(_), Some(theirs)) => Some(theirs),
465
463
  },
466
464
  manifest: match (&self.manifest, other.manifest) {
467
465
  (None, None) => None,
@@ -678,4 +676,89 @@ mod tests {
678
676
  assert_eq!(config, roundtrip);
679
677
  }
680
678
  }
679
+
680
+ #[icechunk_macros::test]
681
+ fn test_merge_replaces_virtual_chunk_containers() {
682
+ // Create a config with a VCC
683
+ let mut config1 = RepositoryConfig::default();
684
+ config1.set_virtual_chunk_container(
685
+ VirtualChunkContainer::new(
686
+ "s3://bucket1/".to_string(),
687
+ ObjectStoreConfig::S3(S3Options {
688
+ region: Some("us-east-1".to_string()),
689
+ endpoint_url: None,
690
+ anonymous: false,
691
+ allow_http: false,
692
+ force_path_style: false,
693
+ network_stream_timeout_seconds: None,
694
+ requester_pays: false,
695
+ }),
696
+ )
697
+ .unwrap(),
698
+ );
699
+
700
+ // Create a config with no VCCs (cleared)
701
+ let mut config2 = RepositoryConfig::default();
702
+ config2.clear_virtual_chunk_containers();
703
+
704
+ // Merge: config2 (empty VCCs) should replace config1's VCCs
705
+ let merged = config1.merge(config2);
706
+
707
+ // VCCs should be empty after merge
708
+ assert_eq!(
709
+ merged.virtual_chunk_containers,
710
+ Some(std::collections::HashMap::new()),
711
+ "Merging with cleared VCCs should result in empty VCCs"
712
+ );
713
+ }
714
+
715
+ #[icechunk_macros::test]
716
+ fn test_merge_replaces_virtual_chunk_containers_with_new_ones() {
717
+ // Create a config with VCC1
718
+ let mut config1 = RepositoryConfig::default();
719
+ config1.set_virtual_chunk_container(
720
+ VirtualChunkContainer::new(
721
+ "s3://bucket1/".to_string(),
722
+ ObjectStoreConfig::S3(S3Options {
723
+ region: Some("us-east-1".to_string()),
724
+ endpoint_url: None,
725
+ anonymous: false,
726
+ allow_http: false,
727
+ force_path_style: false,
728
+ network_stream_timeout_seconds: None,
729
+ requester_pays: false,
730
+ }),
731
+ )
732
+ .unwrap(),
733
+ );
734
+
735
+ // Create a config with VCC2
736
+ let mut config2 = RepositoryConfig::default();
737
+ config2.set_virtual_chunk_container(
738
+ VirtualChunkContainer::new(
739
+ "s3://bucket2/".to_string(),
740
+ ObjectStoreConfig::S3(S3Options {
741
+ region: Some("us-west-2".to_string()),
742
+ endpoint_url: None,
743
+ anonymous: false,
744
+ allow_http: false,
745
+ force_path_style: false,
746
+ network_stream_timeout_seconds: None,
747
+ requester_pays: false,
748
+ }),
749
+ )
750
+ .unwrap(),
751
+ );
752
+
753
+ // Merge: config2's VCCs should replace config1's VCCs
754
+ let merged = config1.merge(config2);
755
+
756
+ let vccs = merged.virtual_chunk_containers.unwrap();
757
+ assert_eq!(vccs.len(), 1, "Should have exactly one VCC after merge");
758
+ assert!(
759
+ vccs.contains_key("s3://bucket2/"),
760
+ "Should contain bucket2, not bucket1"
761
+ );
762
+ assert!(!vccs.contains_key("s3://bucket1/"), "Should not contain bucket1");
763
+ }
681
764
  }
@@ -945,7 +945,8 @@ impl Session {
945
945
  if self.read_only() {
946
946
  return Err(SessionErrorKind::ReadOnlySession.into());
947
947
  }
948
- let Session { splits: other_splits, change_set, .. } = other;
948
+ let Session { splits: other_splits, change_set, config: other_config, .. } =
949
+ other;
949
950
 
950
951
  if self.splits.iter().any(|(node, our_splits)| {
951
952
  other_splits
@@ -953,7 +954,7 @@ impl Session {
953
954
  .is_some_and(|their_splits| !our_splits.compatible_with(their_splits))
954
955
  }) {
955
956
  let ours = self.config().manifest().splitting().clone();
956
- let theirs = self.config().manifest().splitting().clone();
957
+ let theirs = other_config.manifest().splitting().clone();
957
958
  return Err(
958
959
  SessionErrorKind::IncompatibleSplittingConfig { ours, theirs }.into()
959
960
  );
@@ -32,6 +32,7 @@ use aws_sdk_s3::{
32
32
  primitives::ByteStream,
33
33
  types::{CompletedMultipartUpload, CompletedPart, Delete, Object, ObjectIdentifier},
34
34
  };
35
+ use aws_smithy_runtime::client::retries::classifiers::HttpStatusCodeClassifier;
35
36
  use aws_smithy_types_convert::{date_time::DateTimeExt, stream::PaginationStreamExt};
36
37
  use bytes::{Buf, Bytes};
37
38
  use chrono::{DateTime, Utc};
@@ -137,9 +138,8 @@ pub async fn mk_client(
137
138
 
138
139
  #[allow(clippy::unwrap_used)]
139
140
  let app_name = AppName::new("icechunk").unwrap();
140
- let mut aws_config = aws_config::defaults(BehaviorVersion::v2025_08_07())
141
- .region(region)
142
- .app_name(app_name);
141
+ let mut aws_config =
142
+ aws_config::defaults(BehaviorVersion::latest()).region(region).app_name(app_name);
143
143
 
144
144
  if let Some(endpoint) = endpoint {
145
145
  aws_config = aws_config.endpoint_url(endpoint)
@@ -196,6 +196,18 @@ pub async fn mk_client(
196
196
 
197
197
  s3_builder = s3_builder.identity_cache(id_cache);
198
198
 
199
+ // Add retry classifier for HTTP 408 (Request Timeout)
200
+ // The default HttpStatusCodeClassifier only retries on 500, 502, 503, 504
201
+ static RETRY_CODES: &[u16] = &[408];
202
+ // This confusingly named `retry_classifier` method ends up calling
203
+ // `push_retry_classifier` after wrapping our custom classifier in `SharedRetryClassifier`.
204
+ // Ultimately, this is a push on to a `Vec<SharedRetryClassifier>`, and is thus additive
205
+ // to the existing default retry configuration.
206
+ // https://github.com/smithy-lang/smithy-rs/blob/cfcc39cf4b5bea665bba684b64bfca2b89e4bc73/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs#L755
207
+ // https://github.com/smithy-lang/smithy-rs/blob/cfcc39cf4b5bea665bba684b64bfca2b89e4bc73/rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs#L370
208
+ s3_builder = s3_builder
209
+ .retry_classifier(HttpStatusCodeClassifier::new_from_codes(RETRY_CODES));
210
+
199
211
  if !extra_read_headers.is_empty() || !extra_write_headers.is_empty() {
200
212
  s3_builder = s3_builder.interceptor(ExtraHeadersInterceptor {
201
213
  extra_read_headers,
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "icechunk-python"
3
- version = "1.1.16"
3
+ version = "1.1.18"
4
4
  description = "Transactional storage engine for Zarr designed for use on cloud object storage"
5
5
  readme = "README.md"
6
6
  repository = "https://github.com/earth-mover/icechunk"
@@ -21,7 +21,7 @@ crate-type = ["cdylib"]
21
21
  bytes = "1.11.0"
22
22
  chrono = { version = "0.4.42" }
23
23
  futures = "0.3.31"
24
- icechunk = { path = "../icechunk", version = "0.3.19", features = ["logs"] }
24
+ icechunk = { path = "../icechunk", version = "0.3.21", features = ["logs"] }
25
25
  itertools = "0.14.0"
26
26
  pyo3 = { version = "0.27.2", features = [
27
27
  "chrono",
@@ -142,6 +142,39 @@ def test_virtual_chunk_containers() -> None:
142
142
  assert config.virtual_chunk_containers["s3://testbucket/"] == container
143
143
 
144
144
 
145
+ def test_clear_virtual_chunk_containers_persists_through_reopen() -> None:
146
+ """Test that clearing VCCs is respected by reopen().
147
+
148
+ Regression test for: https://github.com/earth-mover/icechunk/issues/XXX
149
+ """
150
+ storage = icechunk.in_memory_storage()
151
+
152
+ # Create repo and add a VCC
153
+ repo = icechunk.Repository.create(storage=storage)
154
+ config = repo.config
155
+ store_config = icechunk.s3_store(region="us-east-1")
156
+ container = icechunk.VirtualChunkContainer("s3://testbucket/", store_config)
157
+ config.set_virtual_chunk_container(container)
158
+ repo = repo.reopen(config=config)
159
+ repo.save_config()
160
+
161
+ vccs = repo.config.virtual_chunk_containers or {}
162
+ assert "s3://testbucket/" in vccs
163
+
164
+ # Clear VCCs and reopen
165
+ config = repo.config
166
+ config.clear_virtual_chunk_containers()
167
+ assert config.virtual_chunk_containers == {}
168
+
169
+ repo = repo.reopen(config=config)
170
+
171
+ # VCCs should be cleared after reopen
172
+ reopened_vccs = repo.config.virtual_chunk_containers or {}
173
+ assert (
174
+ reopened_vccs == {}
175
+ ), f"Expected no VCCs after reopen, got: {list(reopened_vccs.keys())}"
176
+
177
+
145
178
  def test_can_change_deep_config_values() -> None:
146
179
  storage = icechunk.in_memory_storage()
147
180
  repo = icechunk.Repository.create(
File without changes
File without changes