You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2013/01/18 17:19:51 UTC
[1/3] git commit: Remove endpoints from system.peers correctly. Patch
by brandonwilliams reviewed by slebresne for CASSANDRA-5167
Remove endpoints from system.peers correctly.
Patch by brandonwilliams reviewed by slebresne for CASSANDRA-5167
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e6b6eaa5
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e6b6eaa5
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e6b6eaa5
Branch: refs/heads/cassandra-1.2
Commit: e6b6eaa583e8fc15f03c3e27664bf7fc06b3af0a
Parents: 056f38c
Author: Brandon Williams <br...@apache.org>
Authored: Fri Jan 18 10:19:00 2013 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Fri Jan 18 10:19:00 2013 -0600
----------------------------------------------------------------------
src/java/org/apache/cassandra/db/SystemTable.java | 18 +++---------
.../apache/cassandra/service/StorageService.java | 22 +++++++++------
.../org/apache/cassandra/db/SystemTableTest.java | 2 +-
3 files changed, 19 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e6b6eaa5/src/java/org/apache/cassandra/db/SystemTable.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/SystemTable.java b/src/java/org/apache/cassandra/db/SystemTable.java
index 84d6e78..8d4bef2 100644
--- a/src/java/org/apache/cassandra/db/SystemTable.java
+++ b/src/java/org/apache/cassandra/db/SystemTable.java
@@ -249,7 +249,7 @@ public class SystemTable
{
if (ep.equals(FBUtilities.getBroadcastAddress()))
{
- removeTokens(tokens);
+ removeEndpoint(ep);
return;
}
@@ -301,18 +301,10 @@ public class SystemTable
/**
* Remove stored tokens being used by another node
*/
- public static synchronized void removeTokens(Collection<Token> tokens)
+ public static synchronized void removeEndpoint(InetAddress ep)
{
- Set<Token> tokenSet = new HashSet<Token>(tokens);
- for (Map.Entry<InetAddress, Collection<Token>> entry : loadTokens().asMap().entrySet())
- {
- Set<Token> toRemove = Sets.intersection(tokenSet, ((Set<Token>)entry.getValue())).immutableCopy();
- if (toRemove.isEmpty())
- continue;
-
- String req = "UPDATE system.%s SET tokens = tokens - %s WHERE peer = '%s'";
- processInternal(String.format(req, PEERS_CF, tokensAsSet(toRemove), entry.getKey().getHostAddress()));
- }
+ String req = "DELETE FROM system.%s WHERE peer = '%s'";
+ processInternal(String.format(req, PEERS_CF, ep.getHostAddress()));
forceBlockingFlush(PEERS_CF);
}
@@ -321,7 +313,7 @@ public class SystemTable
*/
public static synchronized void updateTokens(Collection<Token> tokens)
{
- assert !tokens.isEmpty() : "removeTokens should be used instead";
+ assert !tokens.isEmpty() : "removeEndpoint should be used instead";
String req = "INSERT INTO system.%s (key, tokens) VALUES ('%s', %s)";
processInternal(String.format(req, LOCAL_CF, LOCAL_KEY, tokensAsSet(tokens)));
forceBlockingFlush(LOCAL_CF);
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e6b6eaa5/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java
index e57cfe4..4c0a9ce 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -443,7 +443,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
if (ep.equals(FBUtilities.getBroadcastAddress()))
{
// entry has been mistakenly added, delete it
- SystemTable.removeTokens(loadedTokens.get(ep));
+ SystemTable.removeEndpoint(ep);
}
else
{
@@ -1387,7 +1387,7 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
tokenMetadata.updateNormalTokens(tokensToUpdateInMetadata, endpoint);
for (InetAddress ep : endpointsToRemove)
- Gossiper.instance.removeEndpoint(ep);
+ removeEndpoint(ep);
if (!tokensToUpdateInSystemTable.isEmpty())
SystemTable.updateTokens(endpoint, tokensToUpdateInSystemTable);
if (!localTokensToRemove.isEmpty())
@@ -1549,13 +1549,14 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
}
}
else // now that the gossiper has told us about this nonexistent member, notify the gossiper to remove it
- Gossiper.instance.removeEndpoint(endpoint);
+ removeEndpoint(endpoint);
}
private void excise(Collection<Token> tokens, InetAddress endpoint)
{
+ logger.info("Removing tokens " + tokens + " for " + endpoint);
HintedHandOffManager.instance.deleteHintsForEndpoint(endpoint);
- Gossiper.instance.removeEndpoint(endpoint);
+ removeEndpoint(endpoint);
tokenMetadata.removeEndpoint(endpoint);
tokenMetadata.removeBootstrapTokens(tokens);
if (!isClientMode)
@@ -1564,11 +1565,6 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
subscriber.onLeaveCluster(endpoint);
}
calculatePendingRanges();
- if (!isClientMode)
- {
- logger.info("Removing tokens " + tokens + " for " + endpoint);
- SystemTable.removeTokens(tokens);
- }
}
private void excise(Collection<Token> tokens, InetAddress endpoint, long expireTime)
@@ -1577,6 +1573,14 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
excise(tokens, endpoint);
}
+ /** unlike excise we just need this endpoint gone without going through any notifications **/
+ private void removeEndpoint(InetAddress endpoint)
+ {
+ Gossiper.instance.removeEndpoint(endpoint);
+ if (!isClientMode)
+ SystemTable.removeEndpoint(endpoint);
+ }
+
protected void addExpireTimeIfFound(InetAddress endpoint, long expireTime)
{
if (expireTime != 0L)
http://git-wip-us.apache.org/repos/asf/cassandra/blob/e6b6eaa5/test/unit/org/apache/cassandra/db/SystemTableTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/SystemTableTest.java b/test/unit/org/apache/cassandra/db/SystemTableTest.java
index 12d2e34..8854411 100644
--- a/test/unit/org/apache/cassandra/db/SystemTableTest.java
+++ b/test/unit/org/apache/cassandra/db/SystemTableTest.java
@@ -66,7 +66,7 @@ public class SystemTableTest
InetAddress address = InetAddress.getByName("127.0.0.2");
SystemTable.updateTokens(address, Collections.<Token>singletonList(token));
assert SystemTable.loadTokens().get(address).contains(token);
- SystemTable.removeTokens(Collections.<Token>singletonList(token));
+ SystemTable.removeEndpoint(address);
assert !SystemTable.loadTokens().containsValue(token);
}