Uploaded image for project: 'TinkerPop'
  1. TinkerPop
  2. TINKERPOP-2754

Javascript client hangs if the server restarts

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 3.5.2
    • 3.7.0, 3.6.1, 3.5.4
    • javascript
    • None

    Description

      Reported by avner.levy under https://issues.apache.org/jira/browse/TINKERPOP-2708:
      I have a problem with the javascript client where if the server restarts the client hangs forever (originally happens with AWS Neptune, but easy to reproduce with Tinkerpop as well).
      I've written this small program to demonstrate the issue:

      import gremlin from 'gremlin';
      const holdMainloop = setInterval(()=>console.log('holding mainloop'), 60000);
      const main = async () => {
      try {
      console.log('hello gremlin');
      const traversal = gremlin.process.AnonymousTraversalSource.traversal;
      const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
      const ID = gremlin.process.t.id;
      const _ = gremlin.process.statics;
      const __ = gremlin.process.P;

      const driver = new DriverRemoteConnection('ws://localhost:8182/gremlin', {});

      const log = (header)=>{return (...args)=>console.log(new Date(), header,JSON.stringify(args))};
      const LABEL = 'Test';
      driver.addListener('log', log('log:'));
      driver.addListener('close', log('close:'));
      driver.addListener('socketError', log('sockerError:'));

      const g = traversal().withRemote(driver);
      await g.V().hasLabel(LABEL).drop().next();
      await g.addV(LABEL).property(ID,'1').next();
      await g.addV(LABEL).property(ID,'2').next();
      await g.addE(LABEL).from_(.V('1')).to(.V('2')).property(ID,'e1').next();
      await g.addE(LABEL).from_(.V('2')).to(.V('1')).property(ID,'e2').next();

      while (true) {
      try {
      const start = Date.now();
      console.log(new Date(), 'before query');
      await g.with_('evaluationTimeout', 1000).V('1').repeat(_.out()).times(1500).next();
      console.log(new Date(), `after query, took ${Date.now() - start} ms`);
      } catch (e)

      { console.log('Failed query: ', e); }

      }
      await driver.close();
      } catch (e)

      { console.log('uncaught exception (exit):', e); }

      };
      try

      { await main(); }

      catch (e)

      { console.log('exception in main: ', e); clearInterval(holdMainloop); }

      I run the tinkerpop server in a container and kill it after the above program is running for a few seconds.

      2022-06-17T15:10:25.602Z before query
      2022-06-17T15:10:26.247Z after query, took 645 ms
      2022-06-17T15:10:26.247Z before query
      2022-06-17T15:10:26.804Z after query, took 557 ms
      2022-06-17T15:10:26.804Z before query
      2022-06-17T15:10:27.458Z log: ["ws close code=1006 message="]
      2022-06-17T15:10:27.459Z close: [1006,""]
      2022-06-17T15:11:23.411Z holding mainloop
      2022-06-17T15:12:23.414Z holding mainloop
      ...

      I'm using 3.5.2.
      Package,json:

      {
      "name": "playground",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "type": "module",
      "keywords": [],
      "author": "",
      "license": "ISC",
      "dependencies":

      { "gremlin": "^3.5.2" }

      }

      Attachments

        Activity

          People

            spmallette Stephen Mallette
            xiazcy Yang Xia
            Votes:
            1 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: