Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DataFetchingException (index out of bounds) when planning journey during period of disruption #6072

Open
miklcct opened this issue Sep 18, 2024 · 1 comment · May be fixed by #6136
Open

Comments

@miklcct
Copy link
Contributor

miklcct commented Sep 18, 2024

Summary

When trying to plan itineraries during period of disruptions (a large number of train delays, cancellations and replacements), OpenTripPlanner produces error in queries.

Expected behavior

Itineraries are returned

Observed behavior

The GraphQL query returns error

{
  "errors": [
    {
      "message": "Exception while fetching data (/plan) : Index 12 out of bounds for length 12",
      "locations": [
        {
          "line": 6,
          "column": 3
        }
      ],
      "path": [
        "plan"
      ],
      "extensions": {
        "classification": "DataFetchingException"
      }
    }
  ],
  "data": {
    "plan": null
  }
}

Repeated queries return the following:

{
  "errors": [
    {
      "message": "Exception while fetching data (/plan) : null",
      "locations": [
        {
          "line": 6,
          "column": 3
        }
      ],
      "path": [
        "plan"
      ],
      "extensions": {
        "classification": "DataFetchingException"
      }
    }
  ],
  "data": {
    "plan": null
  }
}

There is nothing in the OpenTripPlanner console output.

Version of OTP used (exact commit hash or JAR name)

e9200c0

Data sets in use (links to GTFS and OSM PBF files)

The Greater London and Surrey maps are used.

The timetable and real-time information can be downloaded here and here (expires 31 days).

Command line used to start OTP

NR_GTFSRT_URL=file:///home/michael/projects/darwin-gtfs-converter/national_rail_gtfsrt.binpb java -Xmx16G -jar otp-shaded.jar --build --save --serve .

Router config and graph build config JSON

The time zone used is Europe/London.

otp-config.json

{
	"otpFeatures" : {
		"GtfsGraphQlApi": true,
		"ParallelRouting": true,
		"TransferConstraints" : true,
		"TransmodelGraphQlApi": true,
		"ActuatorAPI": true,
		"Co2Emissions": true,
		"FaresV2": true,
		"FlexRouting": true,
		"SandboxAPIGeocoder": true,
		"SandboxAPIParkAndRideApi": true
	}
}

build-config.json

{
	"areaVisibility": true,
	"dataImportReport": true,
	"maxTransferDuration": "PT15M",
	"multiThreadElevationCalculations": true,
	"staticBikeParkAndRide" : true,
	"staticParkAndRide" : true,
	"stopConsolidationFile" : "consolidated-stops.csv",
	"subwayAccessTime": "1.0",
	"transitModelTimeZone": "Europe/London",
	"transitServiceEnd": "P3M",
	"transitServiceStart": "P-7D",
	"boardingLocationTags": ["ref", "ref:crs", "naptan:AtcoCode", "naptan:NaptanCode"],
	"gtfsDefaults": {
		"discardMinTransferTimes": true
	},
	"osmDefaults" : {
		"osmTagMapping" : "uk",
		"timeZone" : "Europe/London"
	},
	"transitFeeds" : [
		{
			"type" : "gtfs",
			"feedId" : "DfT",
			"source" : "gtfs-dft.zip"
		},
		{
			"type" : "gtfs",
			"feedId" : "NR",
			"source" : "national_rail_gtfs.zip"
		}
	]
}

router-config.json

{
  "routingDefaults": { 
    "drivingDirection": "left",
    "locale": "en_GB",
    "numItineraries": 10,
    "searchWindow": "PT6H",
    "transferSlack": "PT30S",
    "waitReluctance": 1.76,
    "accessEgress": {
      "maxDuration": "PT2H"
    },
    "walk": {
      "boardCost": 300,
      "reluctance": 1.68
    },
    "wheelchairAccessibility": {
      "trip": {
        "onlyConsiderAccessible": false,
        "unknownCost": 600,
        "inaccessibleCost": 3600
      },
      "stop": {
        "onlyConsiderAccessible": false,
        "unknownCost": 600,
        "inaccessibleCost": 3600
      },
      "elevator": {
        "onlyConsiderAccessible": false
      },
      "inaccessibleStreetReluctance": 25,
      "maxSlope": 0.08333,
      "slopeExceededReluctance": 50,
      "stairsReluctance": 25
    }
  },
  "timetableUpdates": {
    "maxSnapshotFrequency": "PT5S" 
  },
  "transit": {
    "searchThreadPoolSize": 4,
    "transferCacheRequests": [
      {
        "modes" : "WALK",
        "walk" : {
          "boardCost" : 300,
          "reluctance" : 1.68
        }
      },
      {
        "modes" : "WALK",
        "walk" : {
          "boardCost" : 300,
          "reluctance" : 1.68
        },
        "wheelchairAccessibility" : {
          "enabled" : true
        }
      },
      {
        "modes" : "WALK",
        "walk" : {
          "boardCost" : 0,
          "reluctance" : 1.0
        }
      },
      {
        "modes" : "WALK",
        "walk" : {
          "boardCost" : 0,
          "reluctance" : 1.0
        },
        "wheelchairAccessibility" : {
          "enabled" : true
        }
      }
    ]
  },
  "updaters": [
    {
      "type": "stop-time-updater",
      "url": "${NR_GTFSRT_URL}",
      "feedId" : "NR",
      "frequency": "PT27S"
    }
  ]
}

Steps to reproduce the problem

Run the following exact query (it refers to a journey through a period of train disruption)

query GtfsExampleQuery {
  plan(
    from: {lat: 51.520303, lon: -0.104917},
    to:{lat: 51.231734, lon: -0.334611},
    date: "2024-09-17"
    time: "17:30"
  ) {
    itineraries {
      legs {
        from {
          name
        }
        to {
          name
        }
        duration
        route {
          shortName
        }
        headsign
      }
    }
  }
}

The problem doesn't exist if the date is changed to some future dates when real-time data are not yet available.

@miklcct miklcct changed the title DataFetchingException (/plan : null) when planning journey during period of disruption DataFetchingException (index out of bounds) when planning journey during period of disruption Sep 18, 2024
@miklcct
Copy link
Contributor Author

miklcct commented Oct 10, 2024

Stack trace:

 09:45:15.287 WARN [grizzly-1]  (LoggingDataFetcherExceptionHandler.java:19) Exception while fetching data (/plan/itineraries[5]/legs[3]/nextLegs) : Index 15 out of bounds for length 15
 java.lang.ArrayIndexOutOfBoundsException: Index 15 out of bounds for length 15
         at org.opentripplanner.transit.model.network.TripPattern.getHopGeometry(TripPattern.java:183)
         at org.opentripplanner.model.plan.ScheduledTransitLeg.extractTransitLegCoordinates(ScheduledTransitLeg.java:442)
         at org.opentripplanner.model.plan.ScheduledTransitLeg.<init>(ScheduledTransitLeg.java:89)
         at org.opentripplanner.model.plan.ScheduledTransitLegBuilder.build(ScheduledTransitLegBuilder.java:163)
         at org.opentripplanner.routing.alternativelegs.AlternativeLegs.mapToLeg(AlternativeLegs.java:264)
         at org.opentripplanner.routing.alternativelegs.AlternativeLegs.generateLegs(AlternativeLegs.java:213)
         at org.opentripplanner.routing.alternativelegs.AlternativeLegs.lambda$getAlternativeLegs$3(AlternativeLegs.java:123)
         at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:273)
         at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:300)
         at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:280)
         at java.base/java.util.stream.DistinctOps$1$2.accept(DistinctOps.java:174)
         at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
         at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
         at java.base/java.util.HashMap$KeySpliterator.tryAdvance(HashMap.java:1736)
         at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:280)
         at java.base/java.util.HashMap$KeySpliterator.tryAdvance(HashMap.java:1736)
         at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
         at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
         at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
         at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
         at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
         at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
         at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
         at org.opentripplanner.routing.alternativelegs.AlternativeLegs.getAlternativeLegs(AlternativeLegs.java:134)
         at org.opentripplanner.apis.gtfs.datafetchers.LegImpl.lambda$nextLegs$36(LegImpl.java:306)
         at graphql.execution.ExecutionStrategy.invokeDataFetcher(ExecutionStrategy.java:533)
         at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:497)
         at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:438)
         at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:397)
         at graphql.execution.ExecutionStrategy.getAsyncFieldValueInfo(ExecutionStrategy.java:335)
         at graphql.execution.ExecutionStrategy.executeObject(ExecutionStrategy.java:214)
         at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:963)
         at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:701)
         at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:816)
         at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:769)
         at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:686)
         at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:653)
         at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:409)
         at graphql.execution.ExecutionStrategy.getAsyncFieldValueInfo(ExecutionStrategy.java:335)
         at graphql.execution.ExecutionStrategy.executeObject(ExecutionStrategy.java:214)
         at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:963)
         at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:701)
         at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:816)
         at graphql.execution.ExecutionStrategy.completeValueForList(ExecutionStrategy.java:769)
         at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:686)
         at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:653)
         at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:409)
         at graphql.execution.ExecutionStrategy.getAsyncFieldValueInfo(ExecutionStrategy.java:335)
         at graphql.execution.ExecutionStrategy.executeObject(ExecutionStrategy.java:214)
         at graphql.execution.ExecutionStrategy.completeValueForObject(ExecutionStrategy.java:963)
         at graphql.execution.ExecutionStrategy.completeValue(ExecutionStrategy.java:701)
         at graphql.execution.ExecutionStrategy.completeField(ExecutionStrategy.java:653)
         at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:409)
         at graphql.execution.ExecutionStrategy.getAsyncFieldValueInfo(ExecutionStrategy.java:335)
         at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:57)
         at graphql.execution.Execution.executeOperation(Execution.java:181)
         at graphql.execution.Execution.execute(Execution.java:117)
         at graphql.GraphQL.execute(GraphQL.java:546)
         at graphql.GraphQL.lambda$parseValidateAndExecute$13(GraphQL.java:476)
         at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
         at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
         at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:471)
         at graphql.GraphQL.lambda$executeAsync$9(GraphQL.java:429)
         at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187)
         at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341)
         at graphql.GraphQL.executeAsync(GraphQL.java:418)
         at org.opentripplanner.apis.gtfs.GtfsGraphQLIndex.getGraphQLExecutionResult(GtfsGraphQLIndex.java:229)
         at org.opentripplanner.apis.gtfs.GtfsGraphQLIndex.getGraphQLResponse(GtfsGraphQLIndex.java:244)
         at org.opentripplanner.apis.gtfs.GtfsGraphQLAPI.getGraphQL(GtfsGraphQLAPI.java:91)
         at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
         at java.base/java.lang.reflect.Method.invoke(Method.java:580)
         at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:52)
         at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:146)
         at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:189)
         at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:176)
         at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:93)
         at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:478)
         at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:400)
         at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:81)
         at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:274)
         at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248)
         at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244)
         at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
         at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
         at org.glassfish.jersey.internal.Errors.process(Errors.java:244)
         at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:266)
         at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:253)
         at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:696)
         at org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainer.service(GrizzlyHttpContainer.java:367)
         at org.glassfish.grizzly.http.server.HttpHandler$1.run(HttpHandler.java:190)
         at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:535)
         at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:515)
         at java.base/java.lang.Thread.run(Thread.java:1583)

miklcct added a commit to Jnction/OpenTripPlanner that referenced this issue Oct 10, 2024
Such geometries may pattern when a replacement trip partially uses the original geometry
miklcct added a commit to Jnction/OpenTripPlanner that referenced this issue Oct 10, 2024
Such geometries may happen when a replacement trip partially uses the original geometry
@miklcct miklcct linked a pull request Oct 10, 2024 that will close this issue
miklcct added a commit to Jnction/OpenTripPlanner that referenced this issue Oct 25, 2024
miklcct added a commit to Jnction/OpenTripPlanner that referenced this issue Oct 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant