Skip to content

Exception when flex feed contains a mixture of fixed and window-timed stops _and also_ finishes on a flex window stop #6633

@leonardehrenfried

Description

@leonardehrenfried

When a GTFS Flex trip contains a mixture of fixed stops and windows and also finishes on a window OTP, like this

route_id,service_id,trip_id,trip_headsign,trip_short_name,direction_id,block_id,shape_id,wheelchair_accessible,bikes_allowed
t_6035171_b_84558_tn_0,11:15:00,11:15:00,4253075,,,1,,0,0,,0,1,1,booking_route_77386,booking_route_77386,,,1.0,0.0,1.0,0.0,
t_6035171_b_84558_tn_0,11:25:00,11:25:00,4253076,,,2,,0,0,,0,1,1,booking_route_77386,booking_route_77386,,,1.0,0.0,1.0,0.0,
t_6035171_b_84558_tn_0,,,,area_1360,,3,,2,1,,0,1,1,booking_route_77386,booking_route_77386,11:38:00,12:40:00,1.0,0.0,1.0,0.0,
t_6035171_b_84558_tn_0,,,,area_1360,,4,,1,2,,0,1,1,booking_route_77386,booking_route_77386,11:38:00,12:40:00,1.0,0.0,1.0,0.0,

then OTP crashes hard during startup.

14:25:50.068 [ERROR] (OTPMain.java:61) An uncaught error occurred inside OTP: java.lang.IllegalArgumentException: Start of the running period is after end of the running period
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: Start of the running period is after end of the running period
	at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
	at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:540)
	at java.base/java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:567)
	at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:670)
	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:160)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:174)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:765)
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.mappers.RaptorTransitDataMapper.mapTripPatterns(RaptorTransitDataMapper.java:121)
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.mappers.RaptorTransitDataMapper.map(RaptorTransitDataMapper.java:72)
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.mappers.RaptorTransitDataMapper.map(RaptorTransitDataMapper.java:60)
	at org.opentripplanner.standalone.configure.ConstructApplication.createRaptorTransitData(ConstructApplication.java:230)
	at org.opentripplanner.standalone.configure.ConstructApplication.setupTransitRoutingServer(ConstructApplication.java:172)
	at org.opentripplanner.standalone.configure.ConstructApplication.createApplication(ConstructApplication.java:164)
	at org.opentripplanner.standalone.configure.ConstructApplication.createGrizzlyServer(ConstructApplication.java:125)
	at org.opentripplanner.standalone.OTPMain.startOtpWebServer(OTPMain.java:208)
	at org.opentripplanner.standalone.OTPMain.startOTPServer(OTPMain.java:174)
	at org.opentripplanner.standalone.OTPMain.main(OTPMain.java:56)
Caused by: java.lang.IllegalArgumentException: Start of the running period is after end of the running period
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.TripPatternForDate.assertValidRunningPeriod(TripPatternForDate.java:245)
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.TripPatternForDate.<init>(TripPatternForDate.java:97)
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.mappers.TripPatternForDateMapper.map(TripPatternForDateMapper.java:98)
	at org.opentripplanner.routing.algorithm.raptoradapter.transit.mappers.RaptorTransitDataMapper.lambda$mapTripPatterns$0(RaptorTransitDataMapper.java:129)
	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
	at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1715)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:291)
	at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:754)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:387)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1312)
	at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1843)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1808)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:188)

This is a pretty bad bug as the validation of the trip fails to take flex into account. It's a little unusual to have flex trips start fixed and the finish on window but I'm pretty surprised that we have never seen this before.

@westontrillium @lslangley

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions