tensorfs 0.3.80__tar.gz → 0.3.81__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.80 → tensorfs-0.3.81}/Cargo.lock +2 -2
- {tensorfs-0.3.80 → tensorfs-0.3.81}/Cargo.toml +1 -1
- {tensorfs-0.3.80 → tensorfs-0.3.81}/PKG-INFO +1 -1
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/hub.rs +32 -25
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/pull.rs +8 -26
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/ranged.rs +241 -68
- tensorfs-0.3.81/crates/tensorfs-core/src/transport/speculate.rs +491 -0
- tensorfs-0.3.81/crates/tensorfs-core/src/transport/tests/tail.rs +225 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/tests.rs +71 -46
- tensorfs-0.3.81/crates/tensorfs-core/tests/fetch_faults.rs +1366 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/pyproject.toml +1 -1
- tensorfs-0.3.80/crates/tensorfs-core/src/transport/speculate.rs +0 -403
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/build.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/cache_roots.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/roots.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/descriptors.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/disk.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ensure.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/err.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/gc.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/source.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/machine.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/meta.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/providers.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/source_artifact.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/staging.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/stats.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/pace.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/unsynced.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/as_is.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/ensure.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_download.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/staging.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/trust_index.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/ensure.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/store.rs +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_derived_channel.py +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_ext.pyi +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_source_channel.py +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_tensors.py +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/derived.py +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/py.typed +0 -0
|
@@ -439,7 +439,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
439
439
|
|
|
440
440
|
[[package]]
|
|
441
441
|
name = "tensorfs-core"
|
|
442
|
-
version = "0.3.
|
|
442
|
+
version = "0.3.81"
|
|
443
443
|
dependencies = [
|
|
444
444
|
"fs2",
|
|
445
445
|
"libc",
|
|
@@ -454,7 +454,7 @@ dependencies = [
|
|
|
454
454
|
|
|
455
455
|
[[package]]
|
|
456
456
|
name = "tensorfs-py"
|
|
457
|
-
version = "0.3.
|
|
457
|
+
version = "0.3.81"
|
|
458
458
|
dependencies = [
|
|
459
459
|
"pyo3",
|
|
460
460
|
"tensorfs-core",
|
|
@@ -490,15 +490,20 @@ fn call(
|
|
|
490
490
|
Err(Retryable { refusal, .. }) if refusal.code == Code::TRANSFER_FAILED => {
|
|
491
491
|
return Err(refusal)
|
|
492
492
|
}
|
|
493
|
-
// A zero wait is a verdict: re-asking reaches the same answer.
|
|
493
|
+
// A zero wait is a verdict: re-asking reaches the same answer. A wait is spent in
|
|
494
|
+
// sampling ticks, so the caller's cancellation and deadline end it: a bare sleep
|
|
495
|
+
// here held a prefetch run 2322 had already cancelled for the whole 30 s floor.
|
|
494
496
|
Err(Retryable { wait, refusal }) if !final_attempt && !wait.is_zero() => {
|
|
495
|
-
// A wait is spent out of the caller's budget, never past it.
|
|
496
|
-
let wait = match deadline.remaining()? {
|
|
497
|
-
Some(left) => wait.min(left),
|
|
498
|
-
None => wait,
|
|
499
|
-
};
|
|
500
497
|
last = Some(refusal);
|
|
501
|
-
|
|
498
|
+
ledger.pause(wait, deadline)?;
|
|
499
|
+
}
|
|
500
|
+
// Still weather on the last ask: the hub said "not now" every time, never "no".
|
|
501
|
+
// Its own code stays in the detail; the verdict a caller retries on is the link's.
|
|
502
|
+
Err(Retryable { wait, refusal }) if !wait.is_zero() => {
|
|
503
|
+
return refuse(
|
|
504
|
+
Code::HUB_UNREACHABLE,
|
|
505
|
+
format!("{} — on all {attempt} asks", refusal.detail),
|
|
506
|
+
)
|
|
502
507
|
}
|
|
503
508
|
Err(Retryable { refusal, .. }) => return Err(refusal),
|
|
504
509
|
}
|
|
@@ -539,6 +544,22 @@ fn call_once(
|
|
|
539
544
|
let checked = policy.check(&url).map_err(Retryable::from)?;
|
|
540
545
|
let mut headers = vec![("content-type".to_string(), "application/json".to_string())];
|
|
541
546
|
headers.extend(credential.headers(&checked.host));
|
|
547
|
+
// A hub that did not answer, or whose answer died on the wire, is weather, not a
|
|
548
|
+
// verdict: the same request may reach it on the next connection.
|
|
549
|
+
let weather = |refusal: Refusal| match refusal.code {
|
|
550
|
+
Code::HUB_UNREACHABLE => Retryable {
|
|
551
|
+
wait: ledger.patience(),
|
|
552
|
+
refusal: Refusal {
|
|
553
|
+
code: Code::HUB_UNREACHABLE,
|
|
554
|
+
detail: format!(
|
|
555
|
+
"the hub at {base} did not answer {path} — {}; artifacts already in the \
|
|
556
|
+
local store are usable offline",
|
|
557
|
+
refusal.detail
|
|
558
|
+
),
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
_ => Retryable::from(refusal),
|
|
562
|
+
};
|
|
542
563
|
let response = crate::transport::http::request(
|
|
543
564
|
client,
|
|
544
565
|
&checked,
|
|
@@ -557,26 +578,11 @@ fn call_once(
|
|
|
557
578
|
None,
|
|
558
579
|
Code::HUB_UNREACHABLE,
|
|
559
580
|
)
|
|
560
|
-
.map_err(
|
|
561
|
-
// A hub that did not answer at all is weather, not a verdict: the same request may
|
|
562
|
-
// reach it on the next connection.
|
|
563
|
-
Code::HUB_UNREACHABLE => Retryable {
|
|
564
|
-
wait: ledger.patience(),
|
|
565
|
-
refusal: Refusal {
|
|
566
|
-
code: Code::HUB_UNREACHABLE,
|
|
567
|
-
detail: format!(
|
|
568
|
-
"the hub at {base} did not answer {path} — {}; artifacts already in the \
|
|
569
|
-
local store are usable offline",
|
|
570
|
-
refusal.detail
|
|
571
|
-
),
|
|
572
|
-
},
|
|
573
|
-
},
|
|
574
|
-
_ => Retryable::from(refusal),
|
|
575
|
-
})?;
|
|
581
|
+
.map_err(weather)?;
|
|
576
582
|
let status = response.status;
|
|
577
583
|
let raw = response
|
|
578
584
|
.read_capped(limits::DOC_MAX_BYTES)
|
|
579
|
-
.map_err(
|
|
585
|
+
.map_err(weather)?;
|
|
580
586
|
if (200..300).contains(&status) {
|
|
581
587
|
return read_json(&raw, limits::DOC_MAX_BYTES).map_err(|refusal| {
|
|
582
588
|
Retryable::from(Refusal {
|
|
@@ -603,7 +609,8 @@ fn call_once(
|
|
|
603
609
|
refusal: Refusal {
|
|
604
610
|
code: Code::HUB_UNREACHABLE,
|
|
605
611
|
detail: format!(
|
|
606
|
-
"{base}{path} answered HTTP {status} with no hub envelope, so the hub
|
|
612
|
+
"{base}{path} answered HTTP {status} with no hub envelope, so the hub did not \
|
|
613
|
+
write it; artifacts already in the local store are usable offline"
|
|
607
614
|
),
|
|
608
615
|
},
|
|
609
616
|
});
|
|
@@ -227,7 +227,6 @@ pub fn fetch_authorized(
|
|
|
227
227
|
observer,
|
|
228
228
|
&AtomicU32::new(0),
|
|
229
229
|
true,
|
|
230
|
-
None,
|
|
231
230
|
shared_client(),
|
|
232
231
|
None,
|
|
233
232
|
)
|
|
@@ -245,7 +244,6 @@ pub(super) fn fetch_with_attempts(
|
|
|
245
244
|
mut observer: Option<&mut dyn FetchObserver>,
|
|
246
245
|
attempts: &AtomicU32,
|
|
247
246
|
retry: bool,
|
|
248
|
-
slots: Option<&super::speculate::Slots>,
|
|
249
247
|
client: &Client,
|
|
250
248
|
received: Option<&(dyn Fn() + Sync)>,
|
|
251
249
|
) -> Result<Fetched> {
|
|
@@ -269,7 +267,7 @@ pub(super) fn fetch_with_attempts(
|
|
|
269
267
|
// A refused re-authorization must still name the origin's answer. It is the whole
|
|
270
268
|
// diagnosis: "403, and re-minting was not honest" and "403, and the hub would not
|
|
271
269
|
// mint" are different problems with different owners.
|
|
272
|
-
let
|
|
270
|
+
let url = match authorize(stale.is_some(), ledger) {
|
|
273
271
|
Ok(url) => url,
|
|
274
272
|
Err(refusal) => match stale {
|
|
275
273
|
Some(status) => {
|
|
@@ -286,16 +284,6 @@ pub(super) fn fetch_with_attempts(
|
|
|
286
284
|
},
|
|
287
285
|
};
|
|
288
286
|
stale = None;
|
|
289
|
-
// Grant preparation remains concurrent even when the object stream
|
|
290
|
-
// budget is occupied; a slow mint must not serialize healthy transfers.
|
|
291
|
-
let mut slot = slots
|
|
292
|
-
.map(|slots| slots.acquire(ledger, deadline))
|
|
293
|
-
.transpose()?;
|
|
294
|
-
if slot.as_ref().is_some_and(|slot| slot.waited) {
|
|
295
|
-
// The body permit can outlive a URL. Reconsult its authority after
|
|
296
|
-
// waiting; Leases reuses a fresh grant and remints an expired one.
|
|
297
|
-
url = authorize(false, ledger)?;
|
|
298
|
-
}
|
|
299
287
|
// Every hop of this ask, recorded as it is walked and announced before the body is
|
|
300
288
|
// read: an ask that dies in the middle still says which host answered it and how.
|
|
301
289
|
let mut hops: Vec<(String, u16)> = Vec::new();
|
|
@@ -340,7 +328,6 @@ pub(super) fn fetch_with_attempts(
|
|
|
340
328
|
// The origin said when to come back; that is not a failed ask.
|
|
341
329
|
attempts.fetch_sub(1, Ordering::AcqRel);
|
|
342
330
|
}
|
|
343
|
-
drop(slot);
|
|
344
331
|
ledger.pause(wait, deadline)?;
|
|
345
332
|
continue;
|
|
346
333
|
}
|
|
@@ -376,7 +363,6 @@ pub(super) fn fetch_with_attempts(
|
|
|
376
363
|
// Every byte is here: the socket slot is free for the next object while this
|
|
377
364
|
// one is fsynced and admitted, so a slow disk is not a slow network.
|
|
378
365
|
received: || {
|
|
379
|
-
slot.take();
|
|
380
366
|
if let Some(received) = received {
|
|
381
367
|
received();
|
|
382
368
|
}
|
|
@@ -486,7 +472,7 @@ pub(super) fn open_object<'l>(
|
|
|
486
472
|
)?;
|
|
487
473
|
let status = response.status;
|
|
488
474
|
hop(&checked, status);
|
|
489
|
-
if status == 200 {
|
|
475
|
+
if status == 200 || status == 206 {
|
|
490
476
|
ledger.origin(&format!(
|
|
491
477
|
"{}://{}:{}",
|
|
492
478
|
if checked.https { "https" } else { "http" },
|
|
@@ -956,7 +942,6 @@ pub fn fetch_wanted(
|
|
|
956
942
|
) -> Result<WalkOutcome> {
|
|
957
943
|
fetch_wanted_bounded(
|
|
958
944
|
store, plan, urls, policy, credential, deadline, ledger, STREAMS, streams, on_object, None,
|
|
959
|
-
None,
|
|
960
945
|
)
|
|
961
946
|
}
|
|
962
947
|
|
|
@@ -972,7 +957,6 @@ pub(super) fn fetch_wanted_bounded(
|
|
|
972
957
|
start: usize,
|
|
973
958
|
streams: usize,
|
|
974
959
|
on_object: Option<ObjectObserver<'_>>,
|
|
975
|
-
download_budget: Option<(u64, u64)>,
|
|
976
960
|
cache_writes: Option<&crate::repo_cache::CacheWriteReceipt>,
|
|
977
961
|
) -> Result<WalkOutcome> {
|
|
978
962
|
let cache = store.repo_cache();
|
|
@@ -991,8 +975,8 @@ pub(super) fn fetch_wanted_bounded(
|
|
|
991
975
|
let streams = crate::descriptors::streams_within(super::memory::transfer_streams(
|
|
992
976
|
streams.clamp(1, PULL_STREAMS),
|
|
993
977
|
));
|
|
994
|
-
let recovery = super::speculate::Recovery::
|
|
995
|
-
//
|
|
978
|
+
let recovery = super::speculate::Recovery::default();
|
|
979
|
+
// A stream's
|
|
996
980
|
// permit is released once its body is in, so its thread may still be fsyncing and
|
|
997
981
|
// admitting while another thread uses the permit: twice the threads keeps the permits
|
|
998
982
|
// busy however slow the disk is.
|
|
@@ -1100,11 +1084,10 @@ pub(super) fn fetch_wanted_bounded(
|
|
|
1100
1084
|
credential,
|
|
1101
1085
|
deadline,
|
|
1102
1086
|
ledger,
|
|
1103
|
-
&|| {
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
) < pace.limit() as u64
|
|
1087
|
+
&|| super::speculate::Lanes {
|
|
1088
|
+
level: pace.limit(),
|
|
1089
|
+
busy: busy.load(Ordering::Acquire),
|
|
1090
|
+
tail: next.load(Ordering::Acquire) >= plan.wanted.len(),
|
|
1108
1091
|
},
|
|
1109
1092
|
Some(&received),
|
|
1110
1093
|
)?;
|
|
@@ -1489,7 +1472,6 @@ pub fn pull(request: &PullRequest<'_>) -> Result<PullReport> {
|
|
|
1489
1472
|
request.streams_start,
|
|
1490
1473
|
request.streams,
|
|
1491
1474
|
request.on_object,
|
|
1492
|
-
request.download_budget,
|
|
1493
1475
|
Some(&report.cache_writes),
|
|
1494
1476
|
)?;
|
|
1495
1477
|
report.streams = walked.streams;
|