From 1b88fdf3f0f91f2d574b5386d698dea805079950 Mon Sep 17 00:00:00 2001 From: Zhangmei Li Date: Fri, 18 Mar 2022 23:53:40 +0800 Subject: [PATCH 1/3] BackendEntry.columns() var-arg to single-arg avoid array-construct Change-Id: If073179a68e9207999cc07f4661e29c2c61282a3 --- .../hugegraph/backend/serializer/BinaryBackendEntry.java | 9 +++++---- .../hugegraph/backend/serializer/TableBackendEntry.java | 3 ++- .../hugegraph/backend/serializer/TextBackendEntry.java | 8 +++----- .../com/baidu/hugegraph/backend/store/BackendEntry.java | 3 ++- .../unit/serializer/BinaryScatterSerializerTest.java | 4 +--- 5 files changed, 13 insertions(+), 14 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java index bbcd963622..e687d97c81 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/BinaryBackendEntry.java @@ -139,11 +139,12 @@ public void columns(Collection bytesColumns) { } @Override - public void columns(BackendColumn... bytesColumns) { - this.columns.addAll(Arrays.asList(bytesColumns)); + public void columns(BackendColumn bytesColumn) { + this.columns.add(bytesColumn); long maxSize = BackendEntryIterator.INLINE_BATCH_SIZE; - E.checkState(this.columns.size() <= maxSize, - "Too many columns in one entry: %s", maxSize); + if (this.columns.size() > maxSize) { + E.checkState(false, "Too many columns in one entry: %s", maxSize); + } } public BackendColumn removeColumn(int index) { diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java index 0c281de24c..5005d93d48 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TableBackendEntry.java @@ -195,6 +195,7 @@ public void olap(boolean olap) { this.olap = olap; } + @Override public boolean olap() { return this.olap; } @@ -263,7 +264,7 @@ public void columns(Collection bytesColumns) { } @Override - public void columns(BackendEntry.BackendColumn... bytesColumns) { + public void columns(BackendEntry.BackendColumn bytesColumn) { throw new NotImplementedException("Not supported by table backend"); } diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java index c5cd9fd9bb..3ecdf0db10 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/serializer/TextBackendEntry.java @@ -265,11 +265,9 @@ public void columns(Collection bytesColumns) { } @Override - public void columns(BackendColumn... bytesColumns) { - for (BackendColumn column : bytesColumns) { - this.columns.put(StringEncoding.decode(column.name), - StringEncoding.decode(column.value)); - } + public void columns(BackendColumn bytesColumn) { + this.columns.put(StringEncoding.decode(bytesColumn.name), + StringEncoding.decode(bytesColumn.value)); } @Override diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java index 9b9b8e8e62..6017ccf1cd 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java @@ -87,7 +87,7 @@ public boolean equals(Object obj) { public Collection columns(); public void columns(Collection columns); - public void columns(BackendColumn... columns); + public void columns(BackendColumn column); public void merge(BackendEntry other); public boolean mergable(BackendEntry other); @@ -104,6 +104,7 @@ public default boolean olap() { public interface BackendIterator extends Iterator, AutoCloseable { + @Override public void close(); public byte[] position(); diff --git a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java index 80e473053c..1cc6c55a49 100644 --- a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java +++ b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/serializer/BinaryScatterSerializerTest.java @@ -85,9 +85,7 @@ private static BackendEntry parse(BackendEntry originEntry) { byte[] bytes = originEntry.id().asBytes(); BackendEntry parsedEntry = new BinaryBackendEntry(originEntry.type(), bytes); - for (BackendEntry.BackendColumn col : originEntry.columns()) { - parsedEntry.columns(col); - } + parsedEntry.columns(originEntry.columns()); return parsedEntry; } } From 3c6881812cca04348856d5c166d3a17bb797781b Mon Sep 17 00:00:00 2001 From: Zhangmei Li Date: Sat, 19 Mar 2022 00:17:24 +0800 Subject: [PATCH 2/3] add some test cases into RocksDBPerfTest Change-Id: Ie2e05350ddbee5998462658ce5199c8ee83e03fc --- .../unit/rocksdb/RocksDBPerfTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java index 9526b3bbf5..9849195c2d 100644 --- a/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java +++ b/hugegraph-test/src/main/java/com/baidu/hugegraph/unit/rocksdb/RocksDBPerfTest.java @@ -37,6 +37,54 @@ public class RocksDBPerfTest extends BaseRocksDBUnitTest { private static final int TIMES = 10000 * 1000; + @Test + public void testSeekExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + Iterator iter = session.scan(TABLE, b("exist")); + while (iter.hasNext()) { + iter.next(); + } + } + } + + @Test + public void testSeekNonExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + Iterator iter = session.scan(TABLE, b("non-exist")); + while (iter.hasNext()) { + iter.next(); + } + } + } + + @Test + public void testGetExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + byte[] value = session.get(TABLE, b("exist")); + assert value.length == "value".length(); + } + } + + @Test + public void testGetNonExistKey() throws RocksDBException { + put("exist", "value"); + + Session session = this.rocks.session(); + for (int i = 0; i < TIMES; i++) { + byte[] value = session.get(TABLE, b("non-exist")); + assert value == null; + } + } + @Test public void testPut() throws RocksDBException { for (int i = 0; i < TIMES; i++) { From ac8b8bdd8c81667539925d09d0eb6beec707355f Mon Sep 17 00:00:00 2001 From: Zhangmei Li Date: Mon, 21 Mar 2022 19:38:46 +0800 Subject: [PATCH 3/3] add OneColumnIterator Change-Id: Ib422fb1f126e11cf331464ac7f9e05ad0564846d --- .../hugegraph/backend/store/BackendEntry.java | 99 +++++++++++++------ .../backend/store/rocksdb/RocksDBTable.java | 5 +- 2 files changed, 73 insertions(+), 31 deletions(-) diff --git a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java index 6017ccf1cd..21da1d69e1 100644 --- a/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java +++ b/hugegraph-core/src/main/java/com/baidu/hugegraph/backend/store/BackendEntry.java @@ -19,7 +19,6 @@ package com.baidu.hugegraph.backend.store; -import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.NoSuchElementException; @@ -117,7 +116,18 @@ public static BackendColumnIterator empty() { return EMPTY; } - public final BackendColumnIterator EMPTY = new BackendColumnIterator() { + public static BackendColumnIterator iterator(BackendColumn element) { + return new OneColumnIterator(element); + } + + public static BackendColumnIterator wrap(Iterator iter) { + return new BackendColumnIteratorWrapper(iter); + } + + public static final BackendColumnIterator EMPTY = new EmptyIterator(); + + public static final class EmptyIterator + implements BackendColumnIterator { @Override public boolean hasNext() { @@ -138,41 +148,74 @@ public void close() { public byte[] position() { return null; } - }; - } + } - public static class BackendColumnIteratorWrapper - implements BackendColumnIterator { + public static final class OneColumnIterator + implements BackendColumnIterator { - private final Iterator iter; + private BackendColumn element; - public BackendColumnIteratorWrapper(BackendColumn... cols) { - this.iter = Arrays.asList(cols).iterator(); - } + public OneColumnIterator(BackendColumn element) { + assert element != null; + this.element = element; + } - public BackendColumnIteratorWrapper(Iterator cols) { - E.checkNotNull(cols, "cols"); - this.iter = cols; - } + @Override + public boolean hasNext() { + return this.element != null; + } - @Override - public boolean hasNext() { - return iter.hasNext(); - } + @Override + public BackendColumn next() { + if (this.element == null) { + throw new NoSuchElementException(); + } + BackendColumn result = this.element; + this.element = null; + return result; + } - @Override - public BackendColumn next() { - return iter.next(); - } + @Override + public void close() { + // pass + } - @Override - public void close() { - WrappedIterator.close(this.iter); + @Override + public byte[] position() { + return null; + } } - @Override - public byte[] position() { - return null; + public static final class BackendColumnIteratorWrapper + implements BackendColumnIterator { + + private final Iterator iter; + + public BackendColumnIteratorWrapper(Iterator iter) { + E.checkNotNull(iter, "iter"); + this.iter = iter; + } + + @Override + public boolean hasNext() { + return this.iter.hasNext(); + } + + @Override + public BackendColumn next() { + return this.iter.next(); + } + + @Override + public void close() { + WrappedIterator.close(this.iter); + } + + @Override + public byte[] position() { + // No paging position for discrete iterators like queryByIds() + return null; + } } } } diff --git a/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java b/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java index 576b9e3352..436e98c7aa 100644 --- a/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java +++ b/hugegraph-rocksdb/src/main/java/com/baidu/hugegraph/backend/store/rocksdb/RocksDBTable.java @@ -44,7 +44,6 @@ import com.baidu.hugegraph.backend.store.BackendEntry; import com.baidu.hugegraph.backend.store.BackendEntry.BackendColumn; import com.baidu.hugegraph.backend.store.BackendEntry.BackendColumnIterator; -import com.baidu.hugegraph.backend.store.BackendEntry.BackendColumnIteratorWrapper; import com.baidu.hugegraph.backend.store.BackendEntryIterator; import com.baidu.hugegraph.backend.store.BackendTable; import com.baidu.hugegraph.backend.store.Shard; @@ -199,7 +198,7 @@ protected BackendColumnIterator queryByIds(Session session, } // NOTE: this will lead to lazy create rocksdb iterator - return new BackendColumnIteratorWrapper(new FlatMapperIterator<>( + return BackendColumnIterator.wrap(new FlatMapperIterator<>( ids.iterator(), id -> this.queryById(session, id) )); } @@ -210,7 +209,7 @@ protected BackendColumnIterator getById(Session session, Id id) { return BackendColumnIterator.empty(); } BackendColumn col = BackendColumn.of(id.asBytes(), value); - return new BackendEntry.BackendColumnIteratorWrapper(col); + return BackendColumnIterator.iterator(col); } protected BackendColumnIterator getByIds(Session session, Set ids) {