From 561a8dce6cfbba727624d38fec8df8cdf53e9d5e Mon Sep 17 00:00:00 2001 From: Fernando Diaz Toledano Date: Sat, 10 Feb 2024 19:07:47 +0100 Subject: [PATCH 1/4] Found bug in MemoryStore --- tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs b/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs index 50da353f7c..2465c9a556 100644 --- a/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs +++ b/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs @@ -19,6 +19,21 @@ namespace Neo.UnitTests.Persistence [TestClass] public class UT_MemoryStore { + [TestMethod] + public void SnapshotTest() + { + using var store = new MemoryStore(); + + store.Put(new byte[] { 1 }, new byte[] { 1, 2, 3 }); + + var snapshot = store.GetSnapshot(); + + snapshot.Put(new byte[] { 1 }, new byte[] { 1, 2, 3, 4 }); + + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, store.TryGet(new byte[] { 1 })); + CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, snapshot.TryGet(new byte[] { 1 })); + } + [TestMethod] public void StoreTest() { From c74a04f387e38b8dbad1daa20653db846b50d919 Mon Sep 17 00:00:00 2001 From: Fernando Diaz Toledano Date: Sat, 10 Feb 2024 19:10:35 +0100 Subject: [PATCH 2/4] Fix Bug --- src/Neo/Persistence/MemorySnapshot.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Neo/Persistence/MemorySnapshot.cs b/src/Neo/Persistence/MemorySnapshot.cs index 756a4c83b2..0bd307af6b 100644 --- a/src/Neo/Persistence/MemorySnapshot.cs +++ b/src/Neo/Persistence/MemorySnapshot.cs @@ -65,12 +65,22 @@ public void Put(byte[] key, byte[] value) public byte[] TryGet(byte[] key) { - immutableData.TryGetValue(key, out byte[] value); + if (writeBatch.TryGetValue(key, out byte[] value)) + { + return value; + } + + immutableData.TryGetValue(key, out value); return value?[..]; } public bool Contains(byte[] key) { + if (writeBatch.TryGetValue(key, out byte[] value) && value != null) + { + return true; + } + return immutableData.ContainsKey(key); } } From b9966ae8a0a6ce3e204bbccbc2c08072d941aeef Mon Sep 17 00:00:00 2001 From: Fernando Diaz Toledano Date: Sat, 10 Feb 2024 19:12:48 +0100 Subject: [PATCH 3/4] Fix Contains --- src/Neo/Persistence/MemorySnapshot.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Neo/Persistence/MemorySnapshot.cs b/src/Neo/Persistence/MemorySnapshot.cs index 0bd307af6b..b2ac191498 100644 --- a/src/Neo/Persistence/MemorySnapshot.cs +++ b/src/Neo/Persistence/MemorySnapshot.cs @@ -65,7 +65,7 @@ public void Put(byte[] key, byte[] value) public byte[] TryGet(byte[] key) { - if (writeBatch.TryGetValue(key, out byte[] value)) + if (writeBatch.TryGetValue(key, out var value)) { return value; } @@ -76,9 +76,9 @@ public byte[] TryGet(byte[] key) public bool Contains(byte[] key) { - if (writeBatch.TryGetValue(key, out byte[] value) && value != null) + if (writeBatch.TryGetValue(key, out var value)) { - return true; + return value != null; } return immutableData.ContainsKey(key); From 1fe14e8233f9926df9c7738ceb2cbaa6b819440b Mon Sep 17 00:00:00 2001 From: Fernando Diaz Toledano Date: Sat, 10 Feb 2024 19:15:06 +0100 Subject: [PATCH 4/4] test Conteins --- tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs b/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs index 2465c9a556..ca42d316c3 100644 --- a/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs +++ b/tests/Neo.UnitTests/Persistence/UT_MemoryStore.cs @@ -30,8 +30,18 @@ public void SnapshotTest() snapshot.Put(new byte[] { 1 }, new byte[] { 1, 2, 3, 4 }); + // Test TryGet + CollectionAssert.AreEqual(new byte[] { 1, 2, 3 }, store.TryGet(new byte[] { 1 })); CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, snapshot.TryGet(new byte[] { 1 })); + + // Test Contains + + Assert.IsFalse(store.Contains(new byte[] { 2 })); + Assert.IsFalse(snapshot.Contains(new byte[] { 2 })); + snapshot.Put(new byte[] { 2 }, new byte[] { 1, 2, 3, 4 }); + Assert.IsFalse(store.Contains(new byte[] { 2 })); + Assert.IsTrue(snapshot.Contains(new byte[] { 2 })); } [TestMethod]