tensorfs 0.3.92__tar.gz → 0.6.0__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.
- {tensorfs-0.3.92 → tensorfs-0.6.0}/Cargo.lock +130 -3
- {tensorfs-0.3.92 → tensorfs-0.6.0}/Cargo.toml +1 -1
- {tensorfs-0.3.92 → tensorfs-0.6.0}/PKG-INFO +1 -1
- tensorfs-0.6.0/crates/tensorfs-core/Cargo.toml +40 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/build.rs +7 -11
- tensorfs-0.6.0/crates/tensorfs-core/examples/filesystem_parent_death_gate.rs +89 -0
- tensorfs-0.6.0/crates/tensorfs-core/examples/mine-vectors.rs +152 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/resident_conversion_profile.rs +1 -1
- tensorfs-0.6.0/crates/tensorfs-core/src/b64.rs +33 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +12 -468
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -29
- tensorfs-0.6.0/crates/tensorfs-core/src/bin/tfs/fetch.rs +407 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/ingest.rs +5 -724
- tensorfs-0.6.0/crates/tensorfs-core/src/bin/tfs/main.rs +727 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/repo.rs +37 -495
- tensorfs-0.6.0/crates/tensorfs-core/src/bin/tfs/snap.rs +81 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/cache_roots.rs +100 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/catalog.rs +12 -64
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/checkpoint.rs +2 -13
- tensorfs-0.6.0/crates/tensorfs-core/src/derived/channel.rs +918 -0
- tensorfs-0.6.0/crates/tensorfs-core/src/derived/next_attempt_tests.rs +246 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived.rs +185 -124
- tensorfs-0.6.0/crates/tensorfs-core/src/ensure/admission.rs +302 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ensure.rs +1 -1
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/err.rs +0 -23
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/fetch.rs +1 -81
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/filesystem_identity.rs +62 -7
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/fill.rs +2 -35
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/gc.rs +211 -47
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/convert.rs +20 -161
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/h3_lora.rs +1 -1
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/journal.rs +1 -17
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/mod.rs +1 -6
- tensorfs-0.6.0/crates/tensorfs-core/src/ingest/sdxl_lora.rs +259 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/source.rs +12 -11
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/transaction.rs +3 -80
- tensorfs-0.6.0/crates/tensorfs-core/src/jcs.rs +249 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/lib.rs +36 -7
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/machine.rs +1 -1
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/meta.rs +158 -7
- tensorfs-0.6.0/crates/tensorfs-core/src/object_roots.rs +238 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/read.rs +38 -12
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/reclaim.rs +65 -74
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/registry.rs +20 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/repo_cache.rs +10 -10
- tensorfs-0.6.0/crates/tensorfs-core/src/sha256.rs +80 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/source_artifact.rs +2 -25
- tensorfs-0.6.0/crates/tensorfs-core/src/source_model.rs +975 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/stats.rs +0 -12
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/storage.rs +19 -176
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/store.rs +50 -39
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/download.rs +54 -11
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/hub.rs +44 -3
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/mod.rs +4 -2
- tensorfs-0.6.0/crates/tensorfs-core/src/transport/publish.rs +314 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/pull.rs +5 -17
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/tests.rs +270 -38
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/unsynced.rs +3 -3
- {tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs → tensorfs-0.6.0/crates/tensorfs-core/tests}/conform.rs +13 -221
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/ensure.rs +14 -67
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fetch_faults.rs +2 -3
- tensorfs-0.6.0/crates/tensorfs-core/tests/filesystem_parent_death_gate.py +158 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/h3_lora.rs +0 -14
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -1
- tensorfs-0.6.0/crates/tensorfs-core/tests/home.rs +116 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/liveness.rs +0 -4
- tensorfs-0.6.0/crates/tensorfs-core/tests/owned_store.rs +368 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/repo_cache.rs +25 -84
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/repo_store.rs +29 -229
- tensorfs-0.6.0/crates/tensorfs-core/tests/sdxl_lora.rs +273 -0
- tensorfs-0.6.0/crates/tensorfs-core/tests/source_model.rs +144 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_plan.rs +0 -4
- tensorfs-0.6.0/crates/tensorfs-core/tests/store_boundaries.rs +366 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/trust_index.rs +33 -0
- tensorfs-0.6.0/crates/tensorfs-core/tests/vectors.rs +1536 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/write_through.rs +28 -15
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/API.md +57 -32
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/Cargo.toml +5 -1
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/cuda.rs +21 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/cursor.rs +16 -7
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/device.rs +272 -139
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/faults.rs +24 -19
- tensorfs-0.6.0/crates/tensorfs-plane/src/host.rs +1067 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/io.rs +135 -170
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/layout.rs +2 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/lib.rs +2 -1
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/plane.rs +337 -106
- tensorfs-0.6.0/crates/tensorfs-plane/src/window.rs +174 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/common/mod.rs +0 -25
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/gpu.rs +381 -148
- tensorfs-0.6.0/crates/tensorfs-plane/tests/layout_identity.rs +85 -0
- tensorfs-0.6.0/crates/tensorfs-plane/tests/sealed.rs +264 -0
- tensorfs-0.6.0/crates/tensorfs-plane/tests/window.rs +207 -0
- tensorfs-0.6.0/crates/tensorfs-py/Cargo.toml +20 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/docs.rs +5 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/ensure.rs +2 -2
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/lib.rs +26 -10
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/plane.rs +160 -3
- tensorfs-0.6.0/crates/tensorfs-py/src/readplan.rs +97 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/store.rs +2 -92
- {tensorfs-0.3.92 → tensorfs-0.6.0}/pyproject.toml +4 -4
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/__init__.py +120 -212
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_derived_channel.py +24 -20
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_ext.pyi +174 -224
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_source_channel.py +4 -3
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/_tensors.py +5 -4
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/derived.py +29 -26
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/errors.py +0 -44
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/plane.py +15 -2
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/plane.pyi +66 -4
- tensorfs-0.6.0/python/tensorfs/records.py +731 -0
- tensorfs-0.3.92/crates/tensorfs-core/Cargo.toml +0 -25
- tensorfs-0.3.92/crates/tensorfs-core/src/b64.rs +0 -83
- tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -1422
- tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/main.rs +0 -2979
- tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -1103
- tensorfs-0.3.92/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -392
- tensorfs-0.3.92/crates/tensorfs-core/src/ensure/admission.rs +0 -333
- tensorfs-0.3.92/crates/tensorfs-core/src/ingest/gguf.rs +0 -599
- tensorfs-0.3.92/crates/tensorfs-core/src/jcs.rs +0 -527
- tensorfs-0.3.92/crates/tensorfs-core/src/sha256.rs +0 -511
- tensorfs-0.3.92/crates/tensorfs-core/src/staging.rs +0 -387
- tensorfs-0.3.92/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -228
- tensorfs-0.3.92/crates/tensorfs-core/tests/home.rs +0 -169
- tensorfs-0.3.92/crates/tensorfs-core/tests/sha256_backends.rs +0 -188
- tensorfs-0.3.92/crates/tensorfs-core/tests/staging.rs +0 -594
- tensorfs-0.3.92/crates/tensorfs-core/tests/store_boundaries.rs +0 -723
- tensorfs-0.3.92/crates/tensorfs-plane/src/host.rs +0 -387
- tensorfs-0.3.92/crates/tensorfs-py/Cargo.toml +0 -16
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/derived/roots.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/descriptors.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/disk.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/providers.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/sources.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/as_is.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_download.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/census.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-plane/tests/host_tier.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.3.92 → tensorfs-0.6.0}/python/tensorfs/py.typed +0 -0
|
@@ -26,6 +26,15 @@ version = "2.13.1"
|
|
|
26
26
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
27
27
|
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
|
28
28
|
|
|
29
|
+
[[package]]
|
|
30
|
+
name = "block-buffer"
|
|
31
|
+
version = "0.10.4"
|
|
32
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
33
|
+
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
|
|
34
|
+
dependencies = [
|
|
35
|
+
"generic-array",
|
|
36
|
+
]
|
|
37
|
+
|
|
29
38
|
[[package]]
|
|
30
39
|
name = "cc"
|
|
31
40
|
version = "1.4.4"
|
|
@@ -48,12 +57,41 @@ version = "0.2.2"
|
|
|
48
57
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
49
58
|
checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527"
|
|
50
59
|
|
|
60
|
+
[[package]]
|
|
61
|
+
name = "cpufeatures"
|
|
62
|
+
version = "0.2.17"
|
|
63
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
64
|
+
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
|
|
65
|
+
dependencies = [
|
|
66
|
+
"libc",
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
[[package]]
|
|
70
|
+
name = "crypto-common"
|
|
71
|
+
version = "0.1.7"
|
|
72
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
73
|
+
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
|
|
74
|
+
dependencies = [
|
|
75
|
+
"generic-array",
|
|
76
|
+
"typenum",
|
|
77
|
+
]
|
|
78
|
+
|
|
51
79
|
[[package]]
|
|
52
80
|
name = "deranged"
|
|
53
81
|
version = "0.5.8"
|
|
54
82
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
55
83
|
checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c"
|
|
56
84
|
|
|
85
|
+
[[package]]
|
|
86
|
+
name = "digest"
|
|
87
|
+
version = "0.10.7"
|
|
88
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
89
|
+
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
|
|
90
|
+
dependencies = [
|
|
91
|
+
"block-buffer",
|
|
92
|
+
"crypto-common",
|
|
93
|
+
]
|
|
94
|
+
|
|
57
95
|
[[package]]
|
|
58
96
|
name = "errno"
|
|
59
97
|
version = "0.3.14"
|
|
@@ -92,6 +130,16 @@ dependencies = [
|
|
|
92
130
|
"winapi",
|
|
93
131
|
]
|
|
94
132
|
|
|
133
|
+
[[package]]
|
|
134
|
+
name = "generic-array"
|
|
135
|
+
version = "0.14.7"
|
|
136
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
137
|
+
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
|
|
138
|
+
dependencies = [
|
|
139
|
+
"typenum",
|
|
140
|
+
"version_check",
|
|
141
|
+
]
|
|
142
|
+
|
|
95
143
|
[[package]]
|
|
96
144
|
name = "getrandom"
|
|
97
145
|
version = "0.2.17"
|
|
@@ -127,6 +175,12 @@ version = "0.5.0"
|
|
|
127
175
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
128
176
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
|
129
177
|
|
|
178
|
+
[[package]]
|
|
179
|
+
name = "itoa"
|
|
180
|
+
version = "1.0.18"
|
|
181
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
182
|
+
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
|
183
|
+
|
|
130
184
|
[[package]]
|
|
131
185
|
name = "libc"
|
|
132
186
|
version = "0.2.189"
|
|
@@ -160,6 +214,12 @@ version = "0.12.1"
|
|
|
160
214
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
161
215
|
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
|
|
162
216
|
|
|
217
|
+
[[package]]
|
|
218
|
+
name = "memchr"
|
|
219
|
+
version = "2.8.3"
|
|
220
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
221
|
+
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
|
222
|
+
|
|
163
223
|
[[package]]
|
|
164
224
|
name = "minicbor"
|
|
165
225
|
version = "2.3.0"
|
|
@@ -381,6 +441,21 @@ dependencies = [
|
|
|
381
441
|
"untrusted",
|
|
382
442
|
]
|
|
383
443
|
|
|
444
|
+
[[package]]
|
|
445
|
+
name = "ryu-js"
|
|
446
|
+
version = "1.0.3"
|
|
447
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
448
|
+
checksum = "04d056b875a9d2e6cb9a61d127afee9ac5999b9f87bcb32079d1318e505be714"
|
|
449
|
+
|
|
450
|
+
[[package]]
|
|
451
|
+
name = "serde"
|
|
452
|
+
version = "1.0.229"
|
|
453
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
454
|
+
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
|
|
455
|
+
dependencies = [
|
|
456
|
+
"serde_core",
|
|
457
|
+
]
|
|
458
|
+
|
|
384
459
|
[[package]]
|
|
385
460
|
name = "serde_core"
|
|
386
461
|
version = "1.0.229"
|
|
@@ -401,6 +476,41 @@ dependencies = [
|
|
|
401
476
|
"syn 3.0.4",
|
|
402
477
|
]
|
|
403
478
|
|
|
479
|
+
[[package]]
|
|
480
|
+
name = "serde_json"
|
|
481
|
+
version = "1.0.151"
|
|
482
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
483
|
+
checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14"
|
|
484
|
+
dependencies = [
|
|
485
|
+
"itoa",
|
|
486
|
+
"memchr",
|
|
487
|
+
"serde",
|
|
488
|
+
"serde_core",
|
|
489
|
+
"zmij",
|
|
490
|
+
]
|
|
491
|
+
|
|
492
|
+
[[package]]
|
|
493
|
+
name = "serde_json_canonicalizer"
|
|
494
|
+
version = "0.3.2"
|
|
495
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
496
|
+
checksum = "fe52319a927259afbfa5180c5157cd8167edfd3e8c254f9558c7fef44c5649f2"
|
|
497
|
+
dependencies = [
|
|
498
|
+
"ryu-js",
|
|
499
|
+
"serde",
|
|
500
|
+
"serde_json",
|
|
501
|
+
]
|
|
502
|
+
|
|
503
|
+
[[package]]
|
|
504
|
+
name = "sha2"
|
|
505
|
+
version = "0.10.9"
|
|
506
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
507
|
+
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
|
508
|
+
dependencies = [
|
|
509
|
+
"cfg-if",
|
|
510
|
+
"cpufeatures",
|
|
511
|
+
"digest",
|
|
512
|
+
]
|
|
513
|
+
|
|
404
514
|
[[package]]
|
|
405
515
|
name = "shlex"
|
|
406
516
|
version = "2.0.1"
|
|
@@ -449,8 +559,9 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
449
559
|
|
|
450
560
|
[[package]]
|
|
451
561
|
name = "tensorfs-core"
|
|
452
|
-
version = "0.
|
|
562
|
+
version = "0.6.0"
|
|
453
563
|
dependencies = [
|
|
564
|
+
"base64",
|
|
454
565
|
"fs2",
|
|
455
566
|
"libc",
|
|
456
567
|
"minicbor",
|
|
@@ -459,12 +570,16 @@ dependencies = [
|
|
|
459
570
|
"rusqlite",
|
|
460
571
|
"rustix",
|
|
461
572
|
"rustls",
|
|
573
|
+
"serde",
|
|
574
|
+
"serde_json",
|
|
575
|
+
"serde_json_canonicalizer",
|
|
576
|
+
"sha2",
|
|
462
577
|
"webpki-roots 0.26.11",
|
|
463
578
|
]
|
|
464
579
|
|
|
465
580
|
[[package]]
|
|
466
581
|
name = "tensorfs-plane"
|
|
467
|
-
version = "0.
|
|
582
|
+
version = "0.6.0"
|
|
468
583
|
dependencies = [
|
|
469
584
|
"libc",
|
|
470
585
|
"libloading",
|
|
@@ -474,7 +589,7 @@ dependencies = [
|
|
|
474
589
|
|
|
475
590
|
[[package]]
|
|
476
591
|
name = "tensorfs-py"
|
|
477
|
-
version = "0.
|
|
592
|
+
version = "0.6.0"
|
|
478
593
|
dependencies = [
|
|
479
594
|
"pyo3",
|
|
480
595
|
"tensorfs-core",
|
|
@@ -520,6 +635,12 @@ version = "0.1.9"
|
|
|
520
635
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
521
636
|
checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
|
|
522
637
|
|
|
638
|
+
[[package]]
|
|
639
|
+
name = "typenum"
|
|
640
|
+
version = "1.20.1"
|
|
641
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
642
|
+
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
|
|
643
|
+
|
|
523
644
|
[[package]]
|
|
524
645
|
name = "unicode-ident"
|
|
525
646
|
version = "1.0.24"
|
|
@@ -703,3 +824,9 @@ name = "zeroize"
|
|
|
703
824
|
version = "1.9.0"
|
|
704
825
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
705
826
|
checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
|
|
827
|
+
|
|
828
|
+
[[package]]
|
|
829
|
+
name = "zmij"
|
|
830
|
+
version = "1.0.23"
|
|
831
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
832
|
+
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "tensorfs-core"
|
|
3
|
+
version.workspace = true
|
|
4
|
+
edition.workspace = true
|
|
5
|
+
|
|
6
|
+
[[bin]]
|
|
7
|
+
name = "tfs"
|
|
8
|
+
path = "src/bin/tfs/main.rs"
|
|
9
|
+
required-features = ["store"]
|
|
10
|
+
|
|
11
|
+
[features]
|
|
12
|
+
# The store, downloader, ingest, GC and everything that opens one. Without it: documents,
|
|
13
|
+
# headers, read plans and the fit function only (what a plane-only executor links).
|
|
14
|
+
default = ["store"]
|
|
15
|
+
store = ["dep:fs2", "dep:rusqlite", "dep:rustix", "dep:rustls", "dep:webpki-roots", "dep:nix"]
|
|
16
|
+
|
|
17
|
+
[dependencies]
|
|
18
|
+
base64 = "0.22"
|
|
19
|
+
fs2 = { version = "0.4", optional = true }
|
|
20
|
+
minicbor = { version = "2.3.0", default-features = false, features = ["alloc"] }
|
|
21
|
+
rusqlite = { version = "0.32", features = ["bundled"], optional = true }
|
|
22
|
+
serde = "1"
|
|
23
|
+
serde_json = { version = "1", features = ["float_roundtrip"] }
|
|
24
|
+
serde_json_canonicalizer = "0.3"
|
|
25
|
+
sha2 = "0.10"
|
|
26
|
+
rustix = { version = "1.1.4", default-features = false, features = ["fs", "std", "net", "event", "process"], optional = true }
|
|
27
|
+
# tfs-049: the ONE transport (src/transport/). rustls is the one TLS stack, used only
|
|
28
|
+
# there; scripts/fence.py refuses it anywhere else so a second mover cannot grow.
|
|
29
|
+
rustls = { version = "0.23", default-features = false, features = ["ring", "std", "tls12"], optional = true }
|
|
30
|
+
webpki-roots = { version = "0.26", optional = true }
|
|
31
|
+
|
|
32
|
+
[target.'cfg(target_os = "linux")'.dependencies]
|
|
33
|
+
nix = { version = "0.31.3", default-features = false, features = ["fs", "user"], optional = true }
|
|
34
|
+
|
|
35
|
+
[build-dependencies]
|
|
36
|
+
sha2 = "0.10"
|
|
37
|
+
|
|
38
|
+
[dev-dependencies]
|
|
39
|
+
libc = "0.2"
|
|
40
|
+
rcgen = "0.13"
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
//! Capture actual native source/dependency/build inputs, including same-version edits.
|
|
2
|
-
|
|
3
|
-
#[path = "src/sha256.rs"]
|
|
4
|
-
mod sha256;
|
|
2
|
+
use sha2::{Digest, Sha256};
|
|
5
3
|
use std::{env, fs, path::Path};
|
|
6
4
|
fn collect(path: &Path, files: &mut Vec<std::path::PathBuf>) {
|
|
7
5
|
if path.is_dir() {
|
|
@@ -26,13 +24,13 @@ fn main() {
|
|
|
26
24
|
collect(Path::new(path), &mut files);
|
|
27
25
|
}
|
|
28
26
|
files.sort();
|
|
29
|
-
let mut hash =
|
|
27
|
+
let mut hash = Sha256::new();
|
|
30
28
|
for file in files {
|
|
31
29
|
let name = file.to_string_lossy();
|
|
32
30
|
let bytes = fs::read(&file).unwrap();
|
|
33
|
-
hash.update(
|
|
31
|
+
hash.update((name.len() as u64).to_le_bytes());
|
|
34
32
|
hash.update(name.as_bytes());
|
|
35
|
-
hash.update(
|
|
33
|
+
hash.update((bytes.len() as u64).to_le_bytes());
|
|
36
34
|
hash.update(&bytes);
|
|
37
35
|
}
|
|
38
36
|
for key in [
|
|
@@ -45,15 +43,13 @@ fn main() {
|
|
|
45
43
|
println!("cargo:rerun-if-env-changed={key}");
|
|
46
44
|
hash.update(key.as_bytes());
|
|
47
45
|
hash.update(env::var(key).unwrap_or_default().as_bytes());
|
|
48
|
-
hash.update(
|
|
46
|
+
hash.update([0]);
|
|
49
47
|
}
|
|
50
48
|
let rustc = std::process::Command::new(env::var("RUSTC").unwrap())
|
|
51
49
|
.arg("--version")
|
|
52
50
|
.output()
|
|
53
51
|
.unwrap();
|
|
54
52
|
hash.update(&rustc.stdout);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
sha256::hex(&hash.finish())
|
|
58
|
-
);
|
|
53
|
+
let digest: String = hash.finalize().iter().map(|b| format!("{b:02x}")).collect();
|
|
54
|
+
println!("cargo:rustc-env=TENSORFS_IMPLEMENTATION_SHA256={digest}");
|
|
59
55
|
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
//! CPU-only process fixture compiling the actual private filesystem guard, not a copy.
|
|
2
|
+
|
|
3
|
+
#[cfg(target_os = "linux")]
|
|
4
|
+
#[path = "../src/filesystem_identity.rs"]
|
|
5
|
+
mod filesystem_identity;
|
|
6
|
+
#[cfg(target_os = "linux")]
|
|
7
|
+
use tensorfs_core::store;
|
|
8
|
+
|
|
9
|
+
#[cfg(target_os = "linux")]
|
|
10
|
+
fn main() -> std::io::Result<()> {
|
|
11
|
+
use std::fs;
|
|
12
|
+
use std::io::{Read, Write};
|
|
13
|
+
use std::os::unix::fs::MetadataExt;
|
|
14
|
+
use std::panic::{catch_unwind, AssertUnwindSafe};
|
|
15
|
+
use std::path::PathBuf;
|
|
16
|
+
|
|
17
|
+
use rustix::process::{
|
|
18
|
+
getpid, parent_process_death_signal, set_parent_process_death_signal, Signal,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
let args: Vec<String> = std::env::args().collect();
|
|
22
|
+
let root = PathBuf::from(&args[2]);
|
|
23
|
+
if args[1] == "setup" {
|
|
24
|
+
store::Store::init(&root).expect("real native Store init");
|
|
25
|
+
return Ok(());
|
|
26
|
+
}
|
|
27
|
+
let signal = match args[3].as_str() {
|
|
28
|
+
"0" => None,
|
|
29
|
+
"9" => Some(Signal::KILL),
|
|
30
|
+
"15" => Some(Signal::TERM),
|
|
31
|
+
_ => panic!("fixture supports disabled, SIGKILL and SIGTERM"),
|
|
32
|
+
};
|
|
33
|
+
set_parent_process_death_signal(signal)?;
|
|
34
|
+
let before = parent_process_death_signal()?.map_or(0, Signal::as_raw);
|
|
35
|
+
let mut in_scope = before;
|
|
36
|
+
let mut file_uid = 0;
|
|
37
|
+
if args[1] == "store" {
|
|
38
|
+
store::Store::open(&root).expect("real native foreign-owner Store open");
|
|
39
|
+
} else {
|
|
40
|
+
let mut operation = || -> std::io::Result<()> {
|
|
41
|
+
let _guard = filesystem_identity::FilesystemIdentity::for_store_root(&root)?;
|
|
42
|
+
in_scope = parent_process_death_signal()?.map_or(0, Signal::as_raw);
|
|
43
|
+
match args[1].as_str() {
|
|
44
|
+
"success" => {
|
|
45
|
+
let path = root.join("guard-fixture-data");
|
|
46
|
+
fs::write(&path, b"real scoped native I/O")?;
|
|
47
|
+
assert_eq!(fs::read(&path)?, b"real scoped native I/O");
|
|
48
|
+
file_uid = fs::metadata(&path)?.uid();
|
|
49
|
+
}
|
|
50
|
+
"error" => {
|
|
51
|
+
assert_eq!(
|
|
52
|
+
fs::read(root.join("absent-fixture-file"))
|
|
53
|
+
.unwrap_err()
|
|
54
|
+
.kind(),
|
|
55
|
+
std::io::ErrorKind::NotFound
|
|
56
|
+
);
|
|
57
|
+
return Err(std::io::Error::other("owned I/O failure"));
|
|
58
|
+
}
|
|
59
|
+
"unwind" => panic!("owned scope unwind"),
|
|
60
|
+
"wait" => {
|
|
61
|
+
println!(
|
|
62
|
+
"{{\"ready\":true,\"guard\":{in_scope},\"pid\":{}}}",
|
|
63
|
+
getpid().as_raw_nonzero()
|
|
64
|
+
);
|
|
65
|
+
std::io::stdout().flush()?;
|
|
66
|
+
std::io::stdin().read_exact(&mut [0])?;
|
|
67
|
+
}
|
|
68
|
+
_ => panic!("unknown fixture operation"),
|
|
69
|
+
}
|
|
70
|
+
Ok(())
|
|
71
|
+
};
|
|
72
|
+
match args[1].as_str() {
|
|
73
|
+
"unwind" => assert!(catch_unwind(AssertUnwindSafe(operation)).is_err()),
|
|
74
|
+
"error" => assert!(operation().is_err()),
|
|
75
|
+
_ => operation()?,
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
let after = parent_process_death_signal()?.map_or(0, Signal::as_raw);
|
|
79
|
+
let maps = fs::read_to_string("/proc/self/maps")?;
|
|
80
|
+
let cuda_mapped = maps.contains("libcuda") || maps.contains("libnvidia");
|
|
81
|
+
println!("{{\"before\":{before},\"in_scope\":{in_scope},\"after\":{after},\"file_uid\":{file_uid},\"cuda_mapped\":{cuda_mapped}}}");
|
|
82
|
+
Ok(())
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#[cfg(not(target_os = "linux"))]
|
|
86
|
+
fn main() {
|
|
87
|
+
eprintln!("Linux-only parent-death credential fixture");
|
|
88
|
+
std::process::exit(2);
|
|
89
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
//! PRODUCER-MINED vector rows (scripts/mine-vectors.py) into the canonical vector document
|
|
2
|
+
//! `vectors/mined/<name>.json`:
|
|
3
|
+
//!
|
|
4
|
+
//! cargo run -p tensorfs-core --example mine-vectors -- <rows> <name> [<match>]
|
|
5
|
+
|
|
6
|
+
use std::process::ExitCode;
|
|
7
|
+
|
|
8
|
+
use tensorfs_core::dtype::Dtype;
|
|
9
|
+
use tensorfs_core::vectors::{Case, EncodingVectors};
|
|
10
|
+
|
|
11
|
+
macro_rules! ok {
|
|
12
|
+
($e:expr) => {
|
|
13
|
+
match $e {
|
|
14
|
+
Ok(v) => v,
|
|
15
|
+
Err(e) => {
|
|
16
|
+
eprintln!("REFUSED {e}");
|
|
17
|
+
return ExitCode::FAILURE;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
fn main() -> ExitCode {
|
|
24
|
+
let args: Vec<String> = std::env::args().skip(1).collect();
|
|
25
|
+
match args.as_slice() {
|
|
26
|
+
[rows, name] => mine(std::path::Path::new(rows), name, ""),
|
|
27
|
+
[rows, name, want] => mine(std::path::Path::new(rows), name, want),
|
|
28
|
+
_ => {
|
|
29
|
+
eprintln!("usage: mine-vectors <rows> <name> [<match>]");
|
|
30
|
+
ExitCode::from(2)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// Turn PRODUCER-MINED rows into the canonical vector document. The rows carry raw bytes
|
|
36
|
+
/// and nothing else; canonicalisation happens here, once, in the one writer.
|
|
37
|
+
fn mine(rows: &std::path::Path, name: &str, want: &str) -> ExitCode {
|
|
38
|
+
let text = match std::fs::read_to_string(rows) {
|
|
39
|
+
Ok(t) => t,
|
|
40
|
+
Err(e) => {
|
|
41
|
+
eprintln!("{}: {e}", rows.display());
|
|
42
|
+
return ExitCode::FAILURE;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
let shape = |s: &str| -> Vec<u64> {
|
|
46
|
+
if s.is_empty() {
|
|
47
|
+
vec![]
|
|
48
|
+
} else {
|
|
49
|
+
s.split(',').filter_map(|d| d.parse().ok()).collect()
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
let mut cases: Vec<Case> = Vec::new();
|
|
54
|
+
let mut cur: Option<Case> = None;
|
|
55
|
+
for line in text.lines() {
|
|
56
|
+
let t: Vec<&str> = line.split_whitespace().collect();
|
|
57
|
+
match t.first().copied() {
|
|
58
|
+
Some("case") => {
|
|
59
|
+
if let Some(c) = cur.take() {
|
|
60
|
+
cases.push(c);
|
|
61
|
+
}
|
|
62
|
+
cur = Some(Case {
|
|
63
|
+
name: t[1].to_string(),
|
|
64
|
+
logical_dtype: Dtype::F32,
|
|
65
|
+
logical_shape: vec![],
|
|
66
|
+
roles: vec![],
|
|
67
|
+
expect_logical_bits: vec![],
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
Some("logical") => {
|
|
71
|
+
if let Some(c) = cur.as_mut() {
|
|
72
|
+
c.logical_dtype = ok!(Dtype::parse(t[1]));
|
|
73
|
+
c.logical_shape = shape(t.get(2).copied().unwrap_or(""));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
Some("expect") => {
|
|
77
|
+
if let Some(c) = cur.as_mut() {
|
|
78
|
+
c.expect_logical_bits = ok!(tensorfs_core::b64::decode(t[1]));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
Some("role") => {
|
|
82
|
+
if let Some(c) = cur.as_mut() {
|
|
83
|
+
let (rname, dt) = (t[1].to_string(), ok!(Dtype::parse(t[2])));
|
|
84
|
+
// a rank-0 role prints an empty shape field, so the payload shifts left
|
|
85
|
+
let (sh, b64) = if t.len() >= 5 {
|
|
86
|
+
(shape(t[3]), t[4])
|
|
87
|
+
} else {
|
|
88
|
+
(vec![], t[3])
|
|
89
|
+
};
|
|
90
|
+
c.roles.push((
|
|
91
|
+
rname,
|
|
92
|
+
tensorfs_core::vectors::RoleBits {
|
|
93
|
+
dtype: dt,
|
|
94
|
+
shape: sh,
|
|
95
|
+
bits: ok!(tensorfs_core::b64::decode(b64)),
|
|
96
|
+
},
|
|
97
|
+
));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
_ => {}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if let Some(c) = cur.take() {
|
|
104
|
+
cases.push(c);
|
|
105
|
+
}
|
|
106
|
+
cases.retain(|c| c.name.contains(want));
|
|
107
|
+
for c in cases.iter_mut() {
|
|
108
|
+
c.roles.sort_by(|a, b| a.0.cmp(&b.0));
|
|
109
|
+
}
|
|
110
|
+
if cases.is_empty() {
|
|
111
|
+
eprintln!("no mined case matches {want:?}");
|
|
112
|
+
return ExitCode::from(2);
|
|
113
|
+
}
|
|
114
|
+
let v = EncodingVectors { cases };
|
|
115
|
+
let bytes = v.fixture_bytes();
|
|
116
|
+
if let Err(e) = EncodingVectors::parse_fixture(&bytes) {
|
|
117
|
+
{
|
|
118
|
+
eprintln!("REFUSED {e}");
|
|
119
|
+
return ExitCode::FAILURE;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
let d: std::path::PathBuf = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
|
|
123
|
+
.join("../../vectors/mined")
|
|
124
|
+
.components()
|
|
125
|
+
.collect();
|
|
126
|
+
if let Err(e) = std::fs::create_dir_all(&d) {
|
|
127
|
+
eprintln!("{}: {e}", d.display());
|
|
128
|
+
return ExitCode::FAILURE;
|
|
129
|
+
}
|
|
130
|
+
let path = d.join(format!("{name}.json"));
|
|
131
|
+
if let Err(e) = std::fs::write(&path, &bytes) {
|
|
132
|
+
eprintln!("{}: {e}", path.display());
|
|
133
|
+
return ExitCode::FAILURE;
|
|
134
|
+
}
|
|
135
|
+
println!("mined {} ({} B)", path.display(), bytes.len());
|
|
136
|
+
println!(" cases {}", v.cases.len());
|
|
137
|
+
println!(
|
|
138
|
+
" fixture_id {}",
|
|
139
|
+
tensorfs_core::ids::object_id(&v.fixture_bytes())
|
|
140
|
+
);
|
|
141
|
+
for c in &v.cases {
|
|
142
|
+
println!(
|
|
143
|
+
" {:<34} logical {} {:?}, roles {:?}",
|
|
144
|
+
c.name,
|
|
145
|
+
c.logical_dtype.name(),
|
|
146
|
+
c.logical_shape,
|
|
147
|
+
c.roles.iter().map(|(n, _)| n.as_str()).collect::<Vec<_>>()
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
ExitCode::SUCCESS
|
|
151
|
+
}
|
|
152
|
+
|
{tensorfs-0.3.92 → tensorfs-0.6.0}/crates/tensorfs-core/examples/resident_conversion_profile.rs
RENAMED
|
@@ -105,7 +105,7 @@ fn main() {
|
|
|
105
105
|
.filter(|s| s.alias == "plain/1")
|
|
106
106
|
.map(|s| (s.alias.to_string(), s.spec))
|
|
107
107
|
.collect::<Vec<_>>();
|
|
108
|
-
let mut plan = convert::plan(conv, &sources, &target, &specs
|
|
108
|
+
let mut plan = convert::plan(conv, &sources, &target, &specs).unwrap();
|
|
109
109
|
let order = plan
|
|
110
110
|
.ops
|
|
111
111
|
.iter()
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//! Canonical padded RFC 4648 base64: the `base64` crate's STANDARD engine, which requires
|
|
2
|
+
//! canonical padding and refuses trailing bits, so a decode re-encodes to its input.
|
|
3
|
+
|
|
4
|
+
use base64::{engine::general_purpose::STANDARD, Engine};
|
|
5
|
+
|
|
6
|
+
use crate::err::{Code, Refusal, Result};
|
|
7
|
+
|
|
8
|
+
pub fn encode(data: &[u8]) -> String {
|
|
9
|
+
STANDARD.encode(data)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
pub fn decode(s: &str) -> Result<Vec<u8>> {
|
|
13
|
+
STANDARD.decode(s).map_err(|e| Refusal {
|
|
14
|
+
code: Code::BAD_BASE64,
|
|
15
|
+
detail: e.to_string(),
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#[cfg(test)]
|
|
20
|
+
mod tests {
|
|
21
|
+
use super::*;
|
|
22
|
+
|
|
23
|
+
#[test]
|
|
24
|
+
fn round_trips_and_refuses_what_is_not_canonical() {
|
|
25
|
+
for data in [&b""[..], b"f", b"fo", b"foo", b"foob", b"fooba", b"foobar"] {
|
|
26
|
+
assert_eq!(decode(&encode(data)).unwrap(), data);
|
|
27
|
+
}
|
|
28
|
+
assert_eq!(encode(b"foobar"), "Zm9vYmFy");
|
|
29
|
+
for bad in ["Zg", "Zg=", "Zh==", "Zm9v\n", " Zm9v", "Zm9v====", "Zm=9", "Z===", "Zm9vYg", "Zm9vYh==", "@@@@"] {
|
|
30
|
+
assert_eq!(decode(bad).unwrap_err().code, Code::BAD_BASE64, "{bad:?}");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|