tensorfs 0.3.62__tar.gz → 0.3.63__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tensorfs-0.3.62 → tensorfs-0.3.63}/Cargo.lock +2 -2
- {tensorfs-0.3.62 → tensorfs-0.3.63}/Cargo.toml +1 -1
- {tensorfs-0.3.62 → tensorfs-0.3.63}/PKG-INFO +1 -1
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/part_rows_tests.rs +24 -6
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/roots.rs +17 -5
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived.rs +29 -5
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/meta.rs +5 -3
- tensorfs-0.3.63/crates/tensorfs-core/tests/anima_hf_profile.rs +166 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/qwen_image21_profile.rs +5 -4
- {tensorfs-0.3.62 → tensorfs-0.3.63}/pyproject.toml +1 -1
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/Cargo.toml +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/build.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/h3-swiglu-layout.md +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/optional-cache-backfill.md +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/resident-conversion.md +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/resident_conversion_profile.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/asset_update.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/b64.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/ckpt.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/conform.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/fetch.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/ingest.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/main.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/rd.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/repo.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/snap.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/bin/tfs/watch.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/cache_roots.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/canon.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/capability.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/catalog.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/cbor.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/checkpoint.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/checkpoint_root.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/corpus.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/adoption.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/companion_tests.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/estimate.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/graft_tests.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/progress.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/resume_tests.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/derived/retention.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/dtype.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/durability.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/err.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/fetch.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/fill.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/fit.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/gc.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/header.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/home.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ids.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/carrier.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/convert.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/custody.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/fingerprint.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/gguf.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/h3_lora.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/journal.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/mod.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/preflight.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/source.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/stamp.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/ingest/transaction.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/jcs.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/lib.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/limits.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/machine.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/manifest.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/project.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/providers.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/read.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/receipt.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/reclaim.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/registry.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/relation.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/repo_cache/identity.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/repo_cache.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/repository.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/sha256.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/source_artifact.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/spec.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/staging.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/stats.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/storage.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/store.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/api.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/http.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/http_reuse_tests.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/hub.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/ledger.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/memory.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/mod.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/pace.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/policy.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/prefix.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/pull.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/push.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/ranged.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/speculate.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/transport/tests.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/src/vectors.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/additive_fields.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/checkpoint_roots.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fd_headroom.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fetch_url_progress.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fit.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_list.jsonl +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_repository.json +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/expected_rows.jsonl +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/foreign_json.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/h3_lora.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/h3_swiglu.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/home.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/import_tree.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/instrument_profiles.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/liveness.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/read_plan.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/reclaim.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/reclaim_run.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/repo_cache.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/repo_store.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/resident_admission.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/sha256_backends.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/sharded_cas.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_artifacts.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_download.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_plan.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_prefixes.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/source_preflight.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/staging.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/store_boundaries.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/tensor_schema.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/transfer_memory.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/trust_index.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/version.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/write_through.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/Cargo.toml +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/docs.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/errors.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/ingest.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/lib.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-py/src/store.rs +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/__init__.py +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_derived_channel.py +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_ext.pyi +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_source_channel.py +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/_tensors.py +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/derived.py +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/errors.py +0 -0
- {tensorfs-0.3.62 → tensorfs-0.3.63}/python/tensorfs/py.typed +0 -0
|
@@ -439,7 +439,7 @@ checksum = "adb6935a6f5c20170eeceb1a3835a49e12e19d792f6dd344ccc76a985ca5a6ca"
|
|
|
439
439
|
|
|
440
440
|
[[package]]
|
|
441
441
|
name = "tensorfs-core"
|
|
442
|
-
version = "0.3.
|
|
442
|
+
version = "0.3.63"
|
|
443
443
|
dependencies = [
|
|
444
444
|
"fs2",
|
|
445
445
|
"libc",
|
|
@@ -454,7 +454,7 @@ dependencies = [
|
|
|
454
454
|
|
|
455
455
|
[[package]]
|
|
456
456
|
name = "tensorfs-py"
|
|
457
|
-
version = "0.3.
|
|
457
|
+
version = "0.3.63"
|
|
458
458
|
dependencies = [
|
|
459
459
|
"pyo3",
|
|
460
460
|
"tensorfs-core",
|
|
@@ -25,7 +25,12 @@ fn fixture(label: &str) -> (Store, Meta, String, Declaration) {
|
|
|
25
25
|
.map(|index| ("model".into(), format!("weight_{index}")))
|
|
26
26
|
.collect();
|
|
27
27
|
declaration.max_new_bytes = 3 * 512;
|
|
28
|
-
(
|
|
28
|
+
(
|
|
29
|
+
store,
|
|
30
|
+
meta,
|
|
31
|
+
format!("sha256:{}", "7a".repeat(32)),
|
|
32
|
+
declaration,
|
|
33
|
+
)
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
fn catalog(store: &Store) -> rusqlite::Connection {
|
|
@@ -55,9 +60,16 @@ fn stored_rows(store: &Store, id: &str) -> (usize, Option<i64>, i64) {
|
|
|
55
60
|
)
|
|
56
61
|
.unwrap();
|
|
57
62
|
let value = crate::canon::parse_canonical(&bytes, limits::DOC_MAX_BYTES).unwrap();
|
|
58
|
-
let inline = TransactionRow::from_value(&value)
|
|
63
|
+
let inline = TransactionRow::from_value(&value)
|
|
64
|
+
.unwrap()
|
|
65
|
+
.added_parts
|
|
66
|
+
.len();
|
|
59
67
|
let parts = connection
|
|
60
|
-
.query_row(
|
|
68
|
+
.query_row(
|
|
69
|
+
"SELECT count(*) FROM tensorfs_derived_parts WHERE id=?1",
|
|
70
|
+
[id],
|
|
71
|
+
|row| row.get(0),
|
|
72
|
+
)
|
|
61
73
|
.unwrap();
|
|
62
74
|
(inline, open, parts)
|
|
63
75
|
}
|
|
@@ -74,14 +86,18 @@ fn parts_are_rows_that_resume_refuse_conflicts_and_stay_retained() {
|
|
|
74
86
|
add(&store, &meta, &id, &writer, "weight_0", 1).unwrap();
|
|
75
87
|
assert_eq!(stored_rows(&store, &id).2, 2);
|
|
76
88
|
assert_eq!(
|
|
77
|
-
add(&store, &meta, &id, &writer, "weight_0", 9)
|
|
89
|
+
add(&store, &meta, &id, &writer, "weight_0", 9)
|
|
90
|
+
.unwrap_err()
|
|
91
|
+
.code,
|
|
78
92
|
Code::TRANSACTION_CONFLICT
|
|
79
93
|
);
|
|
80
94
|
// A fenced writer cannot add. Once it is gone, GC keeps its accepted bytes through
|
|
81
95
|
// the append-only journal alone, and its successor resumes with both parts.
|
|
82
96
|
fence(&meta, &id, 1).unwrap();
|
|
83
97
|
assert_eq!(
|
|
84
|
-
add(&store, &meta, &id, &writer, "weight_2", 3)
|
|
98
|
+
add(&store, &meta, &id, &writer, "weight_2", 3)
|
|
99
|
+
.unwrap_err()
|
|
100
|
+
.code,
|
|
85
101
|
Code::WRITER_FENCED
|
|
86
102
|
);
|
|
87
103
|
release_guards(&meta, Some(writer.writer_hold), writer.source_leases);
|
|
@@ -135,7 +151,9 @@ fn an_older_builds_inline_row_and_a_torn_journal_line_are_read() {
|
|
|
135
151
|
std::fs::write(&journal, torn).unwrap();
|
|
136
152
|
|
|
137
153
|
assert_eq!(
|
|
138
|
-
add(&store, &meta, &id, &writer, "weight_0", 9)
|
|
154
|
+
add(&store, &meta, &id, &writer, "weight_0", 9)
|
|
155
|
+
.unwrap_err()
|
|
156
|
+
.code,
|
|
139
157
|
Code::TRANSACTION_CONFLICT
|
|
140
158
|
);
|
|
141
159
|
add(&store, &meta, &id, &writer, "weight_1", 2).unwrap();
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
//! metadata journals lifecycle; GC never needs that database to discover retained bytes.
|
|
3
3
|
|
|
4
4
|
use std::fs::{self, File, OpenOptions};
|
|
5
|
-
use std::os::unix::fs::FileExt;
|
|
6
5
|
use std::io::{Read, Write};
|
|
6
|
+
use std::os::unix::fs::FileExt;
|
|
7
7
|
use std::path::PathBuf;
|
|
8
8
|
|
|
9
9
|
use crate::canon::{Fields, Value};
|
|
@@ -164,7 +164,11 @@ pub(super) fn append_parts(store: &Store, transaction: &str, objects: &[ObjectRe
|
|
|
164
164
|
file.read_exact_at(&mut last, length - 1).map_err(io)?;
|
|
165
165
|
}
|
|
166
166
|
// Terminate a line torn by a dead writer so this one parses on its own.
|
|
167
|
-
let mut bytes = if last[0] == b'\n' {
|
|
167
|
+
let mut bytes = if last[0] == b'\n' {
|
|
168
|
+
Vec::new()
|
|
169
|
+
} else {
|
|
170
|
+
vec![b'\n']
|
|
171
|
+
};
|
|
168
172
|
bytes.extend(parts_line(objects));
|
|
169
173
|
file.write_all(&bytes)
|
|
170
174
|
.and_then(|()| file.sync_data())
|
|
@@ -185,7 +189,11 @@ pub(super) fn rewrite_parts(store: &Store, transaction: &str, objects: &[ObjectR
|
|
|
185
189
|
.create_new(true)
|
|
186
190
|
.open(&temporary)
|
|
187
191
|
.map_err(io)?;
|
|
188
|
-
let bytes = if objects.is_empty() {
|
|
192
|
+
let bytes = if objects.is_empty() {
|
|
193
|
+
Vec::new()
|
|
194
|
+
} else {
|
|
195
|
+
parts_line(objects)
|
|
196
|
+
};
|
|
189
197
|
file.write_all(&bytes)
|
|
190
198
|
.and_then(|()| file.sync_all())
|
|
191
199
|
.map_err(io)?;
|
|
@@ -211,8 +219,12 @@ pub(super) fn journaled(store: &Store) -> Result<Vec<ObjectRef>> {
|
|
|
211
219
|
Err(error) if error.kind() == std::io::ErrorKind::NotFound => continue,
|
|
212
220
|
Err(error) => return Err(io(error)),
|
|
213
221
|
};
|
|
214
|
-
for line in bytes
|
|
215
|
-
|
|
222
|
+
for line in bytes
|
|
223
|
+
.split(|byte| *byte == b'\n')
|
|
224
|
+
.filter(|line| !line.is_empty())
|
|
225
|
+
{
|
|
226
|
+
let Ok(value) = crate::canon::parse_canonical(line, crate::limits::DOC_MAX_BYTES)
|
|
227
|
+
else {
|
|
216
228
|
continue;
|
|
217
229
|
};
|
|
218
230
|
for value in crate::canon::as_arr("PrivateDerivedParts", "objects", &value)? {
|
|
@@ -1168,11 +1168,19 @@ pub(crate) fn part_bytes(part: &Part) -> Vec<u8> {
|
|
|
1168
1168
|
}
|
|
1169
1169
|
|
|
1170
1170
|
impl AddedPart {
|
|
1171
|
-
pub(crate) fn stored(
|
|
1171
|
+
pub(crate) fn stored(
|
|
1172
|
+
component: String,
|
|
1173
|
+
key: String,
|
|
1174
|
+
role: String,
|
|
1175
|
+
bytes: &[u8],
|
|
1176
|
+
) -> Result<Self> {
|
|
1172
1177
|
name("added part component", &component)?;
|
|
1173
1178
|
self::key("added part tensor", &key)?;
|
|
1174
1179
|
name("added part role", &role)?;
|
|
1175
|
-
let part = part_from_value(&crate::canon::parse_canonical(
|
|
1180
|
+
let part = part_from_value(&crate::canon::parse_canonical(
|
|
1181
|
+
bytes,
|
|
1182
|
+
limits::DOC_MAX_BYTES,
|
|
1183
|
+
)?)?;
|
|
1176
1184
|
Ok(Self {
|
|
1177
1185
|
component,
|
|
1178
1186
|
key,
|
|
@@ -3005,7 +3013,11 @@ impl Additions {
|
|
|
3005
3013
|
for tensor in &component.add {
|
|
3006
3014
|
for part in &tensor.parts {
|
|
3007
3015
|
parts.insert(
|
|
3008
|
-
(
|
|
3016
|
+
(
|
|
3017
|
+
component.target.clone(),
|
|
3018
|
+
tensor.key.clone(),
|
|
3019
|
+
part.role.clone(),
|
|
3020
|
+
),
|
|
3009
3021
|
part.clone(),
|
|
3010
3022
|
);
|
|
3011
3023
|
}
|
|
@@ -3025,7 +3037,11 @@ impl Additions {
|
|
|
3025
3037
|
fn get(&self, (component, tensor_key, role): (&str, &str, &str)) -> Result<&PartDeclaration> {
|
|
3026
3038
|
let part = self
|
|
3027
3039
|
.parts
|
|
3028
|
-
.get(&(
|
|
3040
|
+
.get(&(
|
|
3041
|
+
component.to_string(),
|
|
3042
|
+
tensor_key.to_string(),
|
|
3043
|
+
role.to_string(),
|
|
3044
|
+
))
|
|
3029
3045
|
.ok_or_else(|| Refusal {
|
|
3030
3046
|
code: Code::MISSING_FIELD,
|
|
3031
3047
|
detail: format!("{component}/{tensor_key}#{role} is not a declared addition"),
|
|
@@ -3093,7 +3109,15 @@ pub fn add_part<R: Read>(
|
|
|
3093
3109
|
reader: &mut R,
|
|
3094
3110
|
) -> Result<crate::checkpoint::Written> {
|
|
3095
3111
|
let additions = Additions::load(meta, transaction, writer_session)?;
|
|
3096
|
-
add_indexed_part(
|
|
3112
|
+
add_indexed_part(
|
|
3113
|
+
store,
|
|
3114
|
+
meta,
|
|
3115
|
+
transaction,
|
|
3116
|
+
writer_session,
|
|
3117
|
+
&additions,
|
|
3118
|
+
value,
|
|
3119
|
+
reader,
|
|
3120
|
+
)
|
|
3097
3121
|
}
|
|
3098
3122
|
|
|
3099
3123
|
/// Accept one part. The cost is this part's bytes plus one indexed SQL row: the
|
|
@@ -172,9 +172,11 @@ impl Meta {
|
|
|
172
172
|
.optional()
|
|
173
173
|
.map_err(|error| sql("read accepted part", error))?
|
|
174
174
|
.or_else(|| {
|
|
175
|
-
legacy
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
legacy
|
|
176
|
+
.iter()
|
|
177
|
+
.flatten()
|
|
178
|
+
.find(|old| old.same_value(added))
|
|
179
|
+
.map(|old| crate::derived::part_bytes(&old.part))
|
|
178
180
|
});
|
|
179
181
|
match existing {
|
|
180
182
|
Some(existing) if existing == bytes => {
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
//! Real header-only evidence for the Hugging Face Diffusers release of Anima Base v1.0: its four
|
|
2
|
+
//! components classify against the entries already banked from Civitai 2945208, so the source
|
|
3
|
+
//! profile is the only new data. No tensor payload is downloaded or read.
|
|
4
|
+
use std::{fs, path::PathBuf};
|
|
5
|
+
use tensorfs_core::{
|
|
6
|
+
canon::{self, Value},
|
|
7
|
+
dtype::Dtype,
|
|
8
|
+
err::Code,
|
|
9
|
+
ids::ObjectRef,
|
|
10
|
+
ingest::{
|
|
11
|
+
fingerprint, preflight,
|
|
12
|
+
source::{self, BUILTIN_REGISTRY, BUILTIN_REGISTRY_BYTES},
|
|
13
|
+
},
|
|
14
|
+
limits,
|
|
15
|
+
providers::MemberHead,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const PROFILE: &str = "hf/circlestone-labs/anima-base-v1.0-diffusers/bf16/1";
|
|
19
|
+
|
|
20
|
+
fn root() -> PathBuf {
|
|
21
|
+
PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../../vectors/anima-hf-headers")
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
fn field<'a>(value: &'a Value, name: &str) -> &'a Value {
|
|
25
|
+
let Value::Obj(rows) = value else {
|
|
26
|
+
panic!("object")
|
|
27
|
+
};
|
|
28
|
+
&rows.iter().find(|(key, _)| key == name).unwrap().1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
fn text(value: &Value) -> &str {
|
|
32
|
+
let Value::Str(value) = value else {
|
|
33
|
+
panic!("string")
|
|
34
|
+
};
|
|
35
|
+
value
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
fn number(value: &Value) -> u64 {
|
|
39
|
+
let Value::Int(value) = value else {
|
|
40
|
+
panic!("integer")
|
|
41
|
+
};
|
|
42
|
+
(*value).try_into().unwrap()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fn heads() -> Vec<MemberHead> {
|
|
46
|
+
let manifest = canon::parse(
|
|
47
|
+
&fs::read(root().join("MANIFEST.json")).unwrap(),
|
|
48
|
+
limits::DOC_MAX_BYTES,
|
|
49
|
+
)
|
|
50
|
+
.unwrap();
|
|
51
|
+
let Value::Arr(rows) = field(&manifest, "members") else {
|
|
52
|
+
panic!("members")
|
|
53
|
+
};
|
|
54
|
+
rows.iter()
|
|
55
|
+
.map(|row| {
|
|
56
|
+
let head = fs::read(root().join(text(field(row, "header_file")))).unwrap();
|
|
57
|
+
assert_eq!(
|
|
58
|
+
ObjectRef::of(&head).sha256,
|
|
59
|
+
text(field(row, "header_sha256"))
|
|
60
|
+
);
|
|
61
|
+
MemberHead {
|
|
62
|
+
member: text(field(row, "member")).into(),
|
|
63
|
+
length: number(field(row, "full_length")),
|
|
64
|
+
head,
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.collect()
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
fn scratch(name: &str) -> PathBuf {
|
|
71
|
+
std::env::temp_dir().join(format!(
|
|
72
|
+
"anima-hf-{name}-{}-{}",
|
|
73
|
+
std::process::id(),
|
|
74
|
+
tensorfs_core::meta::now_nanos_unique()
|
|
75
|
+
))
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
#[test]
|
|
79
|
+
fn anima_hf_diffusers_plans_against_the_banked_keysets_without_payloads() {
|
|
80
|
+
let heads = heads();
|
|
81
|
+
let path = scratch("plan");
|
|
82
|
+
let decision = preflight::plan(
|
|
83
|
+
BUILTIN_REGISTRY,
|
|
84
|
+
BUILTIN_REGISTRY_BYTES,
|
|
85
|
+
&heads,
|
|
86
|
+
&[PROFILE.into()],
|
|
87
|
+
&path,
|
|
88
|
+
)
|
|
89
|
+
.unwrap();
|
|
90
|
+
assert!(!path.exists());
|
|
91
|
+
assert_eq!(decision.plans.len(), 1);
|
|
92
|
+
assert_eq!(decision.plans[0].constructs, 1189);
|
|
93
|
+
assert_eq!(decision.plans[0].components.len(), 4);
|
|
94
|
+
assert_eq!(decision.plans[0].converter, "diffusers.identity/1");
|
|
95
|
+
|
|
96
|
+
let staged = preflight::stage(&path, &heads).unwrap();
|
|
97
|
+
let native = source::plan_source(
|
|
98
|
+
BUILTIN_REGISTRY,
|
|
99
|
+
BUILTIN_REGISTRY_BYTES,
|
|
100
|
+
staged.carriers(),
|
|
101
|
+
Some(PROFILE),
|
|
102
|
+
None,
|
|
103
|
+
)
|
|
104
|
+
.unwrap();
|
|
105
|
+
assert_eq!(native.session, decision.plans[0].session);
|
|
106
|
+
let recorded = canon::parse(
|
|
107
|
+
&fs::read(root().join("construction_order.json")).unwrap(),
|
|
108
|
+
limits::DOC_MAX_BYTES,
|
|
109
|
+
)
|
|
110
|
+
.unwrap();
|
|
111
|
+
let actual = Value::arr(
|
|
112
|
+
native
|
|
113
|
+
.construction_order
|
|
114
|
+
.iter()
|
|
115
|
+
.map(|(component, key)| Value::arr(vec![Value::str(component), Value::str(key)]))
|
|
116
|
+
.collect(),
|
|
117
|
+
);
|
|
118
|
+
assert_eq!(actual, recorded);
|
|
119
|
+
|
|
120
|
+
let registry = fingerprint::FingerprintRegistry::parse(BUILTIN_REGISTRY_BYTES).unwrap();
|
|
121
|
+
let carriers = source::CarrierSet::of(staged.carriers());
|
|
122
|
+
for (component, member, count) in [
|
|
123
|
+
(
|
|
124
|
+
"transformer",
|
|
125
|
+
"transformer/diffusion_pytorch_model.safetensors",
|
|
126
|
+
567,
|
|
127
|
+
),
|
|
128
|
+
("text_encoder", "text_encoder/model.safetensors", 310),
|
|
129
|
+
(
|
|
130
|
+
"text_conditioner",
|
|
131
|
+
"text_conditioner/diffusion_pytorch_model.safetensors",
|
|
132
|
+
118,
|
|
133
|
+
),
|
|
134
|
+
("vae", "vae/diffusion_pytorch_model.safetensors", 194),
|
|
135
|
+
] {
|
|
136
|
+
let carrier = staged
|
|
137
|
+
.carriers()
|
|
138
|
+
.iter()
|
|
139
|
+
.find(|row| row.member.as_deref() == Some(member))
|
|
140
|
+
.unwrap();
|
|
141
|
+
let (header, _) = source::read_carrier(carrier, &carriers).unwrap();
|
|
142
|
+
let observed = fingerprint::fingerprint(component, &header).unwrap();
|
|
143
|
+
assert_eq!(observed.dtypes, vec![(Dtype::Bf16, count)]);
|
|
144
|
+
let banked = registry.authorize(component, &observed).unwrap();
|
|
145
|
+
assert!(banked.provenance.source.contains("2945208"), "{component}");
|
|
146
|
+
}
|
|
147
|
+
drop(staged);
|
|
148
|
+
assert!(!path.exists());
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
#[test]
|
|
152
|
+
fn anima_hf_refuses_a_missing_component_before_payload_transfer() {
|
|
153
|
+
let mut heads = heads();
|
|
154
|
+
heads.retain(|row| row.member != "vae/diffusion_pytorch_model.safetensors");
|
|
155
|
+
let path = scratch("missing");
|
|
156
|
+
let error = preflight::plan(
|
|
157
|
+
BUILTIN_REGISTRY,
|
|
158
|
+
BUILTIN_REGISTRY_BYTES,
|
|
159
|
+
&heads,
|
|
160
|
+
&[PROFILE.into()],
|
|
161
|
+
&path,
|
|
162
|
+
)
|
|
163
|
+
.unwrap_err();
|
|
164
|
+
assert_ne!(error.code, Code::IO_FAILED, "{error:?}");
|
|
165
|
+
assert!(!path.exists());
|
|
166
|
+
}
|
|
@@ -160,7 +160,7 @@ fn qwen_image21_refuses_missing_shard_before_payload_transfer() {
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
#[test]
|
|
163
|
-
fn
|
|
163
|
+
fn qwen_image21_same_keys_at_another_precision_classify_by_key_set() {
|
|
164
164
|
let mut heads = heads();
|
|
165
165
|
for row in &mut heads {
|
|
166
166
|
if row.member.starts_with("transformer/") && row.member.ends_with(".safetensors") {
|
|
@@ -181,15 +181,16 @@ fn qwen_image21_refuses_same_keys_with_changed_precision() {
|
|
|
181
181
|
row.head[8..].copy_from_slice(&encoded);
|
|
182
182
|
}
|
|
183
183
|
}
|
|
184
|
+
// Owner ruling: the reviewed key set and component classify; conversion validates dtypes.
|
|
184
185
|
let path = scratch("precision");
|
|
185
|
-
let
|
|
186
|
+
let decision = preflight::plan(
|
|
186
187
|
BUILTIN_REGISTRY,
|
|
187
188
|
BUILTIN_REGISTRY_BYTES,
|
|
188
189
|
&heads,
|
|
189
190
|
&[PROFILE.into()],
|
|
190
191
|
&path,
|
|
191
192
|
)
|
|
192
|
-
.
|
|
193
|
-
assert_eq!(
|
|
193
|
+
.unwrap();
|
|
194
|
+
assert_eq!(decision.plans[0].constructs, 1285);
|
|
194
195
|
assert!(!path.exists());
|
|
195
196
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/optional-cache-backfill.md
RENAMED
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/examples/resident_conversion_profile.rs
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/blobs.jsonl
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/header.cbor
RENAMED
|
File without changes
|
{tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/manifest.json
RENAMED
|
File without changes
|
{tensorfs-0.3.62 → tensorfs-0.3.63}/crates/tensorfs-core/tests/fixtures/repo_apply/mutation.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|