Merge "Fix flaky AnalytisTest by locking in EventRecord"

This commit is contained in:
Hall Liu
2018-11-09 02:21:56 +00:00
committed by Gerrit Code Review

View File

@@ -180,7 +180,7 @@ public class EventManager {
} }
} }
private final List<Event> mEvents = new LinkedList<>(); private final List<Event> mEvents = Collections.synchronizedList(new LinkedList<>());
private final Loggable mRecordEntry; private final Loggable mRecordEntry;
public EventRecord(Loggable recordEntry) { public EventRecord(Loggable recordEntry) {
@@ -197,7 +197,7 @@ public class EventManager {
} }
public List<Event> getEvents() { public List<Event> getEvents() {
return mEvents; return new LinkedList<>(mEvents);
} }
public List<EventTiming> extractEventTimings() { public List<EventTiming> extractEventTimings() {
@@ -207,21 +207,24 @@ public class EventManager {
LinkedList<EventTiming> result = new LinkedList<>(); LinkedList<EventTiming> result = new LinkedList<>();
Map<String, PendingResponse> pendingResponses = new HashMap<>(); Map<String, PendingResponse> pendingResponses = new HashMap<>();
for (Event event : mEvents) { synchronized (mEvents) {
if (requestResponsePairs.containsKey(event.eventId)) { for (Event event : mEvents) {
// This event expects a response, so add that expected response to the maps if (requestResponsePairs.containsKey(event.eventId)) {
// of pending events. // This event expects a response, so add that expected response to the maps
for (EventManager.TimedEventPair p : requestResponsePairs.get(event.eventId)) { // of pending events.
pendingResponses.put(p.mResponse, new PendingResponse(event.eventId, for (EventManager.TimedEventPair p : requestResponsePairs.get(
event.time, p.mTimeoutMillis, p.mName)); event.eventId)) {
pendingResponses.put(p.mResponse, new PendingResponse(event.eventId,
event.time, p.mTimeoutMillis, p.mName));
}
} }
}
PendingResponse pendingResponse = pendingResponses.remove(event.eventId); PendingResponse pendingResponse = pendingResponses.remove(event.eventId);
if (pendingResponse != null) { if (pendingResponse != null) {
long elapsedTime = event.time - pendingResponse.requestEventTimeMillis; long elapsedTime = event.time - pendingResponse.requestEventTimeMillis;
if (elapsedTime < pendingResponse.timeoutMillis) { if (elapsedTime < pendingResponse.timeoutMillis) {
result.add(new EventTiming(pendingResponse.name, elapsedTime)); result.add(new EventTiming(pendingResponse.name, elapsedTime));
}
} }
} }
} }
@@ -233,7 +236,8 @@ public class EventManager {
pw.print(mRecordEntry.getDescription()); pw.print(mRecordEntry.getDescription());
pw.increaseIndent(); pw.increaseIndent();
for (Event event : mEvents) { // Iterate over copy of events so that this doesn't hold the lock for too long.
for (Event event : getEvents()) {
pw.print(event.timestampString); pw.print(event.timestampString);
pw.print(" - "); pw.print(" - ");
pw.print(event.eventId); pw.print(event.eventId);