mirror of https://github.com/OpenVidu/openvidu.git
openvidu-server: avoid race condition when checking new final user
parent
9cd389eb61
commit
a007f30687
|
@ -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() {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue