Skip to content

Commit 6b0ca8d

Browse files
committed
Split continuity check and update, to account for problems during update
1 parent aab65ea commit 6b0ca8d

File tree

3 files changed

+50
-68
lines changed

3 files changed

+50
-68
lines changed

src/main/java/org/entur/lamassu/leader/entityupdater/EntityCachesUpdater.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -92,22 +92,24 @@ public void updateEntityCaches(
9292
if (canUpdateVehicles(delivery, feedProvider)) {
9393
var useBase = updateContinuityTracker.hasVehicleUpdateContinuity(
9494
feedProvider.getSystemId(),
95-
oldDelivery,
96-
delivery
95+
oldDelivery
9796
);
9897
GBFSFileDelta<GBFSVehicle> vehicleStatusDelta =
9998
vehicleStatusDeltaCalculator.calculateDelta(
10099
useBase ? oldDelivery.vehicleStatus() : null,
101100
delivery.vehicleStatus()
102101
);
103102
vehiclesUpdater.update(feedProvider, vehicleStatusDelta);
103+
updateContinuityTracker.updateVehicleUpdateContinuity(
104+
feedProvider.getSystemId(),
105+
delivery
106+
);
104107
}
105108

106109
if (canUpdateStations(delivery, feedProvider)) {
107110
var useBase = updateContinuityTracker.hasStationUpdateContinuity(
108111
feedProvider.getSystemId(),
109-
oldDelivery,
110-
delivery
112+
oldDelivery
111113
);
112114
GBFSFileDelta<GBFSStation> stationStatusDelta =
113115
stationStatusDeltaCalculator.calculateDelta(
@@ -119,6 +121,10 @@ public void updateEntityCaches(
119121
stationStatusDelta,
120122
delivery.stationInformation()
121123
);
124+
updateContinuityTracker.updateStationUpdateContinuity(
125+
feedProvider.getSystemId(),
126+
delivery
127+
);
122128
}
123129

124130
if (canUpdateGeofencingZones(delivery, feedProvider)) {

src/main/java/org/entur/lamassu/leader/entityupdater/GbfsUpdateContinuityTracker.java

+18-18
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,8 @@ public class GbfsUpdateContinuityTracker {
1919
* Check if there is continuity in vehicle status updates by comparing timestamps.
2020
* Returns false if updates have been missed, indicating we need to start delta calculations from scratch.
2121
*/
22-
public boolean hasVehicleUpdateContinuity(
23-
String systemId,
24-
GbfsV3Delivery oldDelivery,
25-
GbfsV3Delivery nextDelivery
26-
) {
27-
var previousBase = vehicleStatusBases.put(
28-
systemId,
29-
nextDelivery.vehicleStatus().getLastUpdated().getTime()
30-
);
22+
public boolean hasVehicleUpdateContinuity(String systemId, GbfsV3Delivery oldDelivery) {
23+
var previousBase = vehicleStatusBases.get(systemId);
3124

3225
if (oldDelivery.vehicleStatus() == null || previousBase == null) {
3326
return false;
@@ -36,24 +29,31 @@ public boolean hasVehicleUpdateContinuity(
3629
return previousBase.equals(oldDelivery.vehicleStatus().getLastUpdated().getTime());
3730
}
3831

32+
public void updateVehicleUpdateContinuity(String systemId, GbfsV3Delivery delivery) {
33+
vehicleStatusBases.put(systemId, delivery.vehicleStatus().getLastUpdated().getTime());
34+
}
35+
3936
/**
4037
* Check if there is continuity in station status updates by comparing timestamps.
4138
* Returns false if updates have been missed, indicating we need to start delta calculations from scratch.
4239
*/
43-
public boolean hasStationUpdateContinuity(
44-
String systemId,
45-
GbfsV3Delivery oldDelivery,
46-
GbfsV3Delivery nextDelivery
47-
) {
48-
var previousBase = stationStatusBases.put(
49-
systemId,
50-
nextDelivery.stationStatus().getLastUpdated().getTime()
51-
);
40+
public boolean hasStationUpdateContinuity(String systemId, GbfsV3Delivery oldDelivery) {
41+
var previousBase = stationStatusBases.get(systemId);
5242

5343
if (oldDelivery.stationStatus() == null || previousBase == null) {
5444
return false;
5545
}
5646

5747
return previousBase.equals(oldDelivery.stationStatus().getLastUpdated().getTime());
5848
}
49+
50+
public void updateStationUpdateContinuity(
51+
String systemId,
52+
GbfsV3Delivery nextDelivery
53+
) {
54+
stationStatusBases.put(
55+
systemId,
56+
nextDelivery.stationStatus().getLastUpdated().getTime()
57+
);
58+
}
5959
}

src/test/java/org/entur/lamassu/leader/entityupdater/GbfsUpdateContinuityTrackerTest.java

+22-46
Original file line numberDiff line numberDiff line change
@@ -22,96 +22,72 @@ void setUp() {
2222

2323
@Test
2424
void hasVehicleUpdateContinuity_shouldReturnFalse_whenOldDeliveryIsNull() {
25-
var nextDelivery = createDeliveryWithVehicleStatus(1000L);
2625
var oldDelivery = createDeliveryWithVehicleStatus(null);
27-
28-
assertFalse(tracker.hasVehicleUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery));
26+
assertFalse(tracker.hasVehicleUpdateContinuity(SYSTEM_ID, oldDelivery));
2927
}
3028

3129
@Test
3230
void hasVehicleUpdateContinuity_shouldReturnFalse_whenFirstUpdate() {
33-
var nextDelivery = createDeliveryWithVehicleStatus(1000L);
3431
var oldDelivery = createDeliveryWithVehicleStatus(500L);
35-
36-
assertFalse(tracker.hasVehicleUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery));
32+
assertFalse(tracker.hasVehicleUpdateContinuity(SYSTEM_ID, oldDelivery));
3733
}
3834

3935
@Test
4036
void hasVehicleUpdateContinuity_shouldReturnTrue_whenTimestampsMatch() {
41-
var nextDelivery = createDeliveryWithVehicleStatus(1000L);
42-
var oldDelivery = createDeliveryWithVehicleStatus(500L);
37+
var delivery = createDeliveryWithVehicleStatus(1000L);
4338

4439
// First update establishes the base
45-
tracker.hasVehicleUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery);
40+
tracker.updateVehicleUpdateContinuity(SYSTEM_ID, delivery);
4641

47-
// Second update with matching timestamps
48-
var nextDelivery2 = createDeliveryWithVehicleStatus(1500L);
49-
assertTrue(
50-
tracker.hasVehicleUpdateContinuity(SYSTEM_ID, nextDelivery, nextDelivery2)
51-
);
42+
// Check continuity with matching timestamp
43+
assertTrue(tracker.hasVehicleUpdateContinuity(SYSTEM_ID, delivery));
5244
}
5345

5446
@Test
5547
void hasVehicleUpdateContinuity_shouldReturnFalse_whenTimestampsDontMatch() {
56-
var nextDelivery = createDeliveryWithVehicleStatus(1000L);
57-
var oldDelivery = createDeliveryWithVehicleStatus(500L);
48+
var delivery = createDeliveryWithVehicleStatus(1000L);
5849

5950
// First update establishes the base
60-
tracker.hasVehicleUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery);
51+
tracker.updateVehicleUpdateContinuity(SYSTEM_ID, delivery);
6152

62-
// Second update with non-matching timestamps (simulating missed update)
63-
var nextDelivery2 = createDeliveryWithVehicleStatus(1500L);
64-
var modifiedOldDelivery = createDeliveryWithVehicleStatus(800L); // Different from stored base
65-
assertFalse(
66-
tracker.hasVehicleUpdateContinuity(SYSTEM_ID, modifiedOldDelivery, nextDelivery2)
67-
);
53+
// Check with non-matching timestamps (simulating missed update)
54+
var modifiedDelivery = createDeliveryWithVehicleStatus(800L);
55+
assertFalse(tracker.hasVehicleUpdateContinuity(SYSTEM_ID, modifiedDelivery));
6856
}
6957

7058
@Test
7159
void hasStationUpdateContinuity_shouldReturnFalse_whenOldDeliveryIsNull() {
72-
var nextDelivery = createDeliveryWithStationStatus(1000L);
7360
var oldDelivery = createDeliveryWithStationStatus(null);
74-
75-
assertFalse(tracker.hasStationUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery));
61+
assertFalse(tracker.hasStationUpdateContinuity(SYSTEM_ID, oldDelivery));
7662
}
7763

7864
@Test
7965
void hasStationUpdateContinuity_shouldReturnFalse_whenFirstUpdate() {
80-
var nextDelivery = createDeliveryWithStationStatus(1000L);
8166
var oldDelivery = createDeliveryWithStationStatus(500L);
82-
83-
assertFalse(tracker.hasStationUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery));
67+
assertFalse(tracker.hasStationUpdateContinuity(SYSTEM_ID, oldDelivery));
8468
}
8569

8670
@Test
8771
void hasStationUpdateContinuity_shouldReturnTrue_whenTimestampsMatch() {
88-
var nextDelivery = createDeliveryWithStationStatus(1000L);
89-
var oldDelivery = createDeliveryWithStationStatus(500L);
72+
var delivery = createDeliveryWithStationStatus(1000L);
9073

9174
// First update establishes the base
92-
tracker.hasStationUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery);
75+
tracker.updateStationUpdateContinuity(SYSTEM_ID, delivery);
9376

94-
// Second update with matching timestamps
95-
var nextDelivery2 = createDeliveryWithStationStatus(1500L);
96-
assertTrue(
97-
tracker.hasStationUpdateContinuity(SYSTEM_ID, nextDelivery, nextDelivery2)
98-
);
77+
// Check continuity with matching timestamp
78+
assertTrue(tracker.hasStationUpdateContinuity(SYSTEM_ID, delivery));
9979
}
10080

10181
@Test
10282
void hasStationUpdateContinuity_shouldReturnFalse_whenTimestampsDontMatch() {
103-
var nextDelivery = createDeliveryWithStationStatus(1000L);
104-
var oldDelivery = createDeliveryWithStationStatus(500L);
83+
var delivery = createDeliveryWithStationStatus(1000L);
10584

10685
// First update establishes the base
107-
tracker.hasStationUpdateContinuity(SYSTEM_ID, oldDelivery, nextDelivery);
86+
tracker.updateStationUpdateContinuity(SYSTEM_ID, delivery);
10887

109-
// Second update with non-matching timestamps (simulating missed update)
110-
var nextDelivery2 = createDeliveryWithStationStatus(1500L);
111-
var modifiedOldDelivery = createDeliveryWithStationStatus(800L); // Different from stored base
112-
assertFalse(
113-
tracker.hasStationUpdateContinuity(SYSTEM_ID, modifiedOldDelivery, nextDelivery2)
114-
);
88+
// Check with non-matching timestamps (simulating missed update)
89+
var modifiedDelivery = createDeliveryWithStationStatus(800L);
90+
assertFalse(tracker.hasStationUpdateContinuity(SYSTEM_ID, modifiedDelivery));
11591
}
11692

11793
private GbfsV3Delivery createDeliveryWithVehicleStatus(Long timestamp) {

0 commit comments

Comments
 (0)