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;
}
public void addConnection(Participant participant) {
this.connections.put(participant.getParticipantPublicId(), new ParticipantSummary(this.sessionId, participant));
public void addConnectionIfAbsent(Participant participant) {
this.connections.putIfAbsent(participant.getParticipantPublicId(), new ParticipantSummary(this.sessionId, participant));
}
public void setConnection(CDREventParticipant event) {
ParticipantSummary oldSummary = this.connections.remove(event.getParticipant().getParticipantPublicId());
this.connections.put(event.getParticipant().getParticipantPublicId(),
new ParticipantSummary(event, oldSummary));
final String participantPublicId = event.getParticipant().getParticipantPublicId();
ParticipantSummary oldSummary = this.connections.remove(participantPublicId);
this.connections.put(participantPublicId, new ParticipantSummary(event, oldSummary));
}
public JsonObject toJson() {

View File

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

View File

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