Skip to content
This repository was archived by the owner on Oct 6, 2023. It is now read-only.

Commit 2c44a85

Browse files
add rmiUrl to debug message
1 parent 8276bf1 commit 2c44a85

File tree

4 files changed

+100
-196
lines changed

4 files changed

+100
-196
lines changed

.gitignore

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
/.classpath
2-
/.project
3-
/target
4-
/.settings
5-
/*.iml
1+
.classpath
2+
.project
3+
target
4+
.settings
5+
*.iml
6+
7+
.idea

ehcache-core/src/main/java/net/sf/ehcache/distribution/ManualRMICacheManagerPeerProvider.java

Lines changed: 29 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919

2020
import net.sf.ehcache.CacheException;
2121
import net.sf.ehcache.Ehcache;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
2224

2325
import java.util.ArrayList;
24-
import java.util.Date;
25-
import java.util.Iterator;
26+
import java.util.Collections;
27+
import java.util.HashSet;
2628
import java.util.List;
27-
28-
import org.slf4j.Logger;
29-
import org.slf4j.LoggerFactory;
29+
import java.util.Set;
3030

3131
/**
3232
* A provider of Peer RMI addresses based off manual configuration.
@@ -38,10 +38,15 @@
3838
* @author Greg Luck
3939
* @version $Id$
4040
*/
41-
public final class ManualRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider {
41+
public class ManualRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider {
4242

4343
private static final Logger LOG = LoggerFactory.getLogger(ManualRMICacheManagerPeerProvider.class.getName());
4444

45+
/**
46+
* Contains a RMI URLs of the form: "//" + hostName + ":" + port + "/" + cacheName;
47+
*/
48+
protected final Set<String> peerUrls = Collections.synchronizedSet(new HashSet<>());
49+
4550
/**
4651
* Empty constructor.
4752
*/
@@ -52,7 +57,7 @@ public ManualRMICacheManagerPeerProvider() {
5257
/**
5358
* {@inheritDoc}
5459
*/
55-
public final void init() {
60+
public void init() {
5661
//nothing to do here
5762
}
5863

@@ -65,68 +70,37 @@ public long getTimeForClusterToForm() {
6570
return 0;
6671
}
6772

68-
/**
69-
* Register a new peer.
70-
*
71-
* @param rmiUrl
72-
*/
73-
public final synchronized void registerPeer(String rmiUrl) {
74-
peerUrls.put(rmiUrl, new Date());
73+
@Override
74+
public synchronized void registerPeer(String rmiUrl) {
75+
peerUrls.add(rmiUrl);
7576
}
7677

7778

78-
/**
79-
* @return a list of {@link CachePeer} peers, excluding the local peer.
80-
*/
81-
public final synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException {
82-
List remoteCachePeers = new ArrayList();
83-
List staleList = new ArrayList();
84-
for (Iterator iterator = peerUrls.keySet().iterator(); iterator.hasNext();) {
85-
String rmiUrl = (String) iterator.next();
79+
@Override
80+
public synchronized List<CachePeer> listRemoteCachePeers(Ehcache cache) throws CacheException {
81+
List<CachePeer> remoteCachePeers = new ArrayList<>();
82+
for (String rmiUrl : peerUrls) {
8683
String rmiUrlCacheName = extractCacheName(rmiUrl);
8784

8885
if (!rmiUrlCacheName.equals(cache.getName())) {
8986
continue;
9087
}
91-
Date date = (Date) peerUrls.get(rmiUrl);
92-
if (!stale(date)) {
93-
CachePeer cachePeer = null;
94-
try {
95-
cachePeer = lookupRemoteCachePeer(rmiUrl);
96-
remoteCachePeers.add(cachePeer);
97-
} catch (Exception e) {
98-
if (LOG.isDebugEnabled()) {
99-
LOG.debug("Looking up rmiUrl " + rmiUrl + " through exception " + e.getMessage()
100-
+ ". This may be normal if a node has gone offline. Or it may indicate network connectivity"
101-
+ " difficulties", e);
102-
}
88+
89+
try {
90+
remoteCachePeers.add(lookupRemoteCachePeer(rmiUrl));
91+
} catch (Exception e) {
92+
if (LOG.isDebugEnabled()) {
93+
LOG.debug("Looking up rmiUrl {} through exception. This may be normal if a node has gone offline. Or it may indicate network connectivity difficulties",
94+
rmiUrl, e);
10395
}
104-
} else {
105-
LOG.debug("rmiUrl {} should never be stale for a manually configured cluster.", rmiUrl);
106-
staleList.add(rmiUrl);
10796
}
108-
10997
}
11098

111-
//Remove any stale remote peers. Must be done here to avoid concurrent modification exception.
112-
for (int i = 0; i < staleList.size(); i++) {
113-
String rmiUrl = (String) staleList.get(i);
114-
peerUrls.remove(rmiUrl);
115-
}
11699
return remoteCachePeers;
117100
}
118101

119-
120-
/**
121-
* Whether the entry should be considered stale.
122-
* <p>
123-
* Manual RMICacheManagerProviders use a static list of urls and are therefore never stale.
124-
*
125-
* @param date the date the entry was created
126-
* @return true if stale
127-
*/
128-
protected final boolean stale(Date date) {
129-
return false;
102+
@Override
103+
public void unregisterPeer(String rmiUrl) {
104+
peerUrls.remove(rmiUrl);
130105
}
131-
132106
}

ehcache-core/src/main/java/net/sf/ehcache/distribution/MulticastRMICacheManagerPeerProvider.java

Lines changed: 52 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@
1919
import net.sf.ehcache.CacheException;
2020
import net.sf.ehcache.CacheManager;
2121
import net.sf.ehcache.Ehcache;
22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
2224

2325
import java.io.IOException;
2426
import java.net.InetAddress;
2527
import java.rmi.NotBoundException;
2628
import java.util.ArrayList;
29+
import java.util.Collections;
2730
import java.util.Date;
28-
import java.util.Iterator;
31+
import java.util.HashMap;
2932
import java.util.List;
30-
31-
import org.slf4j.Logger;
32-
import org.slf4j.LoggerFactory;
33+
import java.util.Map;
3334

3435
/**
3536
* A peer provider which discovers peers using Multicast.
@@ -55,7 +56,7 @@
5556
* @author Greg Luck
5657
* @version $Id$
5758
*/
58-
public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider {
59+
public class MulticastRMICacheManagerPeerProvider extends RMICacheManagerPeerProvider implements CacheManagerPeerProvider {
5960

6061
/**
6162
* One tenth of a second, in ms
@@ -64,6 +65,10 @@ public final class MulticastRMICacheManagerPeerProvider extends RMICacheManagerP
6465

6566
private static final Logger LOG = LoggerFactory.getLogger(MulticastRMICacheManagerPeerProvider.class.getName());
6667

68+
/**
69+
* Contains a RMI URLs of the form: "//" + hostName + ":" + port + "/" + cacheName as key
70+
*/
71+
protected final Map<String, CachePeerEntry> peerUrls = Collections.synchronizedMap(new HashMap<>());
6772

6873
private final MulticastKeepaliveHeartbeatReceiver heartBeatReceiver;
6974
private final MulticastKeepaliveHeartbeatSender heartBeatSender;
@@ -79,18 +84,16 @@ public MulticastRMICacheManagerPeerProvider(CacheManager cacheManager, InetAddre
7984
Integer groupMulticastPort, Integer timeToLive, InetAddress hostAddress) {
8085
super(cacheManager);
8186

82-
83-
8487
heartBeatReceiver = new MulticastKeepaliveHeartbeatReceiver(this, groupMulticastAddress,
8588
groupMulticastPort, hostAddress);
8689
heartBeatSender = new MulticastKeepaliveHeartbeatSender(cacheManager, groupMulticastAddress,
87-
groupMulticastPort, timeToLive, hostAddress);
90+
groupMulticastPort, timeToLive, hostAddress);
8891
}
8992

9093
/**
9194
* {@inheritDoc}
9295
*/
93-
public final void init() throws CacheException {
96+
public void init() throws CacheException {
9497
try {
9598
heartBeatReceiver.init();
9699
heartBeatSender.init();
@@ -105,11 +108,11 @@ public final void init() throws CacheException {
105108
* <p>
106109
* This method is thread-safe. It relies on peerUrls being a synchronizedMap
107110
*
108-
* @param rmiUrl
111+
* @param rmiUrl the URL to register
109112
*/
110-
public final void registerPeer(String rmiUrl) {
113+
public void registerPeer(String rmiUrl) {
111114
try {
112-
CachePeerEntry cachePeerEntry = (CachePeerEntry) peerUrls.get(rmiUrl);
115+
CachePeerEntry cachePeerEntry = peerUrls.get(rmiUrl);
113116
if (cachePeerEntry == null || stale(cachePeerEntry.date)) {
114117
//can take seconds if there is a problem
115118
CachePeer cachePeer = lookupRemoteCachePeer(rmiUrl);
@@ -119,18 +122,12 @@ public final void registerPeer(String rmiUrl) {
119122
} else {
120123
cachePeerEntry.date = new Date();
121124
}
122-
} catch (IOException e) {
125+
} catch (IOException | NotBoundException e) {
123126
if (LOG.isDebugEnabled()) {
124127
LOG.debug("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: "
125128
+ e.getMessage());
126129
}
127130
unregisterPeer(rmiUrl);
128-
} catch (NotBoundException e) {
129-
peerUrls.remove(rmiUrl);
130-
if (LOG.isDebugEnabled()) {
131-
LOG.debug("Unable to lookup remote cache peer for " + rmiUrl + ". Removing from peer list. Cause was: "
132-
+ e.getMessage());
133-
}
134131
} catch (Throwable t) {
135132
LOG.error("Unable to lookup remote cache peer for " + rmiUrl
136133
+ ". Cause was not due to an IOException or NotBoundException which will occur in normal operation:" +
@@ -141,48 +138,42 @@ public final void registerPeer(String rmiUrl) {
141138
/**
142139
* @return a list of {@link CachePeer} peers, excluding the local peer.
143140
*/
144-
public final synchronized List listRemoteCachePeers(Ehcache cache) throws CacheException {
145-
List remoteCachePeers = new ArrayList();
146-
List staleList = new ArrayList();
147-
synchronized (peerUrls) {
148-
for (Iterator iterator = peerUrls.keySet().iterator(); iterator.hasNext();) {
149-
String rmiUrl = (String) iterator.next();
150-
String rmiUrlCacheName = extractCacheName(rmiUrl);
151-
try {
152-
if (!rmiUrlCacheName.equals(cache.getName())) {
153-
continue;
154-
}
155-
CachePeerEntry cachePeerEntry = (CachePeerEntry) peerUrls.get(rmiUrl);
156-
Date date = cachePeerEntry.date;
157-
if (!stale(date)) {
158-
CachePeer cachePeer = cachePeerEntry.cachePeer;
159-
remoteCachePeers.add(cachePeer);
160-
} else {
161-
162-
LOG.debug("rmiUrl is stale. Either the remote peer is shutdown or the " +
141+
public synchronized List<CachePeer> listRemoteCachePeers(Ehcache cache) throws CacheException {
142+
List<CachePeer> remoteCachePeers = new ArrayList<>();
143+
List<String> staleList = new ArrayList<>();
144+
145+
for (Map.Entry<String, CachePeerEntry> entry : peerUrls.entrySet()) {
146+
String rmiUrl = entry.getKey();
147+
String rmiUrlCacheName = extractCacheName(rmiUrl);
148+
if (!rmiUrlCacheName.equals(cache.getName())) {
149+
continue;
150+
}
151+
try {
152+
CachePeerEntry cachePeerEntry = entry.getValue();
153+
if (!stale(cachePeerEntry.date)) {
154+
remoteCachePeers.add(cachePeerEntry.cachePeer);
155+
} else {
156+
LOG.debug("rmiUrl '{}' is stale. Either the remote peer is shutdown or the " +
163157
"network connectivity has been interrupted. Will be removed from list of remote cache peers",
164-
rmiUrl);
165-
staleList.add(rmiUrl);
166-
}
167-
} catch (Exception exception) {
168-
LOG.error(exception.getMessage(), exception);
169-
throw new CacheException("Unable to list remote cache peers. Error was " + exception.getMessage());
158+
rmiUrl);
159+
staleList.add(rmiUrl);
170160
}
171-
}
172-
//Must remove entries after we have finished iterating over them
173-
for (int i = 0; i < staleList.size(); i++) {
174-
String rmiUrl = (String) staleList.get(i);
175-
peerUrls.remove(rmiUrl);
161+
} catch (Exception exception) {
162+
throw new CacheException("Unable to list remote cache peers.", exception);
176163
}
177164
}
165+
166+
// Must remove entries after we have finished iterating over them
167+
staleList.forEach(peerUrls::remove);
168+
178169
return remoteCachePeers;
179170
}
180171

181172

182173
/**
183174
* Shutdown the heartbeat
184175
*/
185-
public final void dispose() {
176+
public void dispose() {
186177
heartBeatSender.dispose();
187178
heartBeatReceiver.dispose();
188179
}
@@ -211,51 +202,42 @@ protected long getStaleTime() {
211202
* @param date the date the entry was created
212203
* @return true if stale
213204
*/
214-
protected final boolean stale(Date date) {
205+
protected boolean stale(Date date) {
215206
long now = System.currentTimeMillis();
216207
return date.getTime() < (now - getStaleTime());
217208
}
218209

210+
public void unregisterPeer(String rmiUrl) {
211+
peerUrls.remove(rmiUrl);
212+
}
219213

220214
/**
221215
* Entry containing a looked up CachePeer and date
222216
*/
223-
protected static final class CachePeerEntry {
217+
private static class CachePeerEntry {
224218

225219
private final CachePeer cachePeer;
220+
221+
/**
222+
* last access date
223+
*/
226224
private Date date;
227225

228226
/**
229-
* Constructor
230227
*
231228
* @param cachePeer the cache peer part of this entry
232229
* @param date the date part of this entry
233230
*/
234-
public CachePeerEntry(CachePeer cachePeer, Date date) {
231+
private CachePeerEntry(CachePeer cachePeer, Date date) {
235232
this.cachePeer = cachePeer;
236233
this.date = date;
237234
}
238-
239-
/**
240-
* @return the cache peer part of this entry
241-
*/
242-
public final CachePeer getCachePeer() {
243-
return cachePeer;
244-
}
245-
246-
247-
/**
248-
* @return the date part of this entry
249-
*/
250-
public final Date getDate() {
251-
return date;
252-
}
253-
254235
}
255236

256237
/**
257238
* @return the MulticastKeepaliveHeartbeatReceiver
258239
*/
240+
@SuppressWarnings("unused")
259241
public MulticastKeepaliveHeartbeatReceiver getHeartBeatReceiver() {
260242
return heartBeatReceiver;
261243
}

0 commit comments

Comments
 (0)