openvidu-server: avoid race condition when checking new final user

pull/370/head
pabloFuente 2019-10-07 13:11:13 +02:00
parent 9cd389eb61
commit a007f30687
3 changed files with 11 additions and 22 deletions

View File

@ -64,14 +64,14 @@ public class FinalUser {
return connections; return connections;
} }
public void addConnection(Participant participant) { public void addConnectionIfAbsent(Participant participant) {
this.connections.put(participant.getParticipantPublicId(), new ParticipantSummary(this.sessionId, participant)); this.connections.putIfAbsent(participant.getParticipantPublicId(), new ParticipantSummary(this.sessionId, participant));
} }
public void setConnection(CDREventParticipant event) { public void setConnection(CDREventParticipant event) {
ParticipantSummary oldSummary = this.connections.remove(event.getParticipant().getParticipantPublicId()); final String participantPublicId = event.getParticipant().getParticipantPublicId();
this.connections.put(event.getParticipant().getParticipantPublicId(), ParticipantSummary oldSummary = this.connections.remove(participantPublicId);
new ParticipantSummary(event, oldSummary)); this.connections.put(participantPublicId, new ParticipantSummary(event, oldSummary));
} }
public JsonObject toJson() { public JsonObject toJson() {

View File

@ -368,18 +368,11 @@ public abstract class SessionManager {
p.setParticipantPublicId(participantPublicId); p.setParticipantPublicId(participantPublicId);
} }
FinalUser finalUser = this.sessionidFinalUsers.get(sessionId).get(finalUserId); this.sessionidFinalUsers.get(sessionId).computeIfAbsent(finalUserId, k -> {
if (finalUser == null) { log.info("Participant {} of session {} is a final user connecting to this session for the first time",
// First connection for new final user
log.info("Participant {} of session {} belongs to a new final user", p.getParticipantPublicId(),
sessionId);
this.sessionidFinalUsers.get(sessionId).put(finalUserId, new FinalUser(finalUserId, sessionId, p));
} else {
// New connection for previously existing final user
log.info("Participant {} of session {} belongs to a previously existing user",
p.getParticipantPublicId(), sessionId); p.getParticipantPublicId(), sessionId);
finalUser.addConnection(p); return new FinalUser(finalUserId, sessionId, p);
} }).addConnectionIfAbsent(p);
return p; return p;
} else { } else {

View File

@ -33,8 +33,8 @@ public class ParticipantSummary {
private Map<String, CDREventWebrtcConnection> publishers = new ConcurrentHashMap<>(); private Map<String, CDREventWebrtcConnection> publishers = new ConcurrentHashMap<>();
private Map<String, CDREventWebrtcConnection> subscribers = new ConcurrentHashMap<>(); private Map<String, CDREventWebrtcConnection> subscribers = new ConcurrentHashMap<>();
public ParticipantSummary(CDREventParticipant event) { public ParticipantSummary(String sessionId, Participant participant) {
this.eventParticipantEnd = event; this.eventParticipantEnd = new CDREventParticipant(sessionId, participant);
} }
public ParticipantSummary(CDREventParticipant event, ParticipantSummary oldSummary) { public ParticipantSummary(CDREventParticipant event, ParticipantSummary oldSummary) {
@ -43,10 +43,6 @@ public class ParticipantSummary {
this.subscribers = oldSummary.subscribers; this.subscribers = oldSummary.subscribers;
} }
public ParticipantSummary(String sessionId, Participant participant) {
this.eventParticipantEnd = new CDREventParticipant(sessionId, participant);
}
public void addPublisherClosed(String streamId, CDREventWebrtcConnection event) { public void addPublisherClosed(String streamId, CDREventWebrtcConnection event) {
this.publishers.put(streamId, event); this.publishers.put(streamId, event);
} }