bitflicker64 opened a new issue, #3066:
URL: https://github.com/apache/hugegraph/issues/3066

   ## Source
   - **File:** 
`hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/io/HugeGryoModule.java`
   - **References:** L151-L152
   
   ---
   
   Now I have a clear picture of the issue. Let me summarize what I found:
   
   1. In `HugeGryoModule.java`, there are four Kryo serializer classes for 
schema types:
      - `PropertyKeyKryoSerializer`
      - `VertexLabelKryoSerializer`
      - `EdgeLabelKryoSerializer`
      - `IndexLabelKryoSerializer`
   
   2. Each of these has a `write()` method that is fully implemented (using 
`GraphSONSchemaSerializer` to convert the schema object to a `Map<HugeKeys, 
Object>`, then writing it via `writeEntry()`).
   
   3. However, each `read()` method is a stub that just returns `null` with a 
`// TODO` comment.
   
   4. There's also a `readEntry()` helper method that exists but is marked 
`@SuppressWarnings("unused")` — it's never called because the `read()` methods 
are all stubs.
   
   The issue is that:
   - The Gryo (Kryo-based binary) serialization format is used for TinkerPop's 
Gryo I/O (binary graph format)
   - When deserializing schema objects from Gryo format (e.g., reading a graph 
exported in Gryo format), all four schema type deserializers return `null` 
instead of reconstructing the actual objects
   - This means any code path that reads schema objects from Gryo binary format 
will silently get `null` back, which could cause NullPointerExceptions or 
incorrect behavior
   
   The fix would require:
   1. Implementing `readEntry()` usage in each `read()` method
   2. But there's a complication: `GraphSONSchemaSerializer.writeVertexLabel()` 
serializes property key names (strings) rather than IDs, and the `read()` 
methods would need a `HugeGraph` reference to look up those names back to IDs — 
which the Kryo `Serializer.read()` signature doesn't provide directly.
   
   This is the same challenge that `HugeGraphSONModule` faces — it only 
registers serializers (not deserializers) for schema types.
   
   The `readEntry()` helper is already there and marked 
`@SuppressWarnings("unused")`. The issue is that to reconstruct a `VertexLabel` 
from the map, you need a `HugeGraph` reference (to resolve property key names 
to IDs), which isn't available in the Kryo serializer context.
   
   Files affected: Only 1 file directly contains the TODO stubs — 
`HugeGryoModule.java`. But implementing the fix properly might require changes 
to `GraphSONSchemaSerializer` to add read methods, or adding a way to pass the 
graph context to the serializer.
   
   Let me count the files that would need to change:
   1. `HugeGryoModule.java` - the four `read()` methods need implementation
   2. Possibly `GraphSONSchemaSerializer.java` - would need `readVertexLabel`, 
`readEdgeLabel`, `readPropertyKey`, `readIndexLabel` methods (currently it only 
has write methods)
   
   Actually, looking at the existing code more carefully:
   - `VertexLabel.fromMap()` exists and can reconstruct from a map
   - `readEntry()` already exists in `HugeGryoModule.java` to read the map back
   
   The problem is that `GraphSONSchemaSerializer.writeVertexLabel()` stores 
property key names (strings), not IDs. So to reconstruct, you'd need a graph 
reference to look up IDs from names. The Kryo serializer doesn't have access to 
the graph.
   
   So the fix would need either:
   1. Store IDs instead of names in the write path (breaking change to 
serialization format)
   2. Pass the graph reference to the serializer somehow (e.g., via constructor)
   3. Use a different approach
   
   Actually, looking at `VertexLabel.fromMap()`, it works with IDs (integers), 
not names. So the `GraphSONSchemaSerializer.writeVertexLabel()` format (which 
uses names) is incompatible with `VertexLabel.fromMap()`.
   
   The files affected would be:
   1. `HugeGryoModule.java` - primary file with the TODOs (4 read methods)
   2. Possibly `GraphSONSchemaSerializer.java` - if read methods need to be 
added there
   
   That's essentially 1-2 files directly, though the design challenge (needing 
a graph reference) is the real blocker.
   
   
   ## The Issue
   
   The problem is a **complete asymmetry between serialization and 
deserialization** in the Gryo (Kryo-based binary) schema serializers. All four 
schema-type Kryo serializers in `HugeGryoModule.java` have fully implemented 
`write()` methods but stub `read()` methods that unconditionally return `null`.
   
   ### The four broken `read()` stubs
   
   All four inner classes share the same pattern:
   
   ```java
   // PropertyKeyKryoSerializer (line 151-154)
   @Override
   public PropertyKey read(Kryo kryo, Input input, Class<PropertyKey> c) {
       // TODO
       return null;
   }
   
   // VertexLabelKryoSerializer (line 165-168)
   @Override
   public VertexLabel read(Kryo kryo, Input input, Class<VertexLabel> c) {
       // TODO
       return null;
   }
   
   // EdgeLabelKryoSerializer (line 179-182)
   @Override
   public EdgeLabel read(Kryo kryo, Input input, Class<EdgeLabel> clazz) {
       // TODO
       return null;
   }
   
   // IndexLabelKryoSerializer (line 193-196)
   @Override
   public IndexLabel read(Kryo kryo, Input input, Class<IndexLabel> c) {
       // TODO
       return null;
   }
   ```
   
   
   
   ### What the `write()` side does
   
   Each `write()` method calls `GraphSONSchemaSerializer` to produce a 
`Map<HugeKeys, Object>` (with **string names** for property keys, not IDs), 
then serializes it via `writeEntry()`:
   
   ```java
   public void write(Kryo kryo, Output output, VertexLabel vl) {
       writeEntry(kryo, output, schemaSerializer.writeVertexLabel(vl));
   }
   ```
   
   
   
   There is even a `readEntry()` helper already written (but marked 
`@SuppressWarnings("unused")` because nothing calls it):
   
   ```java
   @SuppressWarnings("unused")
   private static Map<HugeKeys, Object> readEntry(Kryo kryo, Input input) { ... 
}
   ```
   
   
   
   ### The deeper design problem
   
   The `read()` methods can't simply call `readEntry()` and reconstruct the 
object, because:
   
   1. `GraphSONSchemaSerializer.writeVertexLabel()` stores **property key 
names** (strings), not numeric IDs.
   
   
   2. Reconstructing a `VertexLabel` from names requires a `HugeGraph` 
reference to resolve names back to `Id` objects — but the Kryo 
`Serializer.read()` signature only provides `Kryo`, `Input`, and the target 
`Class`. There is no graph context available.
   
   
   3. `GraphSONSchemaSerializer` has **no `read*` methods at all** — it is 
write-only.
   
   
   Note: `HugeGraphSONModule` (the JSON counterpart) has the same gap — it only 
registers serializers, not deserializers, for schema types.
   
   
   ### What needs to change
   
   To fix this properly, **2 files** would be directly affected:
   
   | File | Change needed |
   |---|---|
   | `HugeGryoModule.java` | Implement all 4 `read()` methods; pass a 
`HugeGraph` reference via constructor to each serializer class |
   | `GraphSONSchemaSerializer.java` | Add `readVertexLabel`, `readEdgeLabel`, 
`readPropertyKey`, `readIndexLabel` methods that accept a `Map<HugeKeys, 
Object>` and a `HugeGraph` and reconstruct the schema objects |
   
   The `HugeGraphIoRegistry` or `register()` call site may also need a minor 
touch to supply the graph reference to the serializer constructors, but the 
core logic is confined to those 2 files.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to