Skip to content

Commit 02189be

Browse files
committed
fix(GTFS+): fix performance issues with GTFS+ validation
Opt for storing a file-backed MapDB database for reading GTFS entities to validate GTFS+. Otherwise, we're left reloading this file into memory each time the validate method is called which is bad news for large feeds.
1 parent 058da02 commit 02189be

File tree

3 files changed

+13
-5
lines changed

3 files changed

+13
-5
lines changed

src/main/java/com/conveyal/datatools/manager/controllers/api/GtfsPlusController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ private static GtfsPlusValidation getGtfsPlusValidation(Request req, Response re
255255
GtfsPlusValidation gtfsPlusValidation = null;
256256
try {
257257
gtfsPlusValidation = GtfsPlusValidation.validate(feedVersionId);
258-
} catch(IOException e) {
258+
} catch(Exception e) {
259259
logMessageAndHalt(req, 500, "Could not read GTFS+ zip file", e);
260260
}
261261
return gtfsPlusValidation;

src/main/java/com/conveyal/datatools/manager/gtfsplus/GtfsPlusValidation.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import java.io.Serializable;
2020
import java.util.Arrays;
2121
import java.util.Collection;
22-
import java.util.Date;
2322
import java.util.Enumeration;
2423
import java.util.LinkedList;
2524
import java.util.List;
@@ -50,7 +49,7 @@ private GtfsPlusValidation (String feedVersionId) {
5049
* FIXME: For now this uses the MapDB-backed GTFSFeed class. Which actually suggests that this might
5150
* should be contained within a MonitorableJob.
5251
*/
53-
public static GtfsPlusValidation validate(String feedVersionId) throws IOException {
52+
public static GtfsPlusValidation validate(String feedVersionId) throws Exception {
5453
GtfsPlusValidation validation = new GtfsPlusValidation(feedVersionId);
5554
if (!DataManager.isModuleEnabled("gtfsplus")) {
5655
throw new IllegalStateException("GTFS+ module must be enabled in server.yml to run GTFS+ validation.");
@@ -60,7 +59,15 @@ public static GtfsPlusValidation validate(String feedVersionId) throws IOExcepti
6059
FeedVersion feedVersion = Persistence.feedVersions.getById(feedVersionId);
6160
// Load the main GTFS file.
6261
// FIXME: Swap MapDB-backed GTFSFeed for use of SQL data?
63-
GTFSFeed gtfsFeed = GTFSFeed.fromFile(feedVersion.retrieveGtfsFile().getAbsolutePath());
62+
String gtfsFeedDbFilePath = gtfsPlusStore.getPathToFeed(feedVersionId + ".db");
63+
// This check for existence must occur before GTFSFeed is instantiated (and the file must be discarded
64+
// immediately).
65+
boolean dbExists = new File(gtfsFeedDbFilePath).isFile();
66+
GTFSFeed gtfsFeed = new GTFSFeed(gtfsFeedDbFilePath);
67+
if (!dbExists) {
68+
LOG.info("Loading GTFS file into new MapDB file (.db).");
69+
gtfsFeed.loadFromFile(new ZipFile(feedVersion.retrieveGtfsFile().getAbsolutePath()));
70+
}
6471
// check for saved GTFS+ data
6572
File file = gtfsPlusStore.getFeed(feedVersionId);
6673
if (file == null) {
@@ -85,6 +92,7 @@ public static GtfsPlusValidation validate(String feedVersionId) throws IOExcepti
8592
}
8693
}
8794
}
95+
gtfsFeed.close();
8896
LOG.info("GTFS+ tables found: {}/{}", gtfsPlusTableCount, DataManager.gtfsPlusConfig.size());
8997
return validation;
9098
}

src/test/java/com/conveyal/datatools/manager/gtfsplus/GtfsPlusValidationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public static void setUp() {
4343
}
4444

4545
@Test
46-
public void canValidateCleanGtfsPlus() throws IOException {
46+
public void canValidateCleanGtfsPlus() throws Exception {
4747
LOG.info("Validation BART GTFS+");
4848
GtfsPlusValidation validation = GtfsPlusValidation.validate(bartVersion1.id);
4949
// Expect issues to be zero.

0 commit comments

Comments
 (0)