Я использую библиотеку Gremlin Python для обхода развертывания JanusGraph сервера Gremlin (то же самое происходит и с использованием только Tinkergraph). Некоторые длинные обходы (с тысячами инструкций) не получают ответа, ошибок, таймаутов, записей журнала или ошибок на сервере или клиенте. Ничего такого.
Условия этого лечения молчанием не ясны. Описанное поведение не зависит линейно от байтов или количества инструкций. Например, у меня навсегда останется такой код:
g = traversal().withRemote(DriverRemoteConnection('ws://localhost:8182/gremlin', 't'))
g = g.inject("")
for i in range(0, 8000):
g = g.constant("test")
print(f"submitting traversal with length={len(g.bytecode.step_instructions)}")
result = g.next()
print(f"done, got: {result}") # this is never reached
Это зависит не только от количества байтов в сообщении запроса, поскольку количество инструкций, на которые я не получаю ответа, не меняется даже при очень больших постоянных значениях вместо простого теста. Например, введение 7000 значений с большим количеством абзацев Lorem Ipsum работает должным образом и возвращается через несколько миллисекунд.
Хотя это не имеет значения (поскольку я должен получать правильную ошибку, а не ничего), я уже увеличил серверные maxHeaderSize
, maxChunkSize
, maxContentLength
и т. Д. До смехотворно высоких чисел. Изменение формата сериализации (например, с GraphSONMessageSerializerV3d0
на GraphBinaryMessageSerializerV1
) тоже не помогает.
Примечание: я знаю, что очень длинные обходы - это анти-шаблон в Gremlin, но иногда невозможно или очень неэффективно структурировать обходы таким образом, чтобы вместо этого они могли использовать введенные значения.