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.
Files changed (204) hide show
  1. {tensorfs-0.3.91 → tensorfs-0.3.93}/Cargo.lock +3 -3
  2. {tensorfs-0.3.91 → tensorfs-0.3.93}/Cargo.toml +1 -1
  3. {tensorfs-0.3.91 → tensorfs-0.3.93}/PKG-INFO +1 -1
  4. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/API.md +16 -1
  5. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/io.rs +42 -10
  6. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/plane.rs +6 -0
  7. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/common/mod.rs +3 -1
  8. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/plane.rs +3 -1
  9. {tensorfs-0.3.91 → tensorfs-0.3.93}/pyproject.toml +1 -1
  10. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/plane.pyi +4 -0
  11. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/Cargo.toml +0 -0
  12. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/build.rs +0 -0
  13. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  14. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  15. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  16. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  17. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/asset_update.rs +0 -0
  18. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/b64.rs +0 -0
  19. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  20. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  21. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/ensure.rs +0 -0
  22. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  23. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  24. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  25. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  26. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  27. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  28. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  29. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  30. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/canon.rs +0 -0
  31. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/capability.rs +0 -0
  32. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  33. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/catalog.rs +0 -0
  34. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/cbor.rs +0 -0
  35. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  36. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
  37. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/corpus.rs +0 -0
  38. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  39. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  40. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  41. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  42. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  43. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  44. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  45. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  46. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  47. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  48. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  49. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/derived.rs +0 -0
  50. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/descriptors.rs +0 -0
  51. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/disk.rs +0 -0
  52. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/dtype.rs +0 -0
  53. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/durability.rs +0 -0
  54. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ensure/admission.rs +0 -0
  55. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ensure/flight.rs +0 -0
  56. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ensure.rs +0 -0
  57. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/err.rs +0 -0
  58. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/fetch.rs +0 -0
  59. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/filesystem_identity.rs +0 -0
  60. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/fill.rs +0 -0
  61. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/fit.rs +0 -0
  62. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/gc.rs +0 -0
  63. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/header.rs +0 -0
  64. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/home.rs +0 -0
  65. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ids.rs +0 -0
  66. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  67. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  68. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  69. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  70. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  71. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  72. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  73. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  74. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  75. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  76. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/anima.routes.json +0 -0
  77. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/anima.spec.json +0 -0
  78. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  79. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  80. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  81. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  82. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  83. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  84. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/jcs.rs +0 -0
  85. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/keyed_roots.rs +0 -0
  86. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/lib.rs +0 -0
  87. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/limits.rs +0 -0
  88. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/machine.rs +0 -0
  89. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/manifest.rs +0 -0
  90. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/meta.rs +0 -0
  91. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/project.rs +0 -0
  92. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/providers.rs +0 -0
  93. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/read.rs +0 -0
  94. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/receipt.rs +0 -0
  95. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/reclaim.rs +0 -0
  96. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/registry.rs +0 -0
  97. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/relation.rs +0 -0
  98. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  99. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/repository.rs +0 -0
  100. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/sha256.rs +0 -0
  101. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/source_artifact.rs +0 -0
  102. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/spec.rs +0 -0
  103. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/staging.rs +0 -0
  104. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/stats.rs +0 -0
  105. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/storage.rs +0 -0
  106. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/store.rs +0 -0
  107. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/api.rs +0 -0
  108. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/decisions.rs +0 -0
  109. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/download.rs +0 -0
  110. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/http.rs +0 -0
  111. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  112. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  113. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  114. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  115. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  116. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  117. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  118. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/push.rs +0 -0
  119. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/sources.rs +0 -0
  120. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/tests/tail.rs +0 -0
  121. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  122. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/unsynced.rs +0 -0
  123. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/src/vectors.rs +0 -0
  124. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  125. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  126. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/as_is.rs +0 -0
  127. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/catalog_owner_probe.c +0 -0
  128. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  129. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/civitai_anima.rs +0 -0
  130. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  131. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/ensure.rs +0 -0
  132. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  133. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  134. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fetch_faults.rs +0 -0
  135. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  136. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fit.rs +0 -0
  137. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  138. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  139. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  140. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  141. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  142. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  143. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  144. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  145. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  146. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  147. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/home.rs +0 -0
  148. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  149. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  150. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  151. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/keyed_roots.rs +0 -0
  152. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/liveness.rs +0 -0
  153. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  154. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  155. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  156. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  157. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  158. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  159. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  160. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  161. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  162. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  163. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  164. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_download.rs +0 -0
  165. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  166. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  167. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  168. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/staging.rs +0 -0
  169. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  170. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  171. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  172. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  173. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/version.rs +0 -0
  174. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-core/tests/write_through.rs +0 -0
  175. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/Cargo.toml +0 -0
  176. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/bin/g1_vmm.rs +0 -0
  177. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/bin/g2_overlap.rs +0 -0
  178. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/bin/gpu_bench/mod.rs +0 -0
  179. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/cuda.rs +0 -0
  180. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/cursor.rs +0 -0
  181. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/device.rs +0 -0
  182. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/faults.rs +0 -0
  183. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/host.rs +0 -0
  184. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/layout.rs +0 -0
  185. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/src/lib.rs +0 -0
  186. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/census.rs +0 -0
  187. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/gpu.rs +0 -0
  188. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-plane/tests/host_tier.rs +0 -0
  189. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/Cargo.toml +0 -0
  190. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/docs.rs +0 -0
  191. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/ensure.rs +0 -0
  192. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/errors.rs +0 -0
  193. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/ingest.rs +0 -0
  194. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/lib.rs +0 -0
  195. {tensorfs-0.3.91 → tensorfs-0.3.93}/crates/tensorfs-py/src/store.rs +0 -0
  196. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/__init__.py +0 -0
  197. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_derived_channel.py +0 -0
  198. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_ext.pyi +0 -0
  199. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_source_channel.py +0 -0
  200. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/_tensors.py +0 -0
  201. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/derived.py +0 -0
  202. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/errors.py +0 -0
  203. {tensorfs-0.3.91 → tensorfs-0.3.93}/python/tensorfs/plane.py +0 -0
  204. {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.91"
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.91"
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.91"
477
+ version = "0.3.93"
478
478
  dependencies = [
479
479
  "pyo3",
480
480
  "tensorfs-core",
@@ -3,5 +3,5 @@ resolver = "2"
3
3
  members = ["crates/tensorfs-core", "crates/tensorfs-plane", "crates/tensorfs-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.91"
6
+ version = "0.3.93"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.91
3
+ Version: 0.3.93
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -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). `None` where the
58
- /// kernel lacks it (< 6.5): the caller treats the range as cold.
59
- fn cached(f: &File, off: u64, len: u64) -> Option<bool> {
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
- Some(st.nr_cache >= (off + len).div_ceil(page) - off / page)
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.buffered, o.off, item.len).unwrap_or(false) => f,
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, "fills" => c.fills, "fill_bytes" => c.fill_bytes,
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
  ))?;
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tensorfs"
7
- version = "0.3.91"
7
+ version = "0.3.93"
8
8
  description = "TensorFS — canonical tensor artifact substrate"
9
9
  requires-python = ">=3.12"
10
10
  classifiers = [
@@ -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