This is an automated email from the ASF dual-hosted git repository.
jin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hugegraph.git
The following commit(s) were added to refs/heads/master by this push:
new df921e915 refact(server): enlarge bytes write limit & remove param
`big` when encode/decode string id length (#2622)
df921e915 is described below
commit df921e915df6d44e753cb0d501b6a2cc835fdf2d
Author: V_Galaxy <[email protected]>
AuthorDate: Sat Aug 10 17:02:30 2024 +0800
refact(server): enlarge bytes write limit & remove param `big` when
encode/decode string id length (#2622)
As title, change limit:
- vid max to 16KB
- eid max to 64kb (128k as backup)
- property max to 10MB (keep consistent)
fix #1593 #2291
---------
Co-authored-by: imbajin <[email protected]>
---
.asf.yaml | 4 +-
.../hugegraph/api/filter/AccessLogFilter.java | 3 +-
.../org/apache/hugegraph/core/GraphManager.java | 6 +-
.../hugegraph/backend/cache/OffheapCache.java | 32 +++---
.../java/org/apache/hugegraph/backend/id/Id.java | 3 +-
.../backend/serializer/BinarySerializer.java | 4 +-
.../hugegraph/backend/serializer/BytesBuffer.java | 110 +++++++++------------
.../org/apache/hugegraph/structure/HugeEdge.java | 4 +-
.../apache/hugegraph/structure/HugeElement.java | 3 +-
.../java/org/apache/hugegraph/task/HugeTask.java | 2 +-
.../org/apache/hugegraph/core/EdgeCoreTest.java | 6 +-
.../org/apache/hugegraph/core/VertexCoreTest.java | 7 +-
.../org/apache/hugegraph/unit/cache/CacheTest.java | 7 +-
.../org/apache/hugegraph/unit/id/IdUtilTest.java | 18 ++++
.../hugegraph/unit/serializer/BytesBufferTest.java | 55 ++++++-----
15 files changed, 133 insertions(+), 131 deletions(-)
diff --git a/.asf.yaml b/.asf.yaml
index 6c7853042..93063dc7d 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -34,8 +34,8 @@ github:
protected_branches:
master:
required_status_checks:
- # strict means "Require branches to be up-to-date before merging".
(TODO: turnoff when branch is stable)
- strict: true
+ # strict means "Require PR to be up-to-date before merging". (enable
when branch unstable)
+ strict: false
# contexts are the names of checks that must pass (now only enable the
basic check)
contexts:
- Analyze (java)
diff --git
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java
index d429db4d9..ae5368646 100644
---
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java
+++
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/filter/AccessLogFilter.java
@@ -26,7 +26,6 @@ import static
org.apache.hugegraph.metrics.MetricsUtil.METRICS_PATH_TOTAL_COUNTE
import java.io.IOException;
import java.net.URI;
-import org.apache.hugegraph.auth.HugeAuthenticator;
import org.apache.hugegraph.config.HugeConfig;
import org.apache.hugegraph.config.ServerOptions;
import org.apache.hugegraph.core.GraphManager;
@@ -124,7 +123,7 @@ public class AccessLogFilter implements
ContainerResponseFilter {
GraphManager manager = managerProvider.get();
// TODO: transfer Authorizer if we need after.
if (manager.requireAuthentication()) {
- manager.unauthorize(requestContext.getSecurityContext());
+ manager.unauthorized(requestContext.getSecurityContext());
}
}
diff --git
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
index 37939c201..5cba0a0f0 100644
---
a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
+++
b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/core/GraphManager.java
@@ -265,7 +265,7 @@ public final class GraphManager {
return this.authenticator().authenticate(credentials);
}
- public void unauthorize(SecurityContext context) {
+ public void unauthorized(SecurityContext context) {
this.authenticator().unauthorize(context);
}
@@ -515,7 +515,7 @@ public final class GraphManager {
private void addMetrics(HugeConfig config) {
final MetricManager metric = MetricManager.INSTANCE;
- // Force to add server reporter
+ // Force to add a server reporter
ServerReporter reporter =
ServerReporter.instance(metric.getRegistry());
reporter.start(60L, TimeUnit.SECONDS);
@@ -610,7 +610,7 @@ public final class GraphManager {
/*
* Will fill graph instance into HugeFactory.graphs after
- * GraphFactory.open() succeed, remove it when graph drop
+ * GraphFactory.open() succeed, remove it when the graph drops
*/
HugeFactory.remove(graph);
}
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/OffheapCache.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/OffheapCache.java
index d641c8276..7ed4efcd6 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/OffheapCache.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/cache/OffheapCache.java
@@ -55,14 +55,18 @@ public class OffheapCache extends AbstractCache<Id, Object>
{
private final AbstractSerializer serializer;
public OffheapCache(HugeGraph graph, long capacity, long avgEntryBytes) {
- // NOTE: capacity unit is bytes, the super capacity expect elements
size
+ this(graph, capacity, avgEntryBytes,
Runtime.getRuntime().availableProcessors() * 2);
+ }
+
+ public OffheapCache(HugeGraph graph, long capacity, long avgEntryBytes,
int segments) {
+ // NOTE: capacity unit is bytes, the super capacity expects elements'
size
super(capacity);
- long capacityInBytes = capacity * (avgEntryBytes + 64L);
+ long capacityInBytes = Math.max(capacity, segments) * (avgEntryBytes +
64L);
if (capacityInBytes <= 0L) {
capacityInBytes = 1L;
}
this.graph = graph;
- this.cache = this.builder().capacity(capacityInBytes).build();
+ this.cache =
this.builder().capacity(capacityInBytes).segmentCount(segments).build();
this.serializer = new BinarySerializer();
}
@@ -162,19 +166,18 @@ public class OffheapCache extends AbstractCache<Id,
Object> {
@Override
public Id deserialize(ByteBuffer input) {
- return BytesBuffer.wrap(input).readId(true);
+ return BytesBuffer.wrap(input).readId();
}
@Override
public void serialize(Id id, ByteBuffer output) {
- BytesBuffer.wrap(output).writeId(id, true);
+ BytesBuffer.wrap(output).writeId(id);
}
@Override
public int serializedSize(Id id) {
// NOTE: return size must be == actual bytes to write
- return BytesBuffer.allocate(id.length() + 2)
- .writeId(id, true).position();
+ return BytesBuffer.allocate(id.length() +
2).writeId(id).position();
}
}
@@ -229,7 +232,6 @@ public class OffheapCache extends AbstractCache<Id, Object>
{
}
BytesBuffer buffer = BytesBuffer.allocate(64 * listSize);
-
// May fail to serialize and throw exception here
this.serialize(this.value, buffer);
@@ -276,8 +278,7 @@ public class OffheapCache extends AbstractCache<Id, Object>
{
}
}
- private void serializeList(BytesBuffer buffer,
- Collection<Object> list) {
+ private void serializeList(BytesBuffer buffer, Collection<Object>
list) {
// Write list
buffer.writeVInt(list.size());
for (Object i : list) {
@@ -295,8 +296,7 @@ public class OffheapCache extends AbstractCache<Id, Object>
{
return list;
}
- private void serializeElement(BytesBuffer buffer,
- ValueType type, Object value) {
+ private void serializeElement(BytesBuffer buffer, ValueType type,
Object value) {
E.checkNotNull(value, "serialize value");
BackendEntry entry;
if (type == ValueType.VERTEX) {
@@ -332,14 +332,12 @@ public class OffheapCache extends AbstractCache<Id,
Object> {
}
private HugeException unsupported(ValueType type) {
- throw new HugeException(
- "Unsupported deserialize type: %s", type);
+ throw new HugeException("Unsupported deserialize type: %s", type);
}
private HugeException unsupported(Object value) {
- throw new HugeException(
- "Unsupported type of serialize value: '%s'(%s)",
- value, value.getClass());
+ throw new HugeException("Unsupported type of serialize value:
'%s'(%s)",
+ value, value.getClass());
}
}
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/Id.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/Id.java
index b0e561349..077aa43db 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/Id.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/id/Id.java
@@ -67,8 +67,7 @@ public interface Id extends Comparable<Id> {
}
public static IdType valueOfPrefix(String id) {
- E.checkArgument(id != null && !id.isEmpty(),
- "Invalid id '%s'", id);
+ E.checkArgument(id != null && !id.isEmpty(), "Invalid id '%s'",
id);
switch (id.charAt(0)) {
case 'L':
return IdType.LONG;
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BinarySerializer.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BinarySerializer.java
index 37a7e9a9c..0dd4c9d3e 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BinarySerializer.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BinarySerializer.java
@@ -1312,9 +1312,9 @@ public class BinarySerializer extends AbstractSerializer {
}
private byte[] writeIds(Collection<Id> ids) {
- E.checkState(ids.size() <= BytesBuffer.UINT16_MAX,
+ E.checkState(ids.size() <= BytesBuffer.MAX_PROPERTIES,
"The number of properties of vertex/edge label " +
- "can't exceed '%s'", BytesBuffer.UINT16_MAX);
+ "can't exceed '%s'", BytesBuffer.MAX_PROPERTIES);
int size = 2;
for (Id id : ids) {
size += (1 + id.length());
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BytesBuffer.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BytesBuffer.java
index b99c2c8b5..c13d61108 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BytesBuffer.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/serializer/BytesBuffer.java
@@ -51,22 +51,27 @@ public final class BytesBuffer extends OutputStream {
public static final int CHAR_LEN = Character.BYTES;
public static final int FLOAT_LEN = Float.BYTES;
public static final int DOUBLE_LEN = Double.BYTES;
- public static final int BLOB_LEN = 4;
+ public static final int BYTES_LEN = 4;
+ public static final int BLOB_LEN = 5;
public static final int UINT8_MAX = ((byte) -1) & 0xff;
public static final int UINT16_MAX = ((short) -1) & 0xffff;
public static final long UINT32_MAX = (-1) & 0xffffffffL;
+ // TODO: support user-defined configuration
// NOTE: +1 to let code 0 represent length 1
- public static final int ID_LEN_MASK = 0x7f;
- public static final int ID_LEN_MAX = 0x7f + 1; // 128
- public static final int BIG_ID_LEN_MAX = 0x7fff + 1; // 32768
+ public static final int ID_LEN_MAX = 0x3fff + 1; // 16KB
+ public static final int EID_LEN_MAX = 64 * 1024;
public static final byte STRING_ENDING_BYTE = (byte) 0x00;
public static final byte STRING_ENDING_BYTE_FF = (byte) 0xff;
- public static final int STRING_LEN_MAX = UINT16_MAX;
+
+ // TODO: support user-defined configuration
+ public static final long BYTES_LEN_MAX = 10 * Bytes.MB;
public static final long BLOB_LEN_MAX = 1 * Bytes.GB;
+ public static final int MAX_PROPERTIES = BytesBuffer.UINT16_MAX;
+
// The value must be in range [8, ID_LEN_MAX]
public static final int INDEX_HASH_ID_THRESHOLD = 32;
@@ -87,8 +92,7 @@ public final class BytesBuffer extends OutputStream {
public BytesBuffer(int capacity) {
E.checkArgument(capacity <= MAX_BUFFER_CAPACITY,
- "Capacity exceeds max buffer capacity: %s",
- MAX_BUFFER_CAPACITY);
+ "Capacity exceeds max buffer capacity: %s",
MAX_BUFFER_CAPACITY);
this.buffer = ByteBuffer.allocate(capacity);
this.resize = true;
}
@@ -167,8 +171,7 @@ public final class BytesBuffer extends OutputStream {
// Extra capacity as buffer
int newCapacity = size + this.buffer.limit() + DEFAULT_CAPACITY;
E.checkArgument(newCapacity <= MAX_BUFFER_CAPACITY,
- "Capacity exceeds max buffer capacity: %s",
- MAX_BUFFER_CAPACITY);
+ "Capacity exceeds max buffer capacity: %s",
MAX_BUFFER_CAPACITY);
ByteBuffer newBuffer = ByteBuffer.allocate(newCapacity);
this.buffer.flip();
newBuffer.put(this.buffer);
@@ -288,10 +291,9 @@ public final class BytesBuffer extends OutputStream {
}
public BytesBuffer writeBytes(byte[] bytes) {
- E.checkArgument(bytes.length <= UINT16_MAX,
- "The max length of bytes is %s, but got %s",
- UINT16_MAX, bytes.length);
- require(SHORT_LEN + bytes.length);
+ E.checkArgument(bytes.length <= BYTES_LEN_MAX, "The max length of
bytes is %s, but got %s",
+ BYTES_LEN_MAX, bytes.length);
+ require(BYTES_LEN + bytes.length);
this.writeVInt(bytes.length);
this.write(bytes);
return this;
@@ -304,8 +306,8 @@ public final class BytesBuffer extends OutputStream {
}
public BytesBuffer writeBigBytes(byte[] bytes) {
- E.checkArgument(bytes.length <= BLOB_LEN_MAX,
- "The max length of bytes is %s, but got %s",
+ // TODO: note the max blob size should be 128MB (due to
MAX_BUFFER_CAPACITY)
+ E.checkArgument(bytes.length <= BLOB_LEN_MAX, "The max length of bytes
is %s, but got %s",
BLOB_LEN_MAX, bytes.length);
require(BLOB_LEN + bytes.length);
this.writeVInt(bytes.length);
@@ -346,9 +348,7 @@ public final class BytesBuffer extends OutputStream {
assert !Bytes.contains(bytes, STRING_ENDING_BYTE_FF) :
"Invalid UTF8 bytes: " + value;
if (Bytes.contains(bytes, STRING_ENDING_BYTE)) {
- E.checkArgument(false,
- "Can't contains byte '0x00' in string: '%s'",
- value);
+ E.checkArgument(false, "Can't contains byte '0x00' in string:
'%s'", value);
}
this.write(bytes);
}
@@ -430,8 +430,7 @@ public final class BytesBuffer extends OutputStream {
public int readVInt() {
byte leading = this.read();
- E.checkArgument(leading != 0x80,
- "Unexpected varint with leading byte '0x%s'",
+ E.checkArgument(leading != 0x80, "Unexpected varint with leading byte
'0x%s'",
Bytes.toHex(leading));
int value = leading & 0x7f;
if (leading >= 0) {
@@ -450,8 +449,7 @@ public final class BytesBuffer extends OutputStream {
}
}
- E.checkArgument(i < 5,
- "Unexpected varint %s with too many bytes(%s)",
+ E.checkArgument(i < 5, "Unexpected varint %s with too many bytes(%s)",
value, i + 1);
E.checkArgument(i < 4 || (leading & 0x70) == 0,
"Unexpected varint %s with leading byte '0x%s'",
@@ -494,8 +492,7 @@ public final class BytesBuffer extends OutputStream {
public long readVLong() {
byte leading = this.read();
- E.checkArgument(leading != 0x80,
- "Unexpected varlong with leading byte '0x%s'",
+ E.checkArgument(leading != 0x80, "Unexpected varlong with leading byte
'0x%s'",
Bytes.toHex(leading));
long value = leading & 0x7fL;
if (leading >= 0) {
@@ -514,8 +511,7 @@ public final class BytesBuffer extends OutputStream {
}
}
- E.checkArgument(i < 10,
- "Unexpected varlong %s with too many bytes(%s)",
+ E.checkArgument(i < 10, "Unexpected varlong %s with too many
bytes(%s)",
value, i + 1);
E.checkArgument(i < 9 || (leading & 0x7e) == 0,
"Unexpected varlong %s with leading byte '0x%s'",
@@ -581,8 +577,7 @@ public final class BytesBuffer extends OutputStream {
this.writeString((String) value);
break;
case BLOB:
- byte[] bytes = value instanceof byte[] ?
- (byte[]) value : ((Blob) value).bytes();
+ byte[] bytes = value instanceof byte[] ? (byte[]) value :
((Blob) value).bytes();
this.writeBigBytes(bytes);
break;
case UUID:
@@ -592,6 +587,7 @@ public final class BytesBuffer extends OutputStream {
this.writeLong(uuid.getLeastSignificantBits());
break;
default:
+ // TODO: replace Kryo with Fury
(https://github.com/apache/fury)
this.writeBytes(KryoUtil.toKryoWithType(value));
break;
}
@@ -624,15 +620,12 @@ public final class BytesBuffer extends OutputStream {
case UUID:
return new UUID(this.readLong(), this.readLong());
default:
+ // TODO: replace Kryo with Fury
(https://github.com/apache/fury)
return KryoUtil.fromKryoWithType(this.readBytes());
}
}
public BytesBuffer writeId(Id id) {
- return this.writeId(id, false);
- }
-
- public BytesBuffer writeId(Id id, boolean big) {
switch (id.type()) {
case LONG:
// Number Id
@@ -640,36 +633,33 @@ public final class BytesBuffer extends OutputStream {
this.writeNumber(value);
break;
case UUID:
- // UUID Id
+ // UUID ID
byte[] bytes = id.asBytes();
assert bytes.length == Id.UUID_LENGTH;
this.writeUInt8(0x7f); // 0b01111111 means UUID
this.write(bytes);
break;
case EDGE:
- // Edge Id
+ // Edge ID
this.writeUInt8(0x7e); // 0b01111110 means EdgeId
this.writeEdgeId(id);
break;
default:
- // String Id
+ // String Id (VertexID)
bytes = id.asBytes();
int len = bytes.length;
E.checkArgument(len > 0, "Can't write empty id");
- if (!big) {
- E.checkArgument(len <= ID_LEN_MAX,
- "Id max length is %s, but got %s {%s}",
- ID_LEN_MAX, len, id);
- len -= 1; // mapping [1, 128] to [0, 127]
+ E.checkArgument(len <= ID_LEN_MAX, "Big id max length is %s,
but got %s {%s}",
+ ID_LEN_MAX, len, id);
+ len -= 1; // mapping [1, 16384] to [0, 16383]
+ if (len <= 0x3f) {
+ // If length is <= 63, use a single byte with the highest
bit set to 1
this.writeUInt8(len | 0x80);
} else {
- E.checkArgument(len <= BIG_ID_LEN_MAX,
- "Big id max length is %s, but got %s {%s}",
- BIG_ID_LEN_MAX, len, id);
- len -= 1;
int high = len >> 8;
int low = len & 0xff;
- this.writeUInt8(high | 0x80);
+ // Write high 8 bits with highest two bits set to 11
+ this.writeUInt8(high | 0xc0);
this.writeUInt8(low);
}
this.write(bytes);
@@ -679,10 +669,6 @@ public final class BytesBuffer extends OutputStream {
}
public Id readId() {
- return this.readId(false);
- }
-
- public Id readId(boolean big) {
byte b = this.read();
boolean number = (b & 0x80) == 0;
if (number) {
@@ -698,13 +684,13 @@ public final class BytesBuffer extends OutputStream {
}
} else {
// String Id
- int len = b & ID_LEN_MASK;
- if (big) {
+ int len = b & 0x3f; // Take the lowest 6 bits as part of the length
+ if ((b & 0x40) != 0) { // If the 7th bit is set, length
information spans 2 bytes
int high = len << 8;
int low = this.readUInt8();
len = high + low;
}
- len += 1; // restore [0, 127] to [1, 128]
+ len += 1; // restore [0, 16383] to [1, 16384]
byte[] id = this.read(len);
return IdGenerator.of(id, IdType.STRING);
}
@@ -739,12 +725,11 @@ public final class BytesBuffer extends OutputStream {
this.write(bytes);
if (type.isStringIndex()) {
if (Bytes.contains(bytes, STRING_ENDING_BYTE)) {
- // Not allow STRING_ENDING_BYTE exist in string index id
+ // Not allow STRING_ENDING_BYTE to exist in string index id
E.checkArgument(false,
"The %s type index id can't contains " +
- "byte '0x%s', but got: 0x%s", type,
- Bytes.toHex(STRING_ENDING_BYTE),
- Bytes.toHex(bytes));
+ "byte '0x%s', but got: 0x%s",
+ type, Bytes.toHex(STRING_ENDING_BYTE),
Bytes.toHex(bytes));
}
if (withEnding) {
this.writeStringWithEnding("");
@@ -806,12 +791,9 @@ public final class BytesBuffer extends OutputStream {
}
// Parse id from bytes
int start = this.buffer.position();
- /**
- * OLAP
- * {PropertyKey}{VertexId}
- */
+ // OLAP {PropertyKey}{VertexId}
if (isOlap) {
- // First read olap property id
+ // Read olap property id first
Id pkId = this.readId();
}
Id id = this.readId();
@@ -890,8 +872,7 @@ public final class BytesBuffer extends OutputStream {
}
private long readNumber(byte b) {
- E.checkArgument((b & 0x80) == 0,
- "Not a number type with prefix byte '0x%s'",
+ E.checkArgument((b & 0x80) == 0, "Not a number type with prefix byte
'0x%s'",
Bytes.toHex(b));
// Parse the kind from byte 0kkksxxx
int kind = b >>> 4;
@@ -948,8 +929,7 @@ public final class BytesBuffer extends OutputStream {
break;
}
}
- E.checkArgument(foundEnding, "Not found ending '0x%s'",
- Bytes.toHex(STRING_ENDING_BYTE));
+ E.checkArgument(foundEnding, "Not found ending '0x%s'",
Bytes.toHex(STRING_ENDING_BYTE));
int end = this.buffer.position() - 1;
int len = end - start;
if (len <= 0) {
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeEdge.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeEdge.java
index 53b8a5493..f38c2b067 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeEdge.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeEdge.java
@@ -147,9 +147,9 @@ public class HugeEdge extends HugeElement implements Edge,
Cloneable {
if (this.fresh()) {
int len = this.id.length();
- E.checkArgument(len <= BytesBuffer.BIG_ID_LEN_MAX,
+ E.checkArgument(len <= BytesBuffer.EID_LEN_MAX,
"The max length of edge id is %s, but got %s {%s}",
- BytesBuffer.BIG_ID_LEN_MAX, len, this.id);
+ BytesBuffer.EID_LEN_MAX, len, this.id);
}
}
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeElement.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeElement.java
index 137e623d8..adb12f31b 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeElement.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/structure/HugeElement.java
@@ -55,7 +55,6 @@ public abstract class HugeElement implements Element,
GraphType, Idfiable, Compa
private static final MutableIntObjectMap<HugeProperty<?>> EMPTY_MAP =
CollectionFactory.newIntObjectMap();
- private static final int MAX_PROPERTIES = BytesBuffer.UINT16_MAX;
private final HugeGraph graph;
private MutableIntObjectMap<HugeProperty<?>> properties;
@@ -279,7 +278,7 @@ public abstract class HugeElement implements Element,
GraphType, Idfiable, Compa
PropertyKey pkey = prop.propertyKey();
E.checkArgument(this.properties.containsKey(intFromId(pkey.id())) ||
- this.properties.size() < MAX_PROPERTIES,
+ this.properties.size() < BytesBuffer.MAX_PROPERTIES,
"Exceeded the maximum number of properties");
return this.properties.put(intFromId(pkey.id()), prop);
}
diff --git
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/HugeTask.java
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/HugeTask.java
index c07b9e8d4..f9e4f120f 100644
---
a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/HugeTask.java
+++
b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/task/HugeTask.java
@@ -725,7 +725,7 @@ public class HugeTask<V> extends FutureTask<V> {
}
private void checkPropertySize(int propertyLength, String propertyName) {
- long propertyLimit = BytesBuffer.STRING_LEN_MAX;
+ long propertyLimit = BytesBuffer.MAX_PROPERTIES;
HugeGraph graph = this.scheduler().graph();
if (propertyName.equals(P.INPUT)) {
propertyLimit = graph.option(CoreOptions.TASK_INPUT_SIZE_LIMIT);
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/EdgeCoreTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/EdgeCoreTest.java
index b79cae196..265d40874 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/EdgeCoreTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/EdgeCoreTest.java
@@ -75,7 +75,6 @@ import
org.apache.tinkerpop.gremlin.structure.util.CloseableIterator;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.Assume;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
@@ -470,12 +469,13 @@ public class EdgeCoreTest extends BaseCoreTest {
Vertex book = graph.addVertex(T.label, "book", "name", "Test-Book-1");
Assert.assertThrows(IllegalArgumentException.class, () -> {
- final int LEN = BytesBuffer.BIG_ID_LEN_MAX;
+ final int LEN = BytesBuffer.EID_LEN_MAX;
String largeTime = "{large-time}" + new String(new byte[LEN]);
james.addEdge("write", book, "time", largeTime);
graph.tx().commit();
}, e -> {
- Assert.assertContains("The max length of edge id is 32768",
+ Assert.assertContains(String.format("The max length of edge id is
%s",
+ BytesBuffer.EID_LEN_MAX),
e.getMessage());
});
}
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/VertexCoreTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/VertexCoreTest.java
index c9a83ddc1..a329de3af 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/VertexCoreTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/VertexCoreTest.java
@@ -44,6 +44,7 @@ import org.apache.hugegraph.backend.page.PageInfo;
import org.apache.hugegraph.backend.query.Condition;
import org.apache.hugegraph.backend.query.ConditionQuery;
import org.apache.hugegraph.backend.query.Query;
+import org.apache.hugegraph.backend.serializer.BytesBuffer;
import org.apache.hugegraph.backend.store.BackendTable;
import org.apache.hugegraph.backend.store.Shard;
import org.apache.hugegraph.backend.tx.GraphTransaction;
@@ -1039,10 +1040,10 @@ public class VertexCoreTest extends BaseCoreTest {
"name", "marko", "age", 18, "city", "Beijing");
});
- // Expect id length <= 128
+ // Expect id length <= BytesBuffer.ID_LEN_MAX
Assert.assertThrows(IllegalArgumentException.class, () -> {
- String largeId = new String(new byte[128]) + ".";
- assert largeId.length() == 129;
+ String largeId = new String(new byte[BytesBuffer.ID_LEN_MAX]) +
".";
+ assert largeId.length() == BytesBuffer.ID_LEN_MAX + 1;
graph.addVertex(T.label, "programmer", T.id, largeId,
"name", "marko", "age", 18, "city", "Beijing");
});
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/cache/CacheTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/cache/CacheTest.java
index 63837c8aa..d9bd4cf95 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/cache/CacheTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/cache/CacheTest.java
@@ -139,6 +139,7 @@ public abstract class CacheTest extends BaseUnitTest {
public static class OffheapCacheTest extends CacheTest {
private static final long ENTRY_SIZE = 40L;
+ private static final int SEGMENTS = 4;
private final HugeGraph graph = Mockito.mock(HugeGraph.class);
@Override
@@ -148,7 +149,7 @@ public abstract class CacheTest extends BaseUnitTest {
@Override
protected Cache<Id, Object> newCache(long capacity) {
- return new OffheapCache(this.graph(), capacity, ENTRY_SIZE);
+ return new OffheapCache(this.graph(), capacity, ENTRY_SIZE,
SEGMENTS);
}
@Override
@@ -325,7 +326,7 @@ public abstract class CacheTest extends BaseUnitTest {
@Test
public void testUpdateAndGetWithSameSizeAndCapacity() {
- int limit = 40;
+ int limit = 1000;
Cache<Id, Object> cache = newCache(limit);
Map<Id, Object> map = new LimitMap(limit);
@@ -451,7 +452,7 @@ public abstract class CacheTest extends BaseUnitTest {
@Test
public void testSizeWithReachCapacity() {
- int limit = 20;
+ int limit = 1000;
Cache<Id, Object> cache = newCache(limit);
Map<Id, Object> map = new LimitMap(limit);
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/id/IdUtilTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/id/IdUtilTest.java
index fa582322a..fe9925b2b 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/id/IdUtilTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/id/IdUtilTest.java
@@ -154,4 +154,22 @@ public class IdUtilTest {
}
return bytes;
}
+
+ /**
+ * Converts a byte array to a hexadecimal string.
+ *
+ * @param bytes the byte array to convert
+ * @return the hexadecimal string representation of the byte array
+ */
+ private String bytesToHex(byte[] bytes) {
+ StringBuilder hexString = new StringBuilder();
+ for (byte b : bytes) {
+ String hex = Integer.toHexString(0xFF & b);
+ if (hex.length() == 1) {
+ hexString.append('0'); // pad with leading zero if needed
+ }
+ hexString.append(hex);
+ }
+ return hexString.toString();
+ }
}
diff --git
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/serializer/BytesBufferTest.java
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/serializer/BytesBufferTest.java
index 907265290..fb25a5b25 100644
---
a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/serializer/BytesBufferTest.java
+++
b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/unit/serializer/BytesBufferTest.java
@@ -96,29 +96,35 @@ public class BytesBufferTest extends BaseUnitTest {
@Test
public void testStringIdWithBigSize() {
Id id = IdGenerator.of(genString(127));
- byte[] bytes = genBytes(128);
- bytes[0] = (byte) 0xfe;
+ byte[] bytes = genBytes(129);
+ bytes[0] = (byte) 0xc0;
+ bytes[1] = (byte) 0x7e;
Assert.assertArrayEquals(bytes, BytesBuffer.allocate(0)
.writeId(id).bytes());
Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId());
id = IdGenerator.of(genString(128));
- bytes = genBytes(129);
- bytes[0] = (byte) 0xff;
+ bytes = genBytes(130);
+ bytes[0] = (byte) 0xc0;
+ bytes[1] = (byte) 0x7f;
Assert.assertArrayEquals(bytes, BytesBuffer.allocate(0)
.writeId(id).bytes());
Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId());
Assert.assertThrows(IllegalArgumentException.class, () -> {
- BytesBuffer.allocate(0).writeId(IdGenerator.of(genString(129)));
+
BytesBuffer.allocate(0).writeId(IdGenerator.of(genString(BytesBuffer.ID_LEN_MAX
+ 1)));
}, e -> {
- Assert.assertContains("Id max length is 128, but got 129",
+ Assert.assertContains(String.format("Big id max length is %s, but
got %s",
+ BytesBuffer.ID_LEN_MAX,
+ BytesBuffer.ID_LEN_MAX + 1),
e.getMessage());
});
Assert.assertThrows(IllegalArgumentException.class, () -> {
- BytesBuffer.allocate(0).writeId(IdGenerator.of(genString(130)));
+
BytesBuffer.allocate(0).writeId(IdGenerator.of(genString(BytesBuffer.ID_LEN_MAX
+ 2)));
}, e -> {
- Assert.assertContains("Id max length is 128, but got 130",
+ Assert.assertContains(String.format("Big id max length is %s, but
got %s",
+ BytesBuffer.ID_LEN_MAX,
+ BytesBuffer.ID_LEN_MAX + 2),
e.getMessage());
});
}
@@ -127,33 +133,34 @@ public class BytesBufferTest extends BaseUnitTest {
public void testStringBigId() {
Id id = IdGenerator.of(genString(128));
byte[] bytes = genBytes(130);
- bytes[0] = (byte) 0x80;
+ bytes[0] = (byte) 0xc0;
bytes[1] = (byte) 0x7f;
Assert.assertArrayEquals(bytes, BytesBuffer.allocate(0)
- .writeId(id, true).bytes());
- Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId(true));
+ .writeId(id).bytes());
+ Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId());
- id = IdGenerator.of(genString(32512));
- bytes = genBytes(32514);
- bytes[0] = (byte) 0xfe;
- bytes[1] = (byte) 0xff;
+ id = IdGenerator.of(genString(BytesBuffer.ID_LEN_MAX - 1));
+ bytes = genBytes(BytesBuffer.ID_LEN_MAX + 1);
+ bytes[0] = (byte) 0xff;
+ bytes[1] = (byte) 0xfe;
Assert.assertArrayEquals(bytes, BytesBuffer.allocate(0)
- .writeId(id, true).bytes());
- Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId(true));
+ .writeId(id).bytes());
+ Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId());
- id = IdGenerator.of(genString(32768));
- bytes = genBytes(32770);
+ id = IdGenerator.of(genString(BytesBuffer.ID_LEN_MAX));
+ bytes = genBytes(BytesBuffer.ID_LEN_MAX + 2);
bytes[0] = (byte) 0xff;
bytes[1] = (byte) 0xff;
Assert.assertArrayEquals(bytes, BytesBuffer.allocate(0)
- .writeId(id, true).bytes());
- Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId(true));
+ .writeId(id).bytes());
+ Assert.assertEquals(id, BytesBuffer.wrap(bytes).readId());
Assert.assertThrows(IllegalArgumentException.class, () -> {
- BytesBuffer.allocate(0).writeId(IdGenerator.of(genString(32769)),
- true);
+
BytesBuffer.allocate(0).writeId(IdGenerator.of(genString(BytesBuffer.ID_LEN_MAX
+ 1)));
}, e -> {
- Assert.assertContains("Big id max length is 32768, but got 32769",
+ Assert.assertContains(String.format("Big id max length is %s, but
got %s",
+ BytesBuffer.ID_LEN_MAX,
+ BytesBuffer.ID_LEN_MAX + 1),
e.getMessage());
});
}