tensorfs 0.3.91__tar.gz → 0.3.93__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.91 → tensorfs-0.3.93}/Cargo.lock +3 -3
- {tensorfs-0.3.91 → tensorfs-0.3.93}/Cargo.toml +1 -1
- {tensorfs-0.3.91 → tensorfs-0.3.93}/PKG-INFO +1 -1
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/API.md +16 -1
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/io.rs +42 -10
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/plane.rs +6 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/common/mod.rs +3 -1
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/plane.rs +3 -1
- {tensorfs-0.3.91 → tensorfs-0.3.93}/pyproject.toml +1 -1
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/plane.pyi +4 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/build.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/cache_roots.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/roots.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/descriptors.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/disk.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ensure.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/err.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/gc.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/source.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/machine.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/meta.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/providers.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/source_artifact.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/staging.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/stats.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/download.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/hub.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/pull.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/sources.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/tests.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/unsynced.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/as_is.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/ensure.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fetch_faults.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_download.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/staging.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/trust_index.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/Cargo.toml +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/cuda.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/cursor.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/device.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/faults.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/host.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/layout.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/lib.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/census.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/gpu.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/host_tier.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/ensure.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/store.rs +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_derived_channel.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_ext.pyi +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_source_channel.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_tensors.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/derived.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/plane.py +0 -0
- {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/py.typed +0 -0
|
@@ -449,7 +449,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
449
449
|
|
|
450
450
|
[[package]]
|
|
451
451
|
name = "tensorfs-core"
|
|
452
|
-
version = "0.3.
|
|
452
|
+
version = "0.3.93"
|
|
453
453
|
dependencies = [
|
|
454
454
|
"fs2",
|
|
455
455
|
"libc",
|
|
@@ -464,7 +464,7 @@ dependencies = [
|
|
|
464
464
|
|
|
465
465
|
[[package]]
|
|
466
466
|
name = "tensorfs-plane"
|
|
467
|
-
version = "0.3.
|
|
467
|
+
version = "0.3.93"
|
|
468
468
|
dependencies = [
|
|
469
469
|
"libc",
|
|
470
470
|
"libloading",
|
|
@@ -474,7 +474,7 @@ dependencies = [
|
|
|
474
474
|
|
|
475
475
|
[[package]]
|
|
476
476
|
name = "tensorfs-py"
|
|
477
|
-
version = "0.3.
|
|
477
|
+
version = "0.3.93"
|
|
478
478
|
dependencies = [
|
|
479
479
|
"pyo3",
|
|
480
480
|
"tensorfs-core",
|
|
@@ -195,12 +195,13 @@ are equal-sized).
|
|
|
195
195
|
p.stats() -> {
|
|
196
196
|
"host": {"budget", "used", "ready_bytes", "registered_bytes", "memfd_bytes",
|
|
197
197
|
"cached_bytes", "direct_bytes", "buffered_bytes", "inline_bytes", "direct_refused",
|
|
198
|
-
"disk_read_bytes",
|
|
198
|
+
"map_refused", "disk_read_bytes",
|
|
199
199
|
"fills", "fill_bytes", "fill_ns", "evictions", "evicted_bytes", "register_failed",
|
|
200
200
|
"trims"},
|
|
201
201
|
"devices": [{"ordinal", "uuid", "granularity", "exportable", "budget", "committed", "mapped",
|
|
202
202
|
"idle", "leased_bytes", "held_bytes", "over_budget_unreleasable", "reserved_va",
|
|
203
203
|
"copies", "host_copy_bytes", "host_copy_ns", "disk_copy_bytes", "disk_copy_ns",
|
|
204
|
+
"mapped_copy_bytes", "mapped_copy_ns",
|
|
204
205
|
"misses", "evictions", "evicted_bytes", "trims"}],
|
|
205
206
|
"sets": [{"id", "name", "nbytes", "regions", "host_ready_bytes", "host_memfd_bytes",
|
|
206
207
|
"evictions", "evicted_bytes", "devices": [{"ordinal", "ready_bytes"}]}],
|
|
@@ -280,6 +281,20 @@ an unclosed plane ends.
|
|
|
280
281
|
|
|
281
282
|
## Changelog
|
|
282
283
|
|
|
284
|
+
- v3.4 2026-10-02: the mapped device copy of v3.3 is removed; a device fill is again pinned
|
|
285
|
+
tier, else after a filling tier, else staging. In real first loads it never acted at full
|
|
286
|
+
CPU (the tier was ready first) and was slower where it did (L4 held to 4 CPUs, warm cache:
|
|
287
|
+
SDXL load to denoise 6.44 s -> 7.54 s, Anima 5.54 s -> 8.31 s): the pinned fill copied the
|
|
288
|
+
same bytes beside it. `mapped_copy_bytes`, `mapped_copy_ns` and `map_refused` stay in
|
|
289
|
+
`stats()` and read 0. Kept from v3.3: the page-cache query that answers on overlayfs and
|
|
290
|
+
where seccomp refuses `cachestat` (a pinned fill there copies cached bytes instead of
|
|
291
|
+
re-reading them), and `stats()["host"]["disk_read_bytes"]`.
|
|
292
|
+
|
|
293
|
+
- v3.3 2026-10-02: `stats()["host"]["disk_read_bytes"]` exists. The plane has counted it
|
|
294
|
+
since v3.1 and this file listed it, but the Python facade never carried it: a caller read 0
|
|
295
|
+
whatever the disk did, so a "nothing read from disk" check on it could not fail. (v3.3 also
|
|
296
|
+
added a device copy from page-cache mappings; v3.4 removed it.)
|
|
297
|
+
|
|
283
298
|
- v3.2 2026-10-02 (W3: fd and thread growth per weight set): a plane collected unclosed or
|
|
284
299
|
poisoned is torn down at its last handle (threads, device memory, pinned memfds) once its
|
|
285
300
|
devices are synchronized; before, its reader threads stayed and a poisoned plane kept its
|
|
@@ -42,6 +42,8 @@ pub enum Mode {
|
|
|
42
42
|
struct Fds {
|
|
43
43
|
buffered: File,
|
|
44
44
|
direct: Option<File>,
|
|
45
|
+
/// On overlayfs (a container's root): the file reports no page cache of its own.
|
|
46
|
+
overlay: bool,
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
pub struct Source {
|
|
@@ -54,9 +56,11 @@ pub struct Source {
|
|
|
54
56
|
}
|
|
55
57
|
|
|
56
58
|
/// Whether the page cache holds every page of `[off, off+len)`, from `cachestat(2)`: a pure
|
|
57
|
-
/// query (unlike an `RWF_NOWAIT` read, which starts readahead on a miss).
|
|
58
|
-
/// kernel
|
|
59
|
-
|
|
59
|
+
/// query (unlike an `RWF_NOWAIT` read, which starts readahead on a miss). Where that cannot
|
|
60
|
+
/// answer, the pages are counted through a mapping: a kernel without it (< 6.5), a container
|
|
61
|
+
/// whose seccomp filter refuses it, and overlayfs (a container's root), whose files report no
|
|
62
|
+
/// pages of their own.
|
|
63
|
+
fn cached(f: &Fds, off: u64, len: u64) -> bool {
|
|
60
64
|
#[repr(C)]
|
|
61
65
|
struct Range {
|
|
62
66
|
off: u64,
|
|
@@ -75,12 +79,40 @@ fn cached(f: &File, off: u64, len: u64) -> Option<bool> {
|
|
|
75
79
|
let r = Range { off, len };
|
|
76
80
|
let mut st = Stat::default();
|
|
77
81
|
// SAFETY: the documented cachestat ABI; both structs outlive the call.
|
|
78
|
-
let rc = unsafe { libc::syscall(SYS_CACHESTAT, f.as_raw_fd(), &r, &mut st, 0) };
|
|
79
|
-
if rc != 0 {
|
|
80
|
-
return None;
|
|
81
|
-
}
|
|
82
|
+
let rc = unsafe { libc::syscall(SYS_CACHESTAT, f.buffered.as_raw_fd(), &r, &mut st, 0) };
|
|
82
83
|
let page = 4096u64;
|
|
83
|
-
|
|
84
|
+
if rc == 0 && st.nr_cache >= (off + len).div_ceil(page) - off / page {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
(rc != 0 || f.overlay) && resident(&f.buffered, off, len)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
fn overlay(f: &File) -> bool {
|
|
91
|
+
const OVERLAYFS_SUPER_MAGIC: i64 = 0x794c7630;
|
|
92
|
+
// SAFETY: out-param of the right type on our own descriptor.
|
|
93
|
+
let mut fs: libc::statfs = unsafe { std::mem::zeroed() };
|
|
94
|
+
#[allow(clippy::unnecessary_cast)] // f_type is not an i64 on every target
|
|
95
|
+
let magic = unsafe { libc::fstatfs(f.as_raw_fd(), &mut fs) == 0 }.then_some(fs.f_type as i64);
|
|
96
|
+
magic == Some(OVERLAYFS_SUPER_MAGIC)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/// Every page of `[off, off+len)` is in core, by `mincore(2)` over a mapping (never faults).
|
|
100
|
+
fn resident(f: &File, off: u64, len: u64) -> bool {
|
|
101
|
+
let start = off - off % 4096;
|
|
102
|
+
let n = (off + len - start) as usize;
|
|
103
|
+
if n == 0 {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
// SAFETY: a read-only shared mapping of our descriptor, unmapped below.
|
|
107
|
+
let p = unsafe { libc::mmap(std::ptr::null_mut(), n, libc::PROT_READ, libc::MAP_SHARED, f.as_raw_fd(), start as libc::off_t) };
|
|
108
|
+
if p == libc::MAP_FAILED {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
let mut pages = vec![0u8; n.div_ceil(4096)];
|
|
112
|
+
// SAFETY: the vector holds one byte per page of the mapping.
|
|
113
|
+
let ok = unsafe { libc::mincore(p, n, pages.as_mut_ptr()) } == 0 && pages.iter().all(|b| b & 1 == 1);
|
|
114
|
+
unsafe { libc::munmap(p, n) };
|
|
115
|
+
ok
|
|
84
116
|
}
|
|
85
117
|
|
|
86
118
|
impl Source {
|
|
@@ -138,7 +170,7 @@ impl Source {
|
|
|
138
170
|
} else {
|
|
139
171
|
None
|
|
140
172
|
};
|
|
141
|
-
let f = Arc::new(Fds { buffered, direct });
|
|
173
|
+
let f = Arc::new(Fds { overlay: overlay(&buffered), buffered, direct });
|
|
142
174
|
self.fds.lock().unwrap().insert(obj.sha256.clone(), f.clone());
|
|
143
175
|
Ok(f)
|
|
144
176
|
}
|
|
@@ -169,7 +201,7 @@ impl Source {
|
|
|
169
201
|
let end = o.off + item.len;
|
|
170
202
|
let aligned = (dst as u64).wrapping_sub(o.off).is_multiple_of(a) && (end.is_multiple_of(a) || item.part_end);
|
|
171
203
|
let direct = match (mode, &fds.direct) {
|
|
172
|
-
(Mode::Cache, Some(f)) if aligned && !cached(&fds
|
|
204
|
+
(Mode::Cache, Some(f)) if aligned && !cached(&fds, o.off, item.len) => f,
|
|
173
205
|
_ => {
|
|
174
206
|
read::read_into(lease, o, buf)?;
|
|
175
207
|
let t = if mode == Mode::Buffered { &tally.buffered_bytes } else { &tally.cached_bytes };
|
|
@@ -161,6 +161,10 @@ pub struct DevCounters {
|
|
|
161
161
|
pub host_copy_ns: u64,
|
|
162
162
|
pub disk_copy_bytes: u64,
|
|
163
163
|
pub disk_copy_ns: u64,
|
|
164
|
+
/// 0.3.92's copies from page-cache mappings, removed in 0.3.93: always 0, kept for callers
|
|
165
|
+
/// that read them.
|
|
166
|
+
pub mapped_copy_bytes: u64,
|
|
167
|
+
pub mapped_copy_ns: u64,
|
|
164
168
|
pub misses: u64,
|
|
165
169
|
pub evictions: u64,
|
|
166
170
|
pub evicted_bytes: u64,
|
|
@@ -1636,6 +1640,8 @@ pub struct HostStats {
|
|
|
1636
1640
|
pub buffered_bytes: u64,
|
|
1637
1641
|
pub inline_bytes: u64,
|
|
1638
1642
|
pub direct_refused: u64,
|
|
1643
|
+
/// Always 0 since 0.3.93 (see `mapped_copy_bytes`).
|
|
1644
|
+
pub map_refused: u64,
|
|
1639
1645
|
/// Bytes this process caused the block layer to read (`/proc/self/io` read_bytes).
|
|
1640
1646
|
pub disk_read_bytes: u64,
|
|
1641
1647
|
pub counters: HostCounters,
|
|
@@ -118,10 +118,12 @@ impl Fixture {
|
|
|
118
118
|
.unwrap_or(0)
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
/// Evict our own blob files from the page cache so a fill has to go to disk.
|
|
121
|
+
/// Evict our own blob files from the page cache so a fill has to go to disk. Written back
|
|
122
|
+
/// first: a dirty page stays whatever the advice.
|
|
122
123
|
pub fn drop_cache(&self) {
|
|
123
124
|
for o in &self.objects {
|
|
124
125
|
let f = std::fs::File::open(self.store.blob_path(&o.sha256)).unwrap();
|
|
126
|
+
f.sync_all().unwrap();
|
|
125
127
|
// SAFETY: advice on our own descriptor.
|
|
126
128
|
unsafe { libc::posix_fadvise(f.as_raw_fd(), 0, 0, libc::POSIX_FADV_DONTNEED) };
|
|
127
129
|
}
|
|
@@ -120,7 +120,8 @@ fn stats<'p>(py: Python<'p>, s: Stats) -> PyResult<Bound<'p, PyDict>> {
|
|
|
120
120
|
"registered_bytes" => h.registered_bytes, "memfd_bytes" => h.memfd_bytes,
|
|
121
121
|
"cached_bytes" => h.cached_bytes, "direct_bytes" => h.direct_bytes,
|
|
122
122
|
"buffered_bytes" => h.buffered_bytes, "inline_bytes" => h.inline_bytes,
|
|
123
|
-
"direct_refused" => h.direct_refused, "
|
|
123
|
+
"direct_refused" => h.direct_refused, "map_refused" => h.map_refused,
|
|
124
|
+
"disk_read_bytes" => h.disk_read_bytes, "fills" => c.fills, "fill_bytes" => c.fill_bytes,
|
|
124
125
|
"fill_ns" => c.fill_ns, "evictions" => c.evictions, "evicted_bytes" => c.evicted_bytes,
|
|
125
126
|
"register_failed" => c.register_failed, "trims" => c.trims,
|
|
126
127
|
);
|
|
@@ -135,6 +136,7 @@ fn stats<'p>(py: Python<'p>, s: Stats) -> PyResult<Bound<'p, PyDict>> {
|
|
|
135
136
|
"reserved_va" => d.reserved_va, "copies" => c.copies,
|
|
136
137
|
"host_copy_bytes" => c.host_copy_bytes, "host_copy_ns" => c.host_copy_ns,
|
|
137
138
|
"disk_copy_bytes" => c.disk_copy_bytes, "disk_copy_ns" => c.disk_copy_ns,
|
|
139
|
+
"mapped_copy_bytes" => c.mapped_copy_bytes, "mapped_copy_ns" => c.mapped_copy_ns,
|
|
138
140
|
"misses" => c.misses, "evictions" => c.evictions, "evicted_bytes" => c.evicted_bytes,
|
|
139
141
|
"trims" => c.trims,
|
|
140
142
|
))?;
|
|
@@ -42,6 +42,8 @@ class HostStats(TypedDict):
|
|
|
42
42
|
buffered_bytes: int
|
|
43
43
|
inline_bytes: int
|
|
44
44
|
direct_refused: int
|
|
45
|
+
map_refused: int # always 0 since 0.3.93
|
|
46
|
+
disk_read_bytes: int # read from storage by this process, from /proc/self/io
|
|
45
47
|
fills: int
|
|
46
48
|
fill_bytes: int
|
|
47
49
|
fill_ns: int
|
|
@@ -68,6 +70,8 @@ class DeviceStats(TypedDict):
|
|
|
68
70
|
host_copy_ns: int
|
|
69
71
|
disk_copy_bytes: int
|
|
70
72
|
disk_copy_ns: int
|
|
73
|
+
mapped_copy_bytes: int # always 0 since 0.3.93 (0.3.92 copied from page-cache mappings)
|
|
74
|
+
mapped_copy_ns: int
|
|
71
75
|
misses: int
|
|
72
76
|
evictions: int
|
|
73
77
|
evicted_bytes: int
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/optional-cache-backfill.md
RENAMED
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/resident_conversion_profile.rs
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
|
|
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
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/anima.routes.json
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
|
|
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
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor
RENAMED
|
File without changes
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json
RENAMED
|
File without changes
|
{tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json
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
|
|
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
|