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.
- {icechunk-1.1.16 → icechunk-1.1.18}/PKG-INFO +1 -1
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/Cargo.toml +3 -2
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/change_set.rs +29 -1
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/config.rs +88 -5
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/session.rs +3 -2
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/s3.rs +15 -3
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/Cargo.toml +2 -2
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_config.py +33 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/LICENSE +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/examples/low_level_dataset.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/examples/multithreaded_get_chunk_refs.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/examples/multithreaded_store.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/all.fbs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/manifest.fbs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/object_ids.fbs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/snapshot.fbs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/flatbuffers/transaction_log.fbs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/dataset.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/format/manifest.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/manifest.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/session.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/storage/mod.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/storage/s3.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/proptest-regressions/storage/virtual_ref.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/asset_manager.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/bin/icechunk/main.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/cli/config.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/cli/interface.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/cli/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/conflicts/basic_solver.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/conflicts/detector.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/conflicts/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/error.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/attributes.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/flatbuffers/all_generated.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/manifest.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/serializers/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/snapshot.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/format/transaction_log.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/inspect.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/lib.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/gc.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/manifests.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/ops/stats.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/refs.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/repository.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/logging.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/storage/object_store.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/store.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/strategies.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/stream_utils.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/src/virtual_chunks.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/common/mod.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_concurrency.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_distributed_writes.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_gc.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_large_manifests.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_stats.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_storage.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk/tests/test_virtual_refs.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-macros/Cargo.toml +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-macros/src/lib.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/.gitignore +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/Cargo.lock +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/LICENSE +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/coiled_runner.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/conftest.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/create_era5.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/datasets.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/envs/icechunk-alpha-12.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/envs/icechunk-alpha-release.txt +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/helpers.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/lib.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/most_recent.sh +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/pytest.ini +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/runner.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/tasks.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/test_benchmark_reads.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/test_benchmark_writes.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/bank_accounts.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/dask_write.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/high_concurrency.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/mpwrite.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/examples/run_in_ci.sh +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/integration_tests/test_r2.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/_icechunk_python.pyi +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/credentials.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/dask.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/distributed.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/py.typed +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/repository.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/session.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/storage.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/store.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/testing/strategies.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/vendor/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/vendor/xarray.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/python/icechunk/xarray.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/scripts/check_xarray_docs_sync.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/scripts/known-xarray-doc-diffs.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/config.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/conflicts.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/errors.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/lib.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/pickle.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/repository.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/session.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/stats.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/store.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/src/streams.rs +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/conftest.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/28H289BT7JSZKZ6W5F70 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/29CS30CK3D3CFVFBEZ80 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/39KTEACWZDMQ42C0TK5G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/3CQH7MY9P8QFNE5TWMZ0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/3JWEBSQZ1AQT9RK46JHG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/4DCZD8GC46090M65S46G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/4KXQX71CPA8ASE25X02G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/5M551EG8VHX6GK2RVYEG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/8Y59PE3EQ1NHY32W80PG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/9JSXG2S6R7JW530266FG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/9Q4DF3ZK93B35EW1Q0W0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/A14DFW1AMR9GJY82B480 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/C43XA0532YJN8FFJQSV0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/DB0FK4TGE2CYP5N5H5MG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/DN7QKGTXF72JRSP1R59G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/E06NN106F0RD1DKC57B0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/E88W8NWPPQ0DDP6MAQE0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/EDKREXA5PA5KMVMYT1T0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/EMXV4G2NH651YQHCN5SG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/F2FF589RGM5TQPJ4XS30 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/FX2THCNDEF1TPJVVW6CG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/GD7FA0K8HRGV0XK609W0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/HNW4TH4RRN5ECR7PH4Z0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/JH2K5GX77HJWDR3BRHN0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/KYA9AWYNRNH4KDN3YS1G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/MHYQZGW0T34H7566ND30 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/MJC2EWJ8DTBA7P46REFG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/N4EXVBQKBGCMTXX6PEJ0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/P6C9986C6R2P9EP30XCG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/P9JDEJ02DTDBGJDASRB0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/PAMW4ZQ7FVP7E1AZR2W0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/PZ5F8FQKKA144F08ANG0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/QDZDYMBSPJ4M0T34BEPG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/QEDGZDXTPJEX179WCT6G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/RQM2HG8XAD9KP8S2TRKG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/T394Y31WDT1VCVFY3A80 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/TXZ35HQMB7RHFJKRNXZG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/V66JMMKW77DCFEGRVSK0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/VGFD4TNTAETR77B9RK8G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/VJM5MNFQ7KQ7ERCWFNT0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/W4G0HS519TZDQBDAD01G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/XZAFNSMV272D9X70HC50 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YFGVD91WZJM9FKAB4PQG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YGWDY7HYDBVBPKSJYK40 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YQ0KA7YQ737KNCT5F0BG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YRS4NW2FJM8P66MCF8E0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/YWQDK4GG3H7JF189CN6G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/chunks/Z50RSERZRJZNTFRPDW80 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/config.yaml +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/15KJFGXKPM1KRGFZ52D0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/19KPV7V2275XRM01YAWG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/2PQ1EA39NB2VK7QK688G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/3QYVB4AX7J2XF0QAEX1G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/62CS3ENEZP4MJHPAW12G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/7V2NE5Q4H7SN9QF0ZHJ0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/7WT30WPG1HF0P2QXGV6G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/88Z1G93EH4VF9X28BBHG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/AAJX4KKQQH72RK949AA0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/B81H9ZEGPV7E15CWXA10 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/CZMYYDSX2SX36J47WN9G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/D5CVGKP2G5DP6C277YAG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/D6QG80A0HJW564ZXRBRG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/DDPY0EEPKZXW1ACW41HG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/DNTQPT8BPWQJ1N2K3KN0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/EN0XHAX4APG96CNX1PF0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/F22E2GTDKW73XFV884JG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/FM7YJ4BBE12X6CE0T4AG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/HB9W7VCB4QA786S2XJBG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/J3ZNDGTGA4AY29S8SJVG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/KCR2FSZ5WFVV39SRQWB0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/MZG15YADGEG849HP3DPG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/NGW2FB9H515MEMPRJCNG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/NYEQXA5QV0780CE19HFG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/PZCTNRCT17DDAH1Q8B00 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/Q8WDWGQ0T78AEXKHRV40 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/QDR73V4TZ4M6CW1PNPSG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/QYDWRAXGKCFNV0645F80 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/RF0DB8QD7R68HNHPAXVG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/RNXAWAZHFV0CDV8JJVBG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/RVXQ0DMYANQPV6X32690 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/TTSZ8VYDX0Y7PB6A13H0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/WS2BZ61Q1V564ZG6GSJG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/XXCGBC5VMRPB89PFMFGG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/manifests/ZEQVP57D4FWAZJ0BJV6G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/refs/branch.main/ref.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/BYJMXJ1CHYE86YSHESR0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/EH9VY081CEHEFY5Y11E0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/QYX6FZ0NZAKSV5XMDSGG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/W1ZXYGWWEXKXS2J6TQGG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/snapshots/X8NA4KMB3XYEDM2FAJEG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/BYJMXJ1CHYE86YSHESR0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/QYX6FZ0NZAKSV5XMDSGG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/W1ZXYGWWEXKXS2J6TQGG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/split-repo/transactions/X8NA4KMB3XYEDM2FAJEG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/09HEW2P03CSMHFAZY7DG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/52H0E4NSPN8SVRK9EVGG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/DWQ75SDC624XF9H326RG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/chunks/RW938N1KP2R4BHMW62QG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/config.yaml +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/CMYVHDWMSTG9R25780YG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/G3W2W8V6ZG09J6C21WE0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/Q04J7QW5RQ8D17TPA10G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/manifests/SHTEAP8C784YMZSJKBM0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/branch.main/ref.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/branch.my-branch/ref.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.deleted/ref.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.deleted/ref.json.deleted +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.it also works!/ref.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/refs/tag.it works!/ref.json +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/4QF8JA0YPDN51MHSSYVG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/7XAF0Q905SH4938DN9CG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/GC4YVH5SKBPEZCENYQE0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/NXH3M0HJ7EEJ0699DPP0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/P874YS3J196959RDHX7G +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/snapshots/XDZ162T1TYBEJMK99NPG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/4QF8JA0YPDN51MHSSYVG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/7XAF0Q905SH4938DN9CG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/GC4YVH5SKBPEZCENYQE0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/NXH3M0HJ7EEJ0699DPP0 +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/data/test-repo/transactions/XDZ162T1TYBEJMK99NPG +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/run_xarray_backends_tests.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_can_read_old.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_commit_properties.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_concurrency.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_conflicts.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_credentials.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_dask.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_debuginfo.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_distributed_append.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_distributed_writers.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_error.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_gc.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_inspect.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_logs.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_manifest_splitting.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_pickle.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_regressions.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_session.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_stateful_repo_ops.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_stats.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_store.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_timetravel.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_virtual_ref.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_xarray.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_array.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_group.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_properties.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_stateful.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_store/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_store/test_core.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/tests/test_zarr/test_store/test_icechunk_store.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/pyproject.toml +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/_icechunk_python.pyi +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/credentials.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/dask.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/distributed.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/py.typed +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/repository.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/session.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/storage.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/store.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/testing/strategies.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/vendor/__init__.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/vendor/xarray.py +0 -0
- {icechunk-1.1.16 → icechunk-1.1.18}/python/icechunk/xarray.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "icechunk"
|
|
3
|
-
version = "0.3.
|
|
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.
|
|
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
|
|
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(
|
|
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, .. } =
|
|
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 =
|
|
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 =
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{icechunk-1.1.16 → icechunk-1.1.18}/icechunk-python/benchmarks/envs/icechunk-alpha-release.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|