https://issues.apache.org/bugzilla/show_bug.cgi?id=46384
Summary: Due to missing synchronization, a member may disappear
permanent.
Product: Tomcat 5
Version: 5.5.27
Platform: All
OS/Version: All
Status: NEW
Severity: major
Priority: P2
Component: Catalina:Cluster
AssignedTo: [email protected]
ReportedBy: [email protected]
Below there is a "pseudo-code-extract" of the McastServiceImpl Recieiver- and
Sender-Thread flow.
Now assume the following situation:
- ServerA,ServerB in a cluster; both had added each other to theire
McastMembership
On ServerA:
t0: The "Sender"-Thread is at position [P0], and found the mm = "ServerB".
So in the moment "ServerB" is not in the McastMembership.map!!
t1: The "Receiver"-Thread receives a packet from "ServerB",
add this to the McastMembership,
calls the SimpleTcpCluster.memberAdded("ServerB")
and blocks on [P1]
t2: The "Sender"-Thread continues,
calls SimpleTcpCluster.memberDisappeared("ServerB").
This leads to the following situation:
- the "ServerB" is in the McastMembership.map (and without timeouts, it wont
disappear)
- there is no Sessionreplication to "ServerB"
That's it
Thread: Cluster-MembershipReceiver
McastServiceImpl.receive
added= sync McastMembership.memberAlive(mm) {
if (mm not in map) then map+=mm;return true;
else (mark mm as new); return false;
}
if (added) {
SimpleTcpCluster.memberAdded(mm)
log.info("Replication member added:" + member);
sync ReplicationTransmitter.add(mm);
}
checkExpire
---[P1]---
sync on McastServiceImpl(expiredMutex) {
mm = sync McastMembership.expire() {
if (mm in map to old) then map-=mm;
return mm;
}
SimpleTcpCluster.memberDisappeared(mm);
log.info("Received member disappeared:" + member);
sync ReplicationTransmitter.remove(mm);
}
Thread: Cluster-MembershipSender
McastServiceImpl.send()
checkExpire
sync on McastServiceImpl(expiredMutex) {
mm = sync McastMembership.expire() {
if (mm in map to old) then map-=mm;
return mm;
}
---[P0]---
SimpleTcpCluster.memberDisappeared(mm);
log.info("Received member disappeared:" + member);
sync ReplicationTransmitter.remove(mm);
}
--
Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]