Ошибка NegativeArraySizeException возникает при попытке создать ребро между двумя вершинами в удаленном сеансе - PullRequest
2 голосов
/ 01 апреля 2019

Я пытаюсь добавить ребро между двумя вершинами с помощью фреймворка gremlin scala, подключенного к удаленному серверу JanusGraph. Пока этот край создан, я все еще получаю исключение ошибки "org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException"

Ребро и вершины действительно создаются, но ошибка все еще выбрасывается, и я не могу ее поймать. Я использую JanusGraph 0.3.1 и пробовал использовать разные версии scala gremlin (3.3, 3.4), что приводило к одной и той же ошибке.

val serializer = new GryoMessageSerializerV3d0(GryoMapper.build.addRegistry(TinkerIoRegistryV3d0.instance))
val cluster = Cluster.build.addContactPoint("localhost").port(8182).serializer(serializer).create
implicit val graph: ScalaGraph = EmptyGraph.instance.asScala.configure(_.withRemote(DriverRemoteConnection.using(cluster)))

val Founded = Key[String]("founded")
val Distance = Key[Int]("distance")

// create labelled vertex
val paris = graph + "Paris"

// create vertex with typed properties
val london = graph + ("London", Founded -> "43 AD")

// create labelled edges
paris --- ("OneWayRoad",  Distance -> 495) --> london
cluster.close()

Сообщение об ошибке, выданное во время выполнения

15:34:02.704 [gremlin-driver-loop-1] WARN  o.a.t.g.driver.MessageSerializer - Response [PooledUnsafeDirectByteBuf(ridx: 92, widx: 92, cap: 92)] could not be deserialized by org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.
org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
    at org.apache.tinkerpop.shaded.kryo.serializers.ObjectField.read(ObjectField.java:144)
    at org.apache.tinkerpop.shaded.kryo.serializers.FieldSerializer.read(FieldSerializer.java:557)
...
Caused by: java.lang.NegativeArraySizeException: null
    at org.apache.tinkerpop.shaded.kryo.io.Input.readBytes(Input.java:325)
[...]
15:34:02.705 [gremlin-driver-loop-1] ERROR o.a.t.g.d.Handler$GremlinResponseHandler - Could not process the response
io.netty.handler.codec.DecoderException: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:98)
[...]
Caused by: org.apache.tinkerpop.gremlin.driver.ser.SerializationException: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
    at org.apache.tinkerpop.gremlin.driver.ser.AbstractGryoMessageSerializerV3d0.deserializeResponse(AbstractGryoMessageSerializerV3d0.java:159)
[...]
Caused by: org.apache.tinkerpop.shaded.kryo.KryoException: java.lang.NegativeArraySizeException
Serialization trace:
id (org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge)
    at org.apache.tinkerpop.shaded.kryo.serializers.ObjectField.read(ObjectField.java:144)
[...]
Caused by: java.lang.NegativeArraySizeException: null
    at org.apache.tinkerpop.shaded.kryo.io.Input.readBytes(Input.java:325)
[...]

Отладчик показывает мне, что ошибка создается при создании ребра. Использование

val edge = g.V(paris).as("a").V(london).addE("test").iterate()

приводит к той же ошибке. Вот мой файл конфигурации gremlin-server.yaml

host: 0.0.0.0
port: 8182
scriptEvaluationTimeout: 180000
channelizer: org.apache.tinkerpop.gremlin.server.channel.WebSocketChannelizer
graphs: {
  graph: conf/gremlin-server/janusgraph-cql-es-server.properties,
  ConfigurationManagementGraph: conf/janusgraph-cql-configurationgraph.properties
}
scriptEngines: {
  gremlin-groovy: {
    plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
               org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
               org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/empty-sample.groovy]}}}}
serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  # Older serialization versions for backwards compatibility:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
processors:
  - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }}
  - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}
metrics: {
  consoleReporter: {enabled: true, interval: 180000},
  csvReporter: {enabled: true, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
  jmxReporter: {enabled: true},
  slf4jReporter: {enabled: true, interval: 180000},
  gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
  graphiteReporter: {enabled: false, interval: 180000}}
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferLowWaterMark: 32768
writeBufferHighWaterMark: 65536

Ошибка не появляется при работе без использования удаленного сервера:

implicit val graph: ScalaGraph = EmptyGraph.instance

работает нормально.

1 Ответ

0 голосов
/ 05 апреля 2019

Эта проблема обычно указывает на проблему совместимости с Gryo, которая обычно обнаруживается при смешивании версий TinkerPop.По большей части Gryo имеет тенденцию быть обратно совместимыми между версиями, поэтому Gryo 1.0 из 3.3.3 будет работать с 3.3.4, но бывают случаи, когда это не всегда верно (например, обнаружена ошибка в ядре формата).и необходимо срочное изменение.)

TinkerPop рекомендует при использовании Gryo выровнять версию TinkerPop на сервере с клиентом.Итак, JanusGraph 0.3.1 использует TinkerPop 3.3.3 , поэтому ваша версия Gremlin Scala должна быть 3.3.3.x (я уверен, что Gremlin Scala связывает свои первые три номера версий с TinkerPop).Похоже, вы уже пробовали это, поэтому давайте теперь рассмотрим вашу конфигурацию.

Я отмечаю, что вы добавили TinkerIoRegistryV3d0, но, поскольку вы используете JanusGraph, вам также может понадобиться добавить их пользовательскиеIoRegistry:

GryoMessageSerializerV3d0(GryoMapper.build.addRegistry(JanusGraphIoRegistry.getInstance()))

Вы можете добавить TinkerIoRegistryV3d0, если это требуется в вашем случае использования - обычно полезно только для возврата подграфов.Если ничего из этого не решит проблему, то мое единственное предложение - сильно упростить: удалите все конфигурации сериализатора из конфигурации Gremlin Server, кроме той, которую вы используете, убедитесь, что вы можете подключиться к ней с помощью простых сценариев, настраивающих драйвер с использованием всего лишьКонсоль Gremlin и обратите внимание на то, что это за конфигурация, чтобы заставить соединение работать, чтобы вы могли перенести конфигурацию в Gremlin Scala.

Я вижу, что вы в настоящее время изолировали проблему следующим образом:

val edge = g.V(paris).as("a").V(london).addE("test").iterate()

Обратите внимание, что этот код не выполняет то, что, как я думаю, вы хотите, по нескольким причинам:

  1. Если вы хотите вернуть ребро обратно, вам нужно next(), а не iterate()
  2. Это не добавляет ребра между «Парижем» и «Лондоном» - это добавление самоссылкикрай в "лондон".Вам нужно указать from() или to() после addE().

Надеюсь, что-то там поможет.

...