The code I am calling is an copy of TinkerPop's process test that is
failing on Sqlg.

WriteTest.g_io_write_withXwrite_gryoX()
...
return g.io(fileToWrite).with(IO.writer, IO.gryo).write();
 
So there is no opportunity for me to manually register a io registry.
That said the SqlgIoRegistryV3 does get called and registers the
RecordId. Somehow later down the line it can not find it.

But let me spend some time with the io api, and get rid of the
deprecated code.

Thanks
Pieter


On Mon, 2019-08-12 at 13:53 -0400, Stephen Mallette wrote:
> I don't think that this:
> 
> traversal =  this.sqlgGraph.traversal().io(fileToWrite).write(....)
> 
> does anything to check your registry that is initialized by way of your
> Graph instance. The registry must be explicitly passed as an argument using
> with() - you can see examples here:
> 
> http://tinkerpop.apache.org/docs/current/reference/#io-step
> 
> but  basically:
> 
> g.io(someInputFile).
>     with(IO.reader, IO.gryo).
>     with(IO.registry, TinkerIoRegistryV3d0.instance())
>   read().iterate()
> g.io(someOutputFile).
>     with(IO.writer,IO.graphson).
>     with(IO.registry,
> "org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerIoRegistryV3d0")
>   write().iterate()
> 
> We can't rely on the Graph instance existing anymore given that many graphs
> don't even implement that interface anymore....they just support Gremlin.
> Now, you could probably help sqlg users out if you wanted by creating a
> SqlgIoStep and auto-registering the registry for users. Then you have a
> TraversalStrategy use your step in place of TinkerPop's. Then that would
> work.
> 
> On Mon, Aug 12, 2019 at 1:43 PM pieter martin <[email protected]>
> wrote:
> 
> It is in the SqlGraph.io(...)
> 
>     @Override
> 
>     public <I extends Io> I io(final Io.Builder<I> builder) {
> 
>         if (builder.requiresVersion(GryoVersion.V1_0) || 
> builder.requiresVersion(GraphSONVersion.V1_0))
> 
>             return (I) builder.graph(this).onMapper(mapper -> 
> mapper.addRegistry(SqlgIoRegistryV1.instance())).create();
> 
>         else if (builder.requiresVersion(GraphSONVersion.V2_0))   // there is 
> no gryo v2
> 
>             return (I) builder.graph(this).onMapper(mapper -> 
> mapper.addRegistry(SqlgIoRegistryV2.instance())).create();
> 
>         else
> 
>             return (I) builder.graph(this).onMapper(mapper -> 
> mapper.addRegistry(SqlgIoRegistryV3.instance())).create();
> 
>     }
> 
> 
>     private SqlgIoRegistryV3() {
> 
>         final SqlgSimpleModuleV3 sqlgSimpleModule = new SqlgSimpleModuleV3();
> 
>         register(GraphSONIo.class, null, sqlgSimpleModule);
> 
>         register(GryoIo.class, RecordId.class, null);
> 
>     }
> 
> 
> I checked it is being invoked.
> 
> The test I am currently running is,
> 
>         loadModern();
> 
>         final String fileToWrite = 
> TestHelper.generateTempFile(WriteTest.class, "tinkerpop-modern-v3d0", 
> ".kryo").getAbsolutePath().replace('\\', '/');
> 
>         final File f = new File(fileToWrite);
> 
>         assertThat(f.length() == 0, is(true));
> 
>         final Traversal<Object,Object> traversal =  
> this.sqlgGraph.traversal().io(fileToWrite).with(IO.writer, IO.gryo).write();
> 
> 
> And it breaks on kryo.getRegistration(type) where type = class
> org.umlg.sqlg.structure.RecordId
> 
> public class GryoClassResolverV3d0 {
> 
> ...
> 
> 
> public Registration writeClass(final Output output, final Class type) {
> 
>     ...
> 
>     final Registration registration = kryo.getRegistration(type);
> 
>     ...
> 
> }
> 
> 
> I only realized now that Graph.io() has been deprecated. Do you think that
> that is the reason?
> 
> Thanks
> Pieter
> 
> On Mon, 2019-08-12 at 08:52 -0400, Stephen Mallette wrote:
> 
> How are you supplying that SqlgIoRegistryV3 to gryo for usage?
> 
> On Mon, Aug 12, 2019 at 8:31 AM pieter martin <[email protected]>
> wrote:
> 
> Hi,
> 
> I am upgrading Sqlg, to 3.4.1 and soon after that to 3.4.3.
> 
> The process serialization tests are failing with,
> 
> java.lang.IllegalArgumentException: Class is not registered:
> org.umlg.sqlg.structure.RecordId
> Note: To register this class use:
> kryo.register(org.umlg.sqlg.structure.RecordId.class);
> 
> However RecordId is registered in SqlgIoRegistryV3 with
> 
> register(GryoIo.class, RecordId.class, null);
> 
> I notice in the provider documentation that a serializer should be
> provided.
> However RecordId implements KryoSerializable which I understood takes
> care of serializing the RecordId.
> 
> I checked the CustomId class in TinkerPop's code base but it neither
> registers a serializer nor implements KryoSerializable.
> 
> I get a bit lost in reading the serialization code, can you please
> point me in the right direction?
> 
> Thanks
> Pieter
> 
> 
> 
> 

Reply via email to