Skip to content

Commit da9c11a

Browse files
committed
Merge remote-tracking branch 'origin/main' into danlaine/keyless-inactivity-floor
2 parents 788776e + 2a7dd42 commit da9c11a

18 files changed

Lines changed: 2105 additions & 648 deletions

File tree

examples/sync/src/databases/immutable.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use tracing::error;
2222
pub type Database<E> = immutable::variable::Db<mmr::Family, E, Key, Value, Hasher, Translator>;
2323

2424
/// Operation type alias.
25-
pub type Operation = immutable::variable::Operation<Key, Value>;
25+
pub type Operation = immutable::variable::Operation<mmr::Family, Key, Value>;
2626

2727
/// Create a database configuration with appropriate partitioning for Immutable.
2828
pub fn create_config(context: &impl BufferPooler) -> Config<Translator, VConfig<((), ())>> {
@@ -74,12 +74,12 @@ pub fn create_test_operations(count: usize, seed: u64) -> Vec<Operation> {
7474
operations.push(Operation::Set(key, value));
7575

7676
if (i + 1) % 10 == 0 {
77-
operations.push(Operation::Commit(None));
77+
operations.push(Operation::Commit(None, Location::new(0)));
7878
}
7979
}
8080

8181
// Always end with a commit
82-
operations.push(Operation::Commit(Some(Sha256::fill(1))));
82+
operations.push(Operation::Commit(Some(Sha256::fill(1)), Location::new(0)));
8383
operations
8484
}
8585

@@ -110,8 +110,8 @@ where
110110
Operation::Set(key, value) => {
111111
batch = batch.set(key, value);
112112
}
113-
Operation::Commit(metadata) => {
114-
let merkleized = batch.merkleize(self, metadata);
113+
Operation::Commit(metadata, floor) => {
114+
let merkleized = batch.merkleize(self, metadata, floor);
115115
self.apply_batch(merkleized).await?;
116116
self.commit().await?;
117117
batch = self.new_batch();
@@ -130,7 +130,7 @@ where
130130
}
131131

132132
async fn sync_boundary(&self) -> Location {
133-
self.sync_boundary().await
133+
self.sync_boundary()
134134
}
135135

136136
fn historical_proof(

storage/conformance.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,15 +208,15 @@ hash = "ba4c1ce0c2975f27231e13920129ecd63ae173c10a6e481af388ada2383ea15e"
208208

209209
["commonware_storage::qmdb::conformance::ImmutableMmbVariableConf"]
210210
n_cases = 200
211-
hash = "aee77e198354d5cee1dae5e572cfad11248b0e8635fdc9c19245442e6785fa25"
211+
hash = "d148ed1d4ce0fce52bfb24463e40f777bdc5915cbb7710d31e155d5b13237d1f"
212212

213213
["commonware_storage::qmdb::conformance::ImmutableMmrFixedConf"]
214214
n_cases = 200
215215
hash = "6a25e6efa15b15bfd6f39e588fca23c1ec431eec1f148722d8a00491876c4252"
216216

217217
["commonware_storage::qmdb::conformance::ImmutableMmrVariableConf"]
218218
n_cases = 200
219-
hash = "f32fda4f6c0bbde62f8f1959edeb2ac67b28f5347bd108e4118e740aa1fd8fd1"
219+
hash = "cafbb288de6f8d5c73ddb19df64d2e1429b4f2e273124cb1b20be3026c54d288"
220220

221221
["commonware_storage::qmdb::conformance::KeylessMmbFixedConf"]
222222
n_cases = 200
@@ -236,15 +236,15 @@ hash = "aee37bfef687a6855e53f2e4a2ef7190cf9d33cdb67b5e177a7f56f7b44e4b9b"
236236

237237
["commonware_storage::qmdb::immutable::operation::fixed::tests::conformance::CodecConformance<FixedOp>"]
238238
n_cases = 65536
239-
hash = "4f75cdf8952431729e7a3dfad38a8d5bfbb92bf6b54b1ca180a66745aed618d5"
239+
hash = "1737c49c112fc9dfdc4dde3626d8ab08a9df8353b9a702e488d3a1fd8e9428dc"
240240

241241
["commonware_storage::qmdb::immutable::operation::variable::tests::conformance::CodecConformance<VarKeyOp>"]
242242
n_cases = 65536
243-
hash = "cce5f888e506282f861e0e49e176b26c65f92e457f0c5f5353fc9b7196f07478"
243+
hash = "bdee433c53489ee67a42ad2029081d3f233799bd360d6e5e7f29cbaec87c9064"
244244

245245
["commonware_storage::qmdb::immutable::operation::variable::tests::conformance::CodecConformance<VarOp>"]
246246
n_cases = 65536
247-
hash = "fdca5df62d243b28676ee15034663694cd219d5ef80749079126b0ed73effe0d"
247+
hash = "7952a9bb3a9cec87a95af6dd96a5b88b535106f0241770e0bfdb8aeaf9421056"
248248

249249
["commonware_storage::qmdb::keyless::operation::tests::conformance::CodecConformance<Operation<mmr::Family,FixedEncoding<U64>>>"]
250250
n_cases = 65536

storage/fuzz/fuzz_targets/qmdb_immutable.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ enum ImmutableOperation {
4040
Commit {
4141
has_metadata: bool,
4242
metadata_size: usize,
43+
advance_floor: bool,
4344
},
4445
Prune {
4546
loc: u64,
@@ -179,24 +180,35 @@ fn fuzz_family<F: MerkleFamily>(input: &FuzzInput, suffix: &str) {
179180
ImmutableOperation::Commit {
180181
has_metadata,
181182
metadata_size,
183+
advance_floor,
182184
} => {
183185
let metadata = if has_metadata {
184186
Some(generate_value(&mut rng, metadata_size))
185187
} else {
186188
None
187189
};
188190

191+
let end = db.bounds().await.end;
192+
let pending_count = pending_sets.len() as u64;
189193
assign_pending_locations(
190194
&pending_sets,
191-
db.bounds().await.end,
195+
end,
192196
&mut keys_set,
193197
&mut set_locations,
194198
);
195199
let mut batch = db.new_batch();
196200
for (k, v) in pending_sets.drain(..) {
197201
batch = batch.set(k, v);
198202
}
199-
let merkleized = batch.merkleize(&db, metadata);
203+
let floor = if advance_floor {
204+
// Advance floor to the commit location (end of this batch).
205+
// total_size = end + pending_count + 1 (commit op).
206+
// Floor at the commit op is the maximum valid value.
207+
Location::new(*end + pending_count)
208+
} else {
209+
db.inactivity_floor_loc()
210+
};
211+
let merkleized = batch.merkleize(&db, metadata, floor);
200212
db.apply_batch(merkleized).await.unwrap();
201213
db.commit().await.unwrap();
202214
last_commit_loc = Some(db.bounds().await.end - 1);
@@ -216,7 +228,10 @@ fn fuzz_family<F: MerkleFamily>(input: &FuzzInput, suffix: &str) {
216228
for (k, v) in pending_sets.drain(..) {
217229
batch = batch.set(k, v);
218230
}
219-
let merkleized = batch.merkleize(&db, None);
231+
// Set the floor to at least safe_loc so the prune succeeds,
232+
// but never below the current floor (monotonicity).
233+
let floor = safe_loc.max(db.inactivity_floor_loc());
234+
let merkleized = batch.merkleize(&db, None, floor);
220235
db.apply_batch(merkleized).await.unwrap();
221236
db.commit().await.unwrap();
222237
last_commit_loc = Some(db.bounds().await.end - 1);
@@ -247,7 +262,8 @@ fn fuzz_family<F: MerkleFamily>(input: &FuzzInput, suffix: &str) {
247262
for (k, v) in pending_sets.drain(..) {
248263
batch = batch.set(k, v);
249264
}
250-
let merkleized = batch.merkleize(&db, None);
265+
let floor = db.inactivity_floor_loc();
266+
let merkleized = batch.merkleize(&db, None, floor);
251267
db.apply_batch(merkleized).await.unwrap();
252268
db.commit().await.unwrap();
253269
last_commit_loc = Some(db.bounds().await.end - 1);
@@ -272,7 +288,8 @@ fn fuzz_family<F: MerkleFamily>(input: &FuzzInput, suffix: &str) {
272288
let safe_max_ops =
273289
NonZeroU64::new((max_ops % MAX_PROOF_OPS).max(1)).unwrap();
274290

275-
let batch = db.new_batch().merkleize(&db, None);
291+
let floor = db.inactivity_floor_loc();
292+
let batch = db.new_batch().merkleize(&db, None, floor);
276293
db.apply_batch(batch).await.unwrap();
277294
db.commit().await.unwrap();
278295
last_commit_loc = Some(db.bounds().await.end - 1);
@@ -307,7 +324,8 @@ fn fuzz_family<F: MerkleFamily>(input: &FuzzInput, suffix: &str) {
307324
for (k, v) in pending_sets.drain(..) {
308325
batch = batch.set(k, v);
309326
}
310-
let merkleized = batch.merkleize(&db, None);
327+
let floor = db.inactivity_floor_loc();
328+
let merkleized = batch.merkleize(&db, None, floor);
311329
db.apply_batch(merkleized).await.unwrap();
312330
db.commit().await.unwrap();
313331
last_commit_loc = Some(db.bounds().await.end - 1);
@@ -326,7 +344,8 @@ fn fuzz_family<F: MerkleFamily>(input: &FuzzInput, suffix: &str) {
326344
for (k, v) in pending_sets.drain(..) {
327345
batch = batch.set(k, v);
328346
}
329-
let merkleized = batch.merkleize(&db, None);
347+
let floor = db.inactivity_floor_loc();
348+
let merkleized = batch.merkleize(&db, None, floor);
330349
db.apply_batch(merkleized).await.unwrap();
331350
db.destroy().await.unwrap();
332351
}

storage/src/qmdb/conformance.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,12 @@ async fn apply_writes<F: Family, D: DbAny<F, Key = Digest, Value = Digest>>(
237237
/// Apply a batch of immutable sets to the database.
238238
macro_rules! apply_sets {
239239
($db:ident, $ops:expr) => {{
240+
let floor = $db.inactivity_floor_loc();
240241
let mut batch = $db.new_batch();
241242
for (k, v) in $ops {
242243
batch = batch.set(k, v);
243244
}
244-
let merkleized = batch.merkleize(&$db, None);
245+
let merkleized = batch.merkleize(&$db, None, floor);
245246
$db.apply_batch(merkleized).await.unwrap();
246247
}};
247248
}
@@ -642,18 +643,20 @@ macro_rules! assert_immutable_order_independent {
642643
ops.push((colliding_digest(0xCD, i), to_val(i, 100)));
643644
}
644645

646+
let fwd_floor = $fwd.inactivity_floor_loc();
645647
let mut batch = $fwd.new_batch();
646648
for &(k, v) in &ops {
647649
batch = batch.set(k, v);
648650
}
649-
let merkleized = batch.merkleize(&$fwd, None);
651+
let merkleized = batch.merkleize(&$fwd, None, fwd_floor);
650652
$fwd.apply_batch(merkleized).await.unwrap();
651653

654+
let rev_floor = $rev.inactivity_floor_loc();
652655
let mut batch = $rev.new_batch();
653656
for &(k, v) in ops.iter().rev() {
654657
batch = batch.set(k, v);
655658
}
656-
let merkleized = batch.merkleize(&$rev, None);
659+
let merkleized = batch.merkleize(&$rev, None, rev_floor);
657660
$rev.apply_batch(merkleized).await.unwrap();
658661

659662
assert_eq!(

0 commit comments

Comments
 (0)