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.
Files changed (183) hide show
  1. {tensorfs-0.3.80 → tensorfs-0.3.81}/Cargo.lock +2 -2
  2. {tensorfs-0.3.80 → tensorfs-0.3.81}/Cargo.toml +1 -1
  3. {tensorfs-0.3.80 → tensorfs-0.3.81}/PKG-INFO +1 -1
  4. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/hub.rs +32 -25
  5. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/pull.rs +8 -26
  6. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/ranged.rs +241 -68
  7. tensorfs-0.3.81/crates/tensorfs-core/src/transport/speculate.rs +491 -0
  8. tensorfs-0.3.81/crates/tensorfs-core/src/transport/tests/tail.rs +225 -0
  9. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/tests.rs +71 -46
  10. tensorfs-0.3.81/crates/tensorfs-core/tests/fetch_faults.rs +1366 -0
  11. {tensorfs-0.3.80 → tensorfs-0.3.81}/pyproject.toml +1 -1
  12. tensorfs-0.3.80/crates/tensorfs-core/src/transport/speculate.rs +0 -403
  13. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/Cargo.toml +0 -0
  14. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/build.rs +0 -0
  15. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  16. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  17. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  18. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  19. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/asset_update.rs +0 -0
  20. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/b64.rs +0 -0
  21. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  22. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  23. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
  24. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  25. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  26. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  27. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  28. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  29. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  30. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  31. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  32. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/canon.rs +0 -0
  33. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/capability.rs +0 -0
  34. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  35. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/catalog.rs +0 -0
  36. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/cbor.rs +0 -0
  37. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  38. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  39. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/corpus.rs +0 -0
  40. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  41. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  42. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  43. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  44. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  45. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  46. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  47. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  48. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  49. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  50. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  51. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/derived.rs +0 -0
  52. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/descriptors.rs +0 -0
  53. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/disk.rs +0 -0
  54. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/dtype.rs +0 -0
  55. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/durability.rs +0 -0
  56. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
  57. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
  58. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ensure.rs +0 -0
  59. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/err.rs +0 -0
  60. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/fetch.rs +0 -0
  61. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
  62. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/fill.rs +0 -0
  63. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/fit.rs +0 -0
  64. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/gc.rs +0 -0
  65. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/header.rs +0 -0
  66. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/home.rs +0 -0
  67. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ids.rs +0 -0
  68. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  69. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  70. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  71. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  72. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  73. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  74. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  75. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  76. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  77. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  78. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
  79. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
  80. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  81. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  82. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  83. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  84. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  85. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  86. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/jcs.rs +0 -0
  87. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/lib.rs +0 -0
  88. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/limits.rs +0 -0
  89. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/machine.rs +0 -0
  90. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/manifest.rs +0 -0
  91. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/meta.rs +0 -0
  92. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/project.rs +0 -0
  93. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/providers.rs +0 -0
  94. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/read.rs +0 -0
  95. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/receipt.rs +0 -0
  96. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/reclaim.rs +0 -0
  97. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/registry.rs +0 -0
  98. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/relation.rs +0 -0
  99. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  100. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/repository.rs +0 -0
  101. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/sha256.rs +0 -0
  102. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  103. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/spec.rs +0 -0
  104. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/staging.rs +0 -0
  105. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/stats.rs +0 -0
  106. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/storage.rs +0 -0
  107. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/store.rs +0 -0
  108. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/api.rs +0 -0
  109. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/http.rs +0 -0
  110. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  111. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  112. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  113. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  114. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/pace.rs +0 -0
  115. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  116. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
  117. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/transport/push.rs +0 -0
  118. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/unsynced.rs +0 -0
  119. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/src/vectors.rs +0 -0
  120. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  121. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  122. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/as_is.rs +0 -0
  123. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
  124. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  125. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
  126. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  127. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/ensure.rs +0 -0
  128. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  129. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  130. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  131. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fit.rs +0 -0
  132. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  133. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  134. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  135. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  136. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  137. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  138. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  139. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  140. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  141. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  142. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/home.rs +0 -0
  143. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  144. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  145. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  146. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/liveness.rs +0 -0
  147. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  148. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  149. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  150. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  151. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  152. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  153. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  154. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  155. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  156. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  157. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  158. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_download.rs +0 -0
  159. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  160. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  161. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  162. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/staging.rs +0 -0
  163. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  164. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  165. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  166. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  167. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/version.rs +0 -0
  168. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-core/tests/write_through.rs +0 -0
  169. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/Cargo.toml +0 -0
  170. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/docs.rs +0 -0
  171. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/ensure.rs +0 -0
  172. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/errors.rs +0 -0
  173. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/ingest.rs +0 -0
  174. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/lib.rs +0 -0
  175. {tensorfs-0.3.80 → tensorfs-0.3.81}/crates/tensorfs-py/src/store.rs +0 -0
  176. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/__init__.py +0 -0
  177. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_derived_channel.py +0 -0
  178. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_ext.pyi +0 -0
  179. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_source_channel.py +0 -0
  180. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/_tensors.py +0 -0
  181. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/derived.py +0 -0
  182. {tensorfs-0.3.80 → tensorfs-0.3.81}/python/tensorfs/errors.py +0 -0
  183. {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.80"
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.80"
457
+ version = "0.3.81"
458
458
  dependencies = [
459
459
  "pyo3",
460
460
  "tensorfs-core",
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.80"
6
+ version = "0.3.81"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.80
3
+ Version: 0.3.81
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -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
- std::thread::sleep(wait);
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(|refusal| match refusal.code {
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(Retryable::from)?;
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 did not write it; artifacts already in the local store are usable offline"
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 mut url = match authorize(stale.is_some(), ledger) {
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::new(store, plan, streams, download_budget);
995
- // Recovery reserves an object connection, not an authorization worker. A stream's
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
- (plan.wanted.len() as u64).saturating_sub(
1105
- fetched.load(Ordering::Acquire)
1106
- + cached.load(Ordering::Acquire),
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;