mirror of https://github.com/OpenVidu/openvidu.git
openvidu-test-e2e: fix race condition on client event management
parent
40ffd97aca
commit
5e0af77913
|
@ -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);
|
||||||
|
|
||||||
|
executeInNamedLock(eventTypeAndCategory, () -> {
|
||||||
getNumEvents(eventTypeAndCategory).incrementAndGet();
|
getNumEvents(eventTypeAndCategory).incrementAndGet();
|
||||||
if (this.eventCountdowns.get(eventTypeAndCategory) != null) {
|
if (this.eventCountdowns.get(eventTypeAndCategory) != null) {
|
||||||
this.eventCountdowns.get(eventTypeAndCategory).countDown();
|
this.eventCountdowns.get(eventTypeAndCategory).countDown();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
executeInNamedLock(numberOfUser + eventTypeAndCategory, () -> {
|
||||||
getNumEvents(numberOfUser, eventTypeAndCategory).incrementAndGet();
|
getNumEvents(numberOfUser, eventTypeAndCategory).incrementAndGet();
|
||||||
this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>());
|
this.eventCountdownsByUser.putIfAbsent(numberOfUser, new HashMap<>());
|
||||||
if (this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory) != null) {
|
if (this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory) != null) {
|
||||||
this.eventCountdownsByUser.get(numberOfUser).get(eventTypeAndCategory).countDown();
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue