openvidu-test-e2e: fix race condition on client event management

dependabot/npm_and_yarn/openvidu-components-angular/multi-f2b383cc78
pabloFuente 2024-12-05 19:21:21 +01:00
parent 40ffd97aca
commit 5e0af77913
1 changed files with 39 additions and 22 deletions

View File

@ -235,12 +235,12 @@ public class OpenViduEventManager {
} }
// Sets any event count to 0 // Sets any event count to 0
public synchronized void clearCurrentEvents(String eventTypeAndCategory) { public void clearCurrentEvents(String eventTypeAndCategory) {
this.eventNumbers.put(eventTypeAndCategory, new AtomicInteger(0)); this.eventNumbers.put(eventTypeAndCategory, new AtomicInteger(0));
this.setCountDown(eventTypeAndCategory, new CountDownLatch(0)); this.setCountDown(eventTypeAndCategory, new CountDownLatch(0));
} }
public synchronized void clearCurrentEvents(int numberOfUser, String eventTypeAndCategory) { public void clearCurrentEvents(int numberOfUser, String eventTypeAndCategory) {
if (this.eventNumbersByUser.containsKey(numberOfUser)) { if (this.eventNumbersByUser.containsKey(numberOfUser)) {
this.eventNumbersByUser.get(numberOfUser).put(eventTypeAndCategory, new AtomicInteger(0)); this.eventNumbersByUser.get(numberOfUser).put(eventTypeAndCategory, new AtomicInteger(0));
this.setCountDown(numberOfUser, eventTypeAndCategory, new CountDownLatch(0)); this.setCountDown(numberOfUser, eventTypeAndCategory, new CountDownLatch(0));
@ -251,6 +251,9 @@ public class OpenViduEventManager {
this.eventNumbers.keySet().forEach(eventTypeAndCategory -> { this.eventNumbers.keySet().forEach(eventTypeAndCategory -> {
this.clearCurrentEvents(eventTypeAndCategory); this.clearCurrentEvents(eventTypeAndCategory);
}); });
this.eventNumbersByUser.entrySet().forEach(entry -> {
this.clearAllCurrentEvents(entry.getKey());
});
} }
public synchronized void clearAllCurrentEvents(int numberOfUser) { public synchronized void clearAllCurrentEvents(int numberOfUser) {
@ -280,29 +283,33 @@ public class OpenViduEventManager {
this.startPolling(); this.startPolling();
} }
public synchronized AtomicInteger getNumEvents(String eventTypeAndCategory) { private AtomicInteger getNumEvents(String eventTypeAndCategory) {
return this.eventNumbers.computeIfAbsent(eventTypeAndCategory, k -> new AtomicInteger(0)); return this.eventNumbers.computeIfAbsent(eventTypeAndCategory, k -> new AtomicInteger(0));
} }
public synchronized AtomicInteger getNumEvents(int numberOfUser, String eventTypeAndCategory) { private AtomicInteger getNumEvents(int numberOfUser, String eventTypeAndCategory) {
this.eventNumbersByUser.putIfAbsent(numberOfUser, new HashMap<>()); this.eventNumbersByUser.putIfAbsent(numberOfUser, new HashMap<>());
return this.eventNumbersByUser.get(numberOfUser).computeIfAbsent(eventTypeAndCategory, return this.eventNumbersByUser.get(numberOfUser).computeIfAbsent(eventTypeAndCategory,
k -> new AtomicInteger(0)); k -> new AtomicInteger(0));
} }
private void setCountDown(String eventTypeAndCategory, CountDownLatch cd) { private void setCountDown(String eventTypeAndCategory, CountDownLatch cd) {
this.eventCountdowns.put(eventTypeAndCategory, cd); executeInNamedLock(eventTypeAndCategory, () -> {
for (int i = 0; i < getNumEvents(eventTypeAndCategory).get(); i++) { for (int i = 0; i < getNumEvents(eventTypeAndCategory).get(); i++) {
cd.countDown(); cd.countDown();
} }
this.eventCountdowns.put(eventTypeAndCategory, cd);
});
} }
private void setCountDown(int numberOfUser, String eventTypeAndCategory, CountDownLatch cd) { private void setCountDown(int numberOfUser, String eventTypeAndCategory, CountDownLatch cd) {
this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>()); executeInNamedLock(numberOfUser + eventTypeAndCategory, () -> {
this.eventCountdownsByUser.get(numberOfUser).put(eventTypeAndCategory, cd); for (int i = 0; i < getNumEvents(numberOfUser, eventTypeAndCategory).get(); i++) {
for (int i = 0; i < getNumEvents(numberOfUser, eventTypeAndCategory).get(); i++) { cd.countDown();
cd.countDown(); }
} this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>());
this.eventCountdownsByUser.get(numberOfUser).put(eventTypeAndCategory, cd);
});
} }
private void emitEvents() { private void emitEvents() {
@ -350,16 +357,20 @@ public class OpenViduEventManager {
this.eventQueue.add(userAndEvent); this.eventQueue.add(userAndEvent);
getNumEvents(eventTypeAndCategory).incrementAndGet(); executeInNamedLock(eventTypeAndCategory, () -> {
if (this.eventCountdowns.get(eventTypeAndCategory) != null) { getNumEvents(eventTypeAndCategory).incrementAndGet();
this.eventCountdowns.get(eventTypeAndCategory).countDown(); if (this.eventCountdowns.get(eventTypeAndCategory) != null) {
} this.eventCountdowns.get(eventTypeAndCategory).countDown();
}
});
getNumEvents(numberOfUser, eventTypeAndCategory).incrementAndGet(); executeInNamedLock(numberOfUser + eventTypeAndCategory, () -> {
this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>()); getNumEvents(numberOfUser, eventTypeAndCategory).incrementAndGet();
if (this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory) != null) { this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>());
this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory).countDown(); if (this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory) != null) {
} this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory).countDown();
}
});
} }
} }
@ -368,4 +379,10 @@ public class OpenViduEventManager {
.executeScript("var e = window.myEvents; window.myEvents = ''; return e;"); .executeScript("var e = window.myEvents; window.myEvents = ''; return e;");
return events; return events;
} }
public void executeInNamedLock(String lockName, Runnable runnable) {
synchronized (lockName.intern()) {
runnable.run();
}
}
} }