From 4d57480de1de9e18482df7d662765656fe4402ba Mon Sep 17 00:00:00 2001 From: Luchuan Date: Tue, 7 Jul 2020 17:21:34 +0800 Subject: [PATCH 1/3] fix seek --- src/LevelDBStore/IO/Data/LevelDB/Helper.cs | 15 +++++++++++++-- src/LevelDBStore/Plugins/Storage/Snapshot.cs | 2 +- src/LevelDBStore/Plugins/Storage/Store.cs | 2 +- src/RocksDBStore/Plugins/Storage/Snapshot.cs | 1 - src/RocksDBStore/Plugins/Storage/Store.cs | 15 ++++++++------- src/RpcNep5Tracker/DbCache.cs | 2 +- 6 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/LevelDBStore/IO/Data/LevelDB/Helper.cs b/src/LevelDBStore/IO/Data/LevelDB/Helper.cs index a2c28e769..08e7ca934 100644 --- a/src/LevelDBStore/IO/Data/LevelDB/Helper.cs +++ b/src/LevelDBStore/IO/Data/LevelDB/Helper.cs @@ -7,11 +7,13 @@ namespace Neo.IO.Data.LevelDB { public static class Helper { - public static IEnumerable Seek(this DB db, ReadOptions options, byte[] keyOrPrefix, SeekDirection direction, Func resultSelector) + public static IEnumerable Seek(this DB db, ReadOptions options, byte table, byte[] prefix, SeekDirection direction, Func resultSelector) { using Iterator it = db.NewIterator(options); - for (it.Seek(keyOrPrefix); it.Valid();) + for (it.Seek(CreateKey(table, prefix)); it.Valid();) { + var key = it.Key(); + if (key.Length < 1 || key[0] != table) break; yield return resultSelector(it.Key(), it.Value()); if (direction == SeekDirection.Forward) @@ -39,5 +41,14 @@ internal static byte[] ToByteArray(this IntPtr data, UIntPtr length) Marshal.Copy(data, buffer, 0, (int)length); return buffer; } + + internal static byte[] CreateKey(byte table, byte[] key = null) + { + if (key is null) return new[] { table }; + byte[] buffer = new byte[1 + key.Length]; + buffer[0] = table; + Buffer.BlockCopy(key, 0, buffer, 1, key.Length); + return buffer; + } } } diff --git a/src/LevelDBStore/Plugins/Storage/Snapshot.cs b/src/LevelDBStore/Plugins/Storage/Snapshot.cs index b547f1108..5c1fb25fe 100644 --- a/src/LevelDBStore/Plugins/Storage/Snapshot.cs +++ b/src/LevelDBStore/Plugins/Storage/Snapshot.cs @@ -38,7 +38,7 @@ public void Dispose() public IEnumerable<(byte[] Key, byte[] Value)> Seek(byte table, byte[] prefix, SeekDirection direction) { - return db.Seek(options, Helper.CreateKey(table, prefix), direction, (k, v) => (k[1..], v)); + return db.Seek(options, table, prefix, direction, (k, v) => (k[1..], v)); } public void Put(byte table, byte[] key, byte[] value) diff --git a/src/LevelDBStore/Plugins/Storage/Store.cs b/src/LevelDBStore/Plugins/Storage/Store.cs index 48cb10018..1ae479e6b 100644 --- a/src/LevelDBStore/Plugins/Storage/Store.cs +++ b/src/LevelDBStore/Plugins/Storage/Store.cs @@ -52,7 +52,7 @@ public void Dispose() public IEnumerable<(byte[], byte[])> Seek(byte table, byte[] prefix, SeekDirection direction) { - return db.Seek(ReadOptions.Default, Helper.CreateKey(table, prefix), direction, (k, v) => (k[1..], v)); + return db.Seek(ReadOptions.Default, table, prefix, direction, (k, v) => (k[1..], v)); } public ISnapshot GetSnapshot() diff --git a/src/RocksDBStore/Plugins/Storage/Snapshot.cs b/src/RocksDBStore/Plugins/Storage/Snapshot.cs index c61bf460e..fba384598 100644 --- a/src/RocksDBStore/Plugins/Storage/Snapshot.cs +++ b/src/RocksDBStore/Plugins/Storage/Snapshot.cs @@ -1,7 +1,6 @@ using Neo.IO.Caching; using Neo.Persistence; using RocksDbSharp; -using System; using System.Collections.Generic; namespace Neo.Plugins.Storage diff --git a/src/RocksDBStore/Plugins/Storage/Store.cs b/src/RocksDBStore/Plugins/Storage/Store.cs index f0959a596..3cad88249 100644 --- a/src/RocksDBStore/Plugins/Storage/Store.cs +++ b/src/RocksDBStore/Plugins/Storage/Store.cs @@ -82,16 +82,17 @@ public ISnapshot GetSnapshot() return new Snapshot(this, db); } - public IEnumerable<(byte[] Key, byte[] Value)> Seek(byte table, byte[] prefix, SeekDirection direction) + public IEnumerable<(byte[] Key, byte[] Value)> Seek(byte table, byte[] prefix, SeekDirection direction = SeekDirection.Forward) { using var it = db.NewIterator(GetFamily(table), Options.ReadDefault); - for (it.Seek(prefix); it.Valid(); it.Next()) + for (it.Seek(prefix); it.Valid();) { - var key = it.Key(); - byte[] y = prefix; - if (key.Length < y.Length) break; - if (!key.AsSpan().StartsWith(y)) break; - yield return (key, it.Value()); + yield return (it.Key(), it.Value()); + + if (direction == SeekDirection.Forward) + it.Next(); + else + it.Prev(); } } diff --git a/src/RpcNep5Tracker/DbCache.cs b/src/RpcNep5Tracker/DbCache.cs index bd2ff3cba..9cfd27e35 100644 --- a/src/RpcNep5Tracker/DbCache.cs +++ b/src/RpcNep5Tracker/DbCache.cs @@ -49,7 +49,7 @@ protected override void DeleteInternal(TKey key) protected override IEnumerable<(TKey, TValue)> SeekInternal(byte[] key_prefix, SeekDirection direction) { - return db.Seek(options, CreateKey(prefix, key_prefix), direction, (k, v) => (k.AsSerializable(1), v.AsSerializable())); + return db.Seek(options, prefix, key_prefix, direction, (k, v) => (k.AsSerializable(1), v.AsSerializable())); } protected override TValue GetInternal(TKey key) From 27001ff5f2b0e4febc77dba227e01db2511cb78f Mon Sep 17 00:00:00 2001 From: Luchuan Date: Tue, 7 Jul 2020 17:32:28 +0800 Subject: [PATCH 2/3] move Helper method --- src/LevelDBStore/IO/Data/LevelDB/Helper.cs | 2 +- src/LevelDBStore/Plugins/Storage/Helper.cs | 16 ---------------- src/LevelDBStore/Plugins/Storage/Snapshot.cs | 7 ++++--- src/LevelDBStore/Plugins/Storage/Store.cs | 13 +++++++------ 4 files changed, 12 insertions(+), 26 deletions(-) delete mode 100644 src/LevelDBStore/Plugins/Storage/Helper.cs diff --git a/src/LevelDBStore/IO/Data/LevelDB/Helper.cs b/src/LevelDBStore/IO/Data/LevelDB/Helper.cs index 08e7ca934..be3d8cffc 100644 --- a/src/LevelDBStore/IO/Data/LevelDB/Helper.cs +++ b/src/LevelDBStore/IO/Data/LevelDB/Helper.cs @@ -42,7 +42,7 @@ internal static byte[] ToByteArray(this IntPtr data, UIntPtr length) return buffer; } - internal static byte[] CreateKey(byte table, byte[] key = null) + public static byte[] CreateKey(byte table, byte[] key = null) { if (key is null) return new[] { table }; byte[] buffer = new byte[1 + key.Length]; diff --git a/src/LevelDBStore/Plugins/Storage/Helper.cs b/src/LevelDBStore/Plugins/Storage/Helper.cs deleted file mode 100644 index ff54faebe..000000000 --- a/src/LevelDBStore/Plugins/Storage/Helper.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace Neo.Plugins.Storage -{ - internal static class Helper - { - public static byte[] CreateKey(byte table, byte[] key = null) - { - if (key is null) return new[] { table }; - byte[] buffer = new byte[1 + key.Length]; - buffer[0] = table; - Buffer.BlockCopy(key, 0, buffer, 1, key.Length); - return buffer; - } - } -} diff --git a/src/LevelDBStore/Plugins/Storage/Snapshot.cs b/src/LevelDBStore/Plugins/Storage/Snapshot.cs index 5c1fb25fe..aec33b8d1 100644 --- a/src/LevelDBStore/Plugins/Storage/Snapshot.cs +++ b/src/LevelDBStore/Plugins/Storage/Snapshot.cs @@ -3,6 +3,7 @@ using Neo.Persistence; using System.Collections.Generic; using LSnapshot = Neo.IO.Data.LevelDB.Snapshot; +using LHelper = Neo.IO.Data.LevelDB.Helper; namespace Neo.Plugins.Storage { @@ -28,7 +29,7 @@ public void Commit() public void Delete(byte table, byte[] key) { - batch.Delete(Helper.CreateKey(table, key)); + batch.Delete(LHelper.CreateKey(table, key)); } public void Dispose() @@ -43,12 +44,12 @@ public void Dispose() public void Put(byte table, byte[] key, byte[] value) { - batch.Put(Helper.CreateKey(table, key), value); + batch.Put(LHelper.CreateKey(table, key), value); } public byte[] TryGet(byte table, byte[] key) { - return db.Get(options, Helper.CreateKey(table, key)); + return db.Get(options, LHelper.CreateKey(table, key)); } } } diff --git a/src/LevelDBStore/Plugins/Storage/Store.cs b/src/LevelDBStore/Plugins/Storage/Store.cs index 1ae479e6b..2d59258c7 100644 --- a/src/LevelDBStore/Plugins/Storage/Store.cs +++ b/src/LevelDBStore/Plugins/Storage/Store.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Reflection; using System.Text; +using LHelper = Neo.IO.Data.LevelDB.Helper; namespace Neo.Plugins.Storage { @@ -16,7 +17,7 @@ internal class Store : IStore public Store(string path) { this.db = DB.Open(path, new Options { CreateIfMissing = true }); - byte[] value = db.Get(ReadOptions.Default, Helper.CreateKey(SYS_Version)); + byte[] value = db.Get(ReadOptions.Default, LHelper.CreateKey(SYS_Version)); if (value != null && Version.TryParse(Encoding.ASCII.GetString(value), out Version version) && version >= Version.Parse("3.0.0")) return; @@ -36,13 +37,13 @@ public Store(string path) } } - db.Put(WriteOptions.Default, Helper.CreateKey(SYS_Version), Encoding.ASCII.GetBytes(Assembly.GetExecutingAssembly().GetName().Version.ToString())); + db.Put(WriteOptions.Default, LHelper.CreateKey(SYS_Version), Encoding.ASCII.GetBytes(Assembly.GetExecutingAssembly().GetName().Version.ToString())); db.Write(WriteOptions.Default, batch); } public void Delete(byte table, byte[] key) { - db.Delete(WriteOptions.Default, Helper.CreateKey(table, key)); + db.Delete(WriteOptions.Default, LHelper.CreateKey(table, key)); } public void Dispose() @@ -62,17 +63,17 @@ public ISnapshot GetSnapshot() public void Put(byte table, byte[] key, byte[] value) { - db.Put(WriteOptions.Default, Helper.CreateKey(table, key), value); + db.Put(WriteOptions.Default, LHelper.CreateKey(table, key), value); } public void PutSync(byte table, byte[] key, byte[] value) { - db.Put(WriteOptions.SyncWrite, Helper.CreateKey(table, key), value); + db.Put(WriteOptions.SyncWrite, LHelper.CreateKey(table, key), value); } public byte[] TryGet(byte table, byte[] key) { - return db.Get(ReadOptions.Default, Helper.CreateKey(table, key)); + return db.Get(ReadOptions.Default, LHelper.CreateKey(table, key)); } } } From 6479bff097b90b33f898916bf05c7f7353c592ff Mon Sep 17 00:00:00 2001 From: Luchuan Date: Tue, 7 Jul 2020 22:27:08 +0800 Subject: [PATCH 3/3] Update Helper.cs --- src/LevelDBStore/IO/Data/LevelDB/Helper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LevelDBStore/IO/Data/LevelDB/Helper.cs b/src/LevelDBStore/IO/Data/LevelDB/Helper.cs index be3d8cffc..0ed2f9543 100644 --- a/src/LevelDBStore/IO/Data/LevelDB/Helper.cs +++ b/src/LevelDBStore/IO/Data/LevelDB/Helper.cs @@ -44,7 +44,7 @@ internal static byte[] ToByteArray(this IntPtr data, UIntPtr length) public static byte[] CreateKey(byte table, byte[] key = null) { - if (key is null) return new[] { table }; + if (key is null || key.Length == 0) return new[] { table }; byte[] buffer = new byte[1 + key.Length]; buffer[0] = table; Buffer.BlockCopy(key, 0, buffer, 1, key.Length);