Skip to content

Commit 9833144

Browse files
committed
Add tests for intertwined read/write transactions
Signed-off-by: Victor Porof <[email protected]>
1 parent fe9dd39 commit 9833144

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

src/store/integer.rs

+120
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,66 @@ mod tests {
246246
assert_eq!(s.get(&reader, 3).expect("read"), Some(Value::Str("hello!")));
247247
}
248248
}
249+
250+
#[test]
251+
fn test_intertwine_read_write() {
252+
let root = Builder::new().prefix("test_integer_intertwine_read_write").tempdir().expect("tempdir");
253+
fs::create_dir_all(root.path()).expect("dir created");
254+
255+
let k = Rkv::new::<backend::Lmdb>(root.path()).expect("new succeeded");
256+
let s = k.open_integer("s", StoreOptions::create()).expect("open");
257+
258+
{
259+
let mut writer = k.write().expect("writer");
260+
s.put(&mut writer, 1, &Value::Str("hello!")).expect("write");
261+
assert_eq!(s.get(&writer, 1).expect("read"), Some(Value::Str("hello!")));
262+
assert_eq!(s.get(&writer, 2).expect("read"), None);
263+
assert_eq!(s.get(&writer, 3).expect("read"), None);
264+
writer.commit().expect("committed");
265+
}
266+
267+
let reader = k.read().expect("reader");
268+
let mut writer = k.write().expect("writer");
269+
270+
{
271+
assert_eq!(s.get(&reader, 1).expect("read"), Some(Value::Str("hello!")));
272+
assert_eq!(s.get(&reader, 2).expect("read"), None);
273+
assert_eq!(s.get(&reader, 3).expect("read"), None);
274+
}
275+
276+
{
277+
s.put(&mut writer, 1, &Value::Str("goodbye!")).expect("write");
278+
s.put(&mut writer, 2, &Value::Str("goodbye!")).expect("write");
279+
s.put(&mut writer, 3, &Value::Str("goodbye!")).expect("write");
280+
assert_eq!(s.get(&writer, 1).expect("read"), Some(Value::Str("goodbye!")));
281+
assert_eq!(s.get(&writer, 2).expect("read"), Some(Value::Str("goodbye!")));
282+
assert_eq!(s.get(&writer, 3).expect("read"), Some(Value::Str("goodbye!")));
283+
writer.commit().expect("committed");
284+
}
285+
286+
{
287+
assert_eq!(s.get(&reader, 1).expect("read"), Some(Value::Str("hello!")));
288+
assert_eq!(s.get(&reader, 2).expect("read"), None);
289+
assert_eq!(s.get(&reader, 3).expect("read"), None);
290+
}
291+
292+
{
293+
let mut writer = k.write().expect("writer");
294+
s.put(&mut writer, 1, &Value::Str("hello!")).expect("write");
295+
assert_eq!(s.get(&writer, 1).expect("read"), Some(Value::Str("hello!")));
296+
assert_eq!(s.get(&writer, 2).expect("read"), Some(Value::Str("goodbye!")));
297+
assert_eq!(s.get(&writer, 3).expect("read"), Some(Value::Str("goodbye!")));
298+
writer.commit().expect("committed");
299+
}
300+
301+
{
302+
let reader = k.write().expect("reader");
303+
assert_eq!(s.get(&reader, 1).expect("read"), Some(Value::Str("hello!")));
304+
assert_eq!(s.get(&reader, 2).expect("read"), Some(Value::Str("goodbye!")));
305+
assert_eq!(s.get(&reader, 3).expect("read"), Some(Value::Str("goodbye!")));
306+
reader.commit().expect("committed");
307+
}
308+
}
249309
}
250310

251311
#[cfg(test)]
@@ -419,4 +479,64 @@ mod tests_safe {
419479
assert_eq!(s.get(&reader, 3).expect("read"), Some(Value::Str("hello!")));
420480
}
421481
}
482+
483+
#[test]
484+
fn test_intertwine_read_write() {
485+
let root = Builder::new().prefix("test_integer_intertwine_read_write").tempdir().expect("tempdir");
486+
fs::create_dir_all(root.path()).expect("dir created");
487+
488+
let k = Rkv::new::<backend::SafeMode>(root.path()).expect("new succeeded");
489+
let s = k.open_integer("s", StoreOptions::create()).expect("open");
490+
491+
{
492+
let mut writer = k.write().expect("writer");
493+
s.put(&mut writer, 1, &Value::Str("hello!")).expect("write");
494+
assert_eq!(s.get(&writer, 1).expect("read"), Some(Value::Str("hello!")));
495+
assert_eq!(s.get(&writer, 2).expect("read"), None);
496+
assert_eq!(s.get(&writer, 3).expect("read"), None);
497+
writer.commit().expect("committed");
498+
}
499+
500+
let reader = k.read().expect("reader");
501+
let mut writer = k.write().expect("writer");
502+
503+
{
504+
assert_eq!(s.get(&reader, 1).expect("read"), Some(Value::Str("hello!")));
505+
assert_eq!(s.get(&reader, 2).expect("read"), None);
506+
assert_eq!(s.get(&reader, 3).expect("read"), None);
507+
}
508+
509+
{
510+
s.put(&mut writer, 1, &Value::Str("goodbye!")).expect("write");
511+
s.put(&mut writer, 2, &Value::Str("goodbye!")).expect("write");
512+
s.put(&mut writer, 3, &Value::Str("goodbye!")).expect("write");
513+
assert_eq!(s.get(&writer, 1).expect("read"), Some(Value::Str("goodbye!")));
514+
assert_eq!(s.get(&writer, 2).expect("read"), Some(Value::Str("goodbye!")));
515+
assert_eq!(s.get(&writer, 3).expect("read"), Some(Value::Str("goodbye!")));
516+
writer.commit().expect("committed");
517+
}
518+
519+
{
520+
assert_eq!(s.get(&reader, 1).expect("read"), Some(Value::Str("hello!")));
521+
assert_eq!(s.get(&reader, 2).expect("read"), None);
522+
assert_eq!(s.get(&reader, 3).expect("read"), None);
523+
}
524+
525+
{
526+
let mut writer = k.write().expect("writer");
527+
s.put(&mut writer, 1, &Value::Str("hello!")).expect("write");
528+
assert_eq!(s.get(&writer, 1).expect("read"), Some(Value::Str("hello!")));
529+
assert_eq!(s.get(&writer, 2).expect("read"), Some(Value::Str("goodbye!")));
530+
assert_eq!(s.get(&writer, 3).expect("read"), Some(Value::Str("goodbye!")));
531+
writer.commit().expect("committed");
532+
}
533+
534+
{
535+
let reader = k.write().expect("reader");
536+
assert_eq!(s.get(&reader, 1).expect("read"), Some(Value::Str("hello!")));
537+
assert_eq!(s.get(&reader, 2).expect("read"), Some(Value::Str("goodbye!")));
538+
assert_eq!(s.get(&reader, 3).expect("read"), Some(Value::Str("goodbye!")));
539+
reader.commit().expect("committed");
540+
}
541+
}
422542
}

0 commit comments

Comments
 (0)