tensorfs 0.3.7__tar.gz → 0.3.9__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 (107) hide show
  1. {tensorfs-0.3.7 → tensorfs-0.3.9}/Cargo.lock +2 -2
  2. {tensorfs-0.3.7 → tensorfs-0.3.9}/Cargo.toml +1 -1
  3. {tensorfs-0.3.7 → tensorfs-0.3.9}/PKG-INFO +1 -1
  4. tensorfs-0.3.9/crates/tensorfs-core/src/derived/roots.rs +196 -0
  5. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/derived.rs +357 -26
  6. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/durability.rs +125 -7
  7. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/gc.rs +21 -4
  8. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/journal.rs +33 -0
  9. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/source.rs +112 -16
  10. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/store.rs +36 -1
  11. {tensorfs-0.3.7 → tensorfs-0.3.9}/pyproject.toml +1 -1
  12. {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/_ext.pyi +5 -0
  13. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/Cargo.toml +0 -0
  14. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/b64.rs +0 -0
  15. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
  16. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
  17. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
  18. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
  19. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
  20. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
  21. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
  22. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
  23. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
  24. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/canon.rs +0 -0
  25. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/capability.rs +0 -0
  26. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/catalog.rs +0 -0
  27. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/cbor.rs +0 -0
  28. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/checkpoint.rs +0 -0
  29. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/corpus.rs +0 -0
  30. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/dtype.rs +0 -0
  31. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/err.rs +0 -0
  32. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/fetch.rs +0 -0
  33. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/fill.rs +0 -0
  34. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/fit.rs +0 -0
  35. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/header.rs +0 -0
  36. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/home.rs +0 -0
  37. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ids.rs +0 -0
  38. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
  39. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
  40. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
  41. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
  42. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
  43. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
  44. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
  45. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
  46. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/jcs.rs +0 -0
  47. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/lib.rs +0 -0
  48. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/limits.rs +0 -0
  49. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/machine.rs +0 -0
  50. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/manifest.rs +0 -0
  51. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/meta.rs +0 -0
  52. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/project.rs +0 -0
  53. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/providers.rs +0 -0
  54. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/read.rs +0 -0
  55. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/receipt.rs +0 -0
  56. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/reclaim.rs +0 -0
  57. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/registry.rs +0 -0
  58. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/relation.rs +0 -0
  59. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/repo_cache.rs +0 -0
  60. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/repository.rs +0 -0
  61. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/sha256.rs +0 -0
  62. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/spec.rs +0 -0
  63. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/staging.rs +0 -0
  64. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/storage.rs +0 -0
  65. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/store.rs +0 -0
  66. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/api.rs +0 -0
  67. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/http.rs +0 -0
  68. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/hub.rs +0 -0
  69. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
  70. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/mod.rs +0 -0
  71. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/policy.rs +0 -0
  72. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/pull.rs +0 -0
  73. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/push.rs +0 -0
  74. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
  75. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/transport/tests.rs +0 -0
  76. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/src/vectors.rs +0 -0
  77. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
  78. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fit.rs +0 -0
  79. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
  80. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
  81. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
  82. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
  83. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
  84. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
  85. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
  86. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/home.rs +0 -0
  87. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/liveness.rs +0 -0
  88. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/reclaim.rs +0 -0
  89. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
  90. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
  91. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/repo_store.rs +0 -0
  92. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
  93. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
  94. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/source_plan.rs +0 -0
  95. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
  96. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/staging.rs +0 -0
  97. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
  98. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
  99. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/version.rs +0 -0
  100. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-core/tests/write_through.rs +0 -0
  101. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/Cargo.toml +0 -0
  102. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/docs.rs +0 -0
  103. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/errors.rs +0 -0
  104. {tensorfs-0.3.7 → tensorfs-0.3.9}/crates/tensorfs-py/src/lib.rs +0 -0
  105. {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/__init__.py +0 -0
  106. {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/errors.py +0 -0
  107. {tensorfs-0.3.7 → tensorfs-0.3.9}/python/tensorfs/py.typed +0 -0
@@ -392,7 +392,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
392
392
 
393
393
  [[package]]
394
394
  name = "tensorfs-core"
395
- version = "0.3.7"
395
+ version = "0.3.9"
396
396
  dependencies = [
397
397
  "fs2",
398
398
  "minicbor",
@@ -404,7 +404,7 @@ dependencies = [
404
404
 
405
405
  [[package]]
406
406
  name = "tensorfs-py"
407
- version = "0.3.7"
407
+ version = "0.3.9"
408
408
  dependencies = [
409
409
  "pyo3",
410
410
  "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.7"
6
+ version = "0.3.9"
7
7
  edition = "2021"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tensorfs
3
- Version: 0.3.7
3
+ Version: 0.3.9
4
4
  Classifier: Programming Language :: Python :: 3
5
5
  Classifier: Programming Language :: Python :: Implementation :: CPython
6
6
  Classifier: Programming Language :: Rust
@@ -0,0 +1,196 @@
1
+ //! Private derived roots are filesystem facts, just like repository roots. Transaction
2
+ //! metadata journals lifecycle; GC never needs that database to discover retained bytes.
3
+
4
+ use std::fs::{self, File, OpenOptions};
5
+ use std::io::{Read, Write};
6
+ use std::path::PathBuf;
7
+
8
+ use crate::canon::{Fields, Value};
9
+ use crate::err::{refuse, Code, Refusal, Result};
10
+ use crate::ids::{ObjectRef, Plain};
11
+ use crate::store::Store;
12
+
13
+ #[derive(Clone, Debug, PartialEq, Eq)]
14
+ pub(super) struct Root {
15
+ pub transaction: String,
16
+ pub manifest: ObjectRef,
17
+ pub name: Option<String>,
18
+ }
19
+
20
+ impl Plain for Root {
21
+ const MAX_BYTES: usize = 16 * 1024;
22
+ fn from_value(value: &Value) -> Result<Self> {
23
+ let mut fields = Fields::new("PrivateDerivedRoot", value)?;
24
+ let transaction = super::transaction_id(fields.req_str("transaction_id")?)?;
25
+ let manifest = ObjectRef::from_value("private root manifest", fields.req("manifest")?)?;
26
+ let name = fields
27
+ .opt("scratch_root_id")
28
+ .map(|value| {
29
+ let name = crate::canon::as_str("PrivateDerivedRoot", "scratch_root_id", value)?;
30
+ super::name("private scratch root", name)?;
31
+ Ok(name.to_string())
32
+ })
33
+ .transpose()?;
34
+ fields.done()?;
35
+ Ok(Self {
36
+ transaction,
37
+ manifest,
38
+ name,
39
+ })
40
+ }
41
+ fn to_value(&self) -> Value {
42
+ let mut fields = vec![
43
+ ("transaction_id", Value::str(self.transaction.clone())),
44
+ ("manifest", self.manifest.to_value()),
45
+ ];
46
+ if let Some(name) = &self.name {
47
+ fields.push(("scratch_root_id", Value::str(name.clone())));
48
+ }
49
+ Value::obj(fields)
50
+ }
51
+ }
52
+
53
+ fn io(error: std::io::Error) -> Refusal {
54
+ Refusal {
55
+ code: Code::IO_FAILED,
56
+ detail: format!("private derived root: {error}"),
57
+ }
58
+ }
59
+ fn directory(store: &Store) -> PathBuf {
60
+ store.root().join("roots/derived")
61
+ }
62
+ fn path(store: &Store, transaction: &str) -> Result<PathBuf> {
63
+ let transaction = super::transaction_id(transaction)?;
64
+ Ok(directory(store).join(format!(
65
+ "{}.json",
66
+ transaction.trim_start_matches("sha256:")
67
+ )))
68
+ }
69
+
70
+ pub(super) fn read(store: &Store, transaction: &str) -> Result<Option<Root>> {
71
+ let path = path(store, transaction)?;
72
+ let file = match File::open(&path) {
73
+ Ok(file) => file,
74
+ Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(None),
75
+ Err(error) => return Err(io(error)),
76
+ };
77
+ let mut bytes = Vec::new();
78
+ file.take(Root::MAX_BYTES as u64 + 1)
79
+ .read_to_end(&mut bytes)
80
+ .map_err(io)?;
81
+ let root = Root::parse(&bytes)?;
82
+ if root.transaction != transaction {
83
+ return refuse(
84
+ Code::CROSS_SUBJECT_REPLAY,
85
+ "private root path names another transaction",
86
+ );
87
+ }
88
+ Ok(Some(root))
89
+ }
90
+
91
+ pub(super) fn all(store: &Store) -> Result<Vec<Root>> {
92
+ let entries = match fs::read_dir(directory(store)) {
93
+ Ok(entries) => entries,
94
+ Err(error) if error.kind() == std::io::ErrorKind::NotFound => return Ok(Vec::new()),
95
+ Err(error) => return Err(io(error)),
96
+ };
97
+ let mut roots = Vec::new();
98
+ for entry in entries {
99
+ let entry = entry.map_err(io)?;
100
+ let name = entry.file_name();
101
+ let name = name.to_string_lossy();
102
+ let Some(hex) = name.strip_suffix(".json") else {
103
+ continue;
104
+ };
105
+ let transaction = format!("sha256:{hex}");
106
+ if let Some(root) = read(store, &transaction)? {
107
+ roots.push(root);
108
+ }
109
+ }
110
+ Ok(roots)
111
+ }
112
+
113
+ pub(super) fn write(store: &Store, root: &Root) -> Result<()> {
114
+ let path = path(store, &root.transaction)?;
115
+ fs::create_dir_all(directory(store)).map_err(io)?;
116
+ let temporary = path.with_extension(format!("tmp-{}", crate::meta::now_nanos_unique()));
117
+ let mut file = OpenOptions::new()
118
+ .write(true)
119
+ .create_new(true)
120
+ .open(&temporary)
121
+ .map_err(io)?;
122
+ file.write_all(&root.canonical_bytes())
123
+ .and_then(|()| file.sync_all())
124
+ .map_err(io)?;
125
+ fs::rename(&temporary, &path).map_err(io)?;
126
+ for directory in [
127
+ directory(store),
128
+ store.root().join("roots"),
129
+ store.root().to_path_buf(),
130
+ ] {
131
+ File::open(directory)
132
+ .and_then(|file| file.sync_all())
133
+ .map_err(io)?;
134
+ }
135
+ Ok(())
136
+ }
137
+
138
+ pub(super) fn pending(store: &Store, transaction: &str, manifest: &ObjectRef) -> Result<()> {
139
+ if read(store, transaction)?.is_some_and(|root| root.name.is_some()) {
140
+ return refuse(
141
+ Code::DISPOSITION_CONFLICT,
142
+ "a named private root cannot become a pending candidate",
143
+ );
144
+ }
145
+ write(
146
+ store,
147
+ &Root {
148
+ transaction: transaction.into(),
149
+ manifest: manifest.clone(),
150
+ name: None,
151
+ },
152
+ )
153
+ }
154
+
155
+ pub(super) fn adopt(
156
+ store: &Store,
157
+ transaction: &str,
158
+ manifest: &ObjectRef,
159
+ name: &str,
160
+ ) -> Result<()> {
161
+ if let Some(root) = read(store, transaction)? {
162
+ if root.manifest != *manifest || root.name.as_ref().is_some_and(|old| old != name) {
163
+ return refuse(
164
+ Code::DISPOSITION_CONFLICT,
165
+ "private root already binds different output or name",
166
+ );
167
+ }
168
+ }
169
+ if all(store)?
170
+ .iter()
171
+ .any(|root| root.transaction != transaction && root.name.as_deref() == Some(name))
172
+ {
173
+ return refuse(
174
+ Code::DISPOSITION_CONFLICT,
175
+ "private scratch root already names another transaction",
176
+ );
177
+ }
178
+ write(
179
+ store,
180
+ &Root {
181
+ transaction: transaction.into(),
182
+ manifest: manifest.clone(),
183
+ name: Some(name.into()),
184
+ },
185
+ )
186
+ }
187
+
188
+ pub(super) fn remove(store: &Store, transaction: &str) -> Result<()> {
189
+ match fs::remove_file(path(store, transaction)?) {
190
+ Ok(()) => File::open(directory(store))
191
+ .and_then(|file| file.sync_all())
192
+ .map_err(io),
193
+ Err(error) if error.kind() == std::io::ErrorKind::NotFound => Ok(()),
194
+ Err(error) => Err(io(error)),
195
+ }
196
+ }