tensorfs 0.3.75__tar.gz → 0.3.76__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 (170) hide show
  1. {tensorfs-0.3.75 → tensorfs-0.3.76}/Cargo.lock +2 -2
  2. {tensorfs-0.3.75 → tensorfs-0.3.76}/Cargo.toml +1 -1
  3. {tensorfs-0.3.75 → tensorfs-0.3.76}/PKG-INFO +1 -1
  4. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/checkpoint_root.rs +1 -10
  5. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/source_artifact.rs +1 -8
  6. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/store.rs +27 -0
  7. {tensorfs-0.3.75 → tensorfs-0.3.76}/pyproject.toml +1 -1
  8. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/Cargo.toml +0 -0
  9. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/build.rs +0 -0
  10. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
  11. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
  12. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
  13. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
  14. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/asset_update.rs +0 -0
  15. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/b64.rs +0 -0
  16. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  17. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  18. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  19. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  20. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  21. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  22. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  23. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  24. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  25. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/cache_roots.rs +0 -0
  26. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/canon.rs +0 -0
  27. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/capability.rs +0 -0
  28. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/catalog/lock.rs +0 -0
  29. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/catalog.rs +0 -0
  30. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/cbor.rs +0 -0
  31. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  32. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/corpus.rs +0 -0
  33. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
  34. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
  35. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
  36. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
  37. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/group_commit_tests.rs +0 -0
  38. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/history_cost_tests.rs +0 -0
  39. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/part_rows_tests.rs +0 -0
  40. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/progress.rs +0 -0
  41. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
  42. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/retention.rs +0 -0
  43. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived/roots.rs +0 -0
  44. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/derived.rs +0 -0
  45. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/descriptors.rs +0 -0
  46. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/disk.rs +0 -0
  47. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/dtype.rs +0 -0
  48. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/durability.rs +0 -0
  49. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/err.rs +0 -0
  50. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/fetch.rs +0 -0
  51. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/fill.rs +0 -0
  52. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/fit.rs +0 -0
  53. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/gc.rs +0 -0
  54. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/header.rs +0 -0
  55. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/home.rs +0 -0
  56. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ids.rs +0 -0
  57. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  58. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  59. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
  60. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  61. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  62. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
  63. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
  64. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  65. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/narrow.rs +0 -0
  66. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  67. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/routes/sdxl.routes.json +0 -0
  68. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/routes/sdxl.spec.json +0 -0
  69. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/routes.rs +0 -0
  70. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/source.rs +0 -0
  71. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  72. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  73. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/jcs.rs +0 -0
  74. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/lib.rs +0 -0
  75. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/limits.rs +0 -0
  76. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/machine.rs +0 -0
  77. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/manifest.rs +0 -0
  78. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/meta.rs +0 -0
  79. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/project.rs +0 -0
  80. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/providers.rs +0 -0
  81. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/read.rs +0 -0
  82. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/receipt.rs +0 -0
  83. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/reclaim.rs +0 -0
  84. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/registry.rs +0 -0
  85. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/relation.rs +0 -0
  86. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/repo_cache/identity.rs +0 -0
  87. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  88. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/repository.rs +0 -0
  89. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/sha256.rs +0 -0
  90. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/spec.rs +0 -0
  91. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/staging.rs +0 -0
  92. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/stats.rs +0 -0
  93. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/storage.rs +0 -0
  94. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/api.rs +0 -0
  95. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/http.rs +0 -0
  96. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
  97. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  98. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  99. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/memory.rs +0 -0
  100. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  101. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/pace.rs +0 -0
  102. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  103. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
  104. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  105. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/push.rs +0 -0
  106. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
  107. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
  108. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  109. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/unsynced.rs +0 -0
  110. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/src/vectors.rs +0 -0
  111. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
  112. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/anima_hf_profile.rs +0 -0
  113. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/as_is.rs +0 -0
  114. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
  115. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/civitai_sdxl_profile.rs +0 -0
  116. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fd_budget.rs +0 -0
  117. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
  118. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  119. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fit.rs +0 -0
  120. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  121. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  122. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  123. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  124. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  125. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  126. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  127. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
  128. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
  129. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
  130. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/home.rs +0 -0
  131. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/hub_tls.rs +0 -0
  132. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/import_tree.rs +0 -0
  133. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
  134. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/liveness.rs +0 -0
  135. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/qwen_image21_profile.rs +0 -0
  136. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/read_plan.rs +0 -0
  137. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  138. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  139. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  140. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  141. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
  142. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/routed_single_file.rs +0 -0
  143. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  144. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  145. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
  146. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/source_download.rs +0 -0
  147. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  148. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
  149. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  150. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/staging.rs +0 -0
  151. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  152. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  153. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
  154. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/trust_index.rs +0 -0
  155. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/version.rs +0 -0
  156. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-core/tests/write_through.rs +0 -0
  157. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-py/Cargo.toml +0 -0
  158. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-py/src/docs.rs +0 -0
  159. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-py/src/errors.rs +0 -0
  160. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-py/src/ingest.rs +0 -0
  161. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-py/src/lib.rs +0 -0
  162. {tensorfs-0.3.75 → tensorfs-0.3.76}/crates/tensorfs-py/src/store.rs +0 -0
  163. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/__init__.py +0 -0
  164. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/_derived_channel.py +0 -0
  165. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/_ext.pyi +0 -0
  166. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/_source_channel.py +0 -0
  167. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/_tensors.py +0 -0
  168. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/derived.py +0 -0
  169. {tensorfs-0.3.75 → tensorfs-0.3.76}/python/tensorfs/errors.py +0 -0
  170. {tensorfs-0.3.75 → tensorfs-0.3.76}/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.75"
442
+ version = "0.3.76"
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.75"
457
+ version = "0.3.76"
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.75"
6
+ version = "0.3.76"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.75
3
+ Version: 0.3.76
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -155,16 +155,7 @@ fn write(store: &Store, root: &CheckpointRoot) -> Result<()> {
155
155
  .and_then(|()| file.sync_all())
156
156
  .map_err(io)?;
157
157
  fs::rename(&temporary, path).map_err(io)?;
158
- for directory in [
159
- directory(store),
160
- store.root().join("roots"),
161
- store.root().to_path_buf(),
162
- ] {
163
- File::open(directory)
164
- .and_then(|file| file.sync_all())
165
- .map_err(io)?;
166
- }
167
- Ok(())
158
+ crate::store::fsync_entry_dir(store.root(), &directory(store))
168
159
  })();
169
160
  let _ = fs::remove_file(temporary);
170
161
  result
@@ -155,14 +155,7 @@ fn write(store: &Store, root: &TreeRoot) -> Result<()> {
155
155
  .and_then(|()| file.sync_all())
156
156
  .map_err(io)?;
157
157
  fs::rename(tmp, path).map_err(io)?;
158
- for dir in [
159
- directory(store),
160
- store.root().join("roots"),
161
- store.root().to_path_buf(),
162
- ] {
163
- File::open(dir).and_then(|f| f.sync_all()).map_err(io)?;
164
- }
165
- Ok(())
158
+ crate::store::fsync_entry_dir(store.root(), &directory(store))
166
159
  }
167
160
  fn verify(store: &Store, manifest: &ObjectRef) -> Result<Manifest> {
168
161
  let tree = store.read_manifest(manifest)?;
@@ -2340,6 +2340,33 @@ pub(crate) fn fsync_dir(dir: &Path) -> Result<()> {
2340
2340
  .map_err(|e| io(format!("fsync dir {}", dir.display()), e))
2341
2341
  }
2342
2342
 
2343
+ /// Make an entry just renamed into `dir` durable. The ancestors up to the store `root` hold
2344
+ /// only directory entries, which change when a directory is created, so each process syncs
2345
+ /// them once per `dir` (by inode: a recreated directory syncs again) rather than on every
2346
+ /// write. A child call's input hold wrote one root and paid four fsyncs; it now pays two.
2347
+ pub(crate) fn fsync_entry_dir(root: &Path, dir: &Path) -> Result<()> {
2348
+ use std::collections::HashSet;
2349
+ use std::sync::{Mutex, OnceLock};
2350
+ static SYNCED: OnceLock<Mutex<HashSet<(u64, u64)>>> = OnceLock::new();
2351
+ fsync_dir(dir)?;
2352
+ let meta = fs::metadata(dir).map_err(|e| io(format!("stat {}", dir.display()), e))?;
2353
+ let identity = (meta.dev(), meta.ino());
2354
+ let synced = SYNCED.get_or_init(Default::default);
2355
+ if synced.lock().is_ok_and(|set| set.contains(&identity)) {
2356
+ return Ok(());
2357
+ }
2358
+ for ancestor in dir.ancestors().skip(1) {
2359
+ fsync_dir(ancestor)?;
2360
+ if ancestor == root {
2361
+ break;
2362
+ }
2363
+ }
2364
+ if let Ok(mut set) = synced.lock() {
2365
+ set.insert(identity);
2366
+ }
2367
+ Ok(())
2368
+ }
2369
+
2343
2370
  pub(crate) fn now_nanos_unique() -> u128 {
2344
2371
  use std::sync::atomic::{AtomicU64, Ordering};
2345
2372
  static N: AtomicU64 = AtomicU64::new(0);
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "tensorfs"
7
- version = "0.3.75"
7
+ version = "0.3.76"
8
8
  description = "TensorFS — canonical tensor artifact substrate"
9
9
  requires-python = ">=3.12"
10
10
  classifiers = [