You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/11/24 21:27:03 UTC
svn commit: r883854 -
/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
Author: jbellis
Date: Tue Nov 24 20:27:02 2009
New Revision: 883854
URL: http://svn.apache.org/viewvc?rev=883854&view=rev
Log:
Moved leaving ring code to a separate helper function and call it right away if rangesMM is empty. patch by Jaakko Laine; reviewed by jbellis for CASSANDRA-573
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=883854&r1=883853&r2=883854&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Tue Nov 24 20:27:02 2009
@@ -968,11 +968,39 @@
unbootstrap(finishLeaving);
}
+ private void leaveRing()
+ {
+ SystemTable.setBootstrapped(false);
+ tokenMetadata_.removeEndpoint(FBUtilities.getLocalAddress());
+ replicationStrategy_.removeObsoletePendingRanges();
+
+ if (logger_.isDebugEnabled())
+ logger_.debug("");
+ Gossiper.instance().addApplicationState(STATE_LEFT, new ApplicationState(getLocalToken().toString()));
+ try
+ {
+ Thread.sleep(2 * Gossiper.intervalInMillis_);
+ }
+ catch (InterruptedException e)
+ {
+ throw new AssertionError(e);
+ }
+ }
+
private void unbootstrap(final Runnable onFinish)
{
Multimap<Range, InetAddress> rangesMM = getChangedRangesForLeaving(FBUtilities.getLocalAddress());
if (logger_.isDebugEnabled())
logger_.debug("Ranges needing transfer are [" + StringUtils.join(rangesMM.keySet(), ",") + "]");
+
+ if (rangesMM.isEmpty())
+ {
+ // nothing needs transfer, so leave immediately. this can happen when replication factor == number of nodes.
+ leaveRing();
+ onFinish.run();
+ return;
+ }
+
final Set<Map.Entry<Range, InetAddress>> pending = new HashSet<Map.Entry<Range, InetAddress>>(rangesMM.entries());
for (final Map.Entry<Range, InetAddress> entry : rangesMM.entries())
{
@@ -985,22 +1013,7 @@
pending.remove(entry);
if (pending.isEmpty())
{
- SystemTable.setBootstrapped(false);
- tokenMetadata_.removeEndpoint(FBUtilities.getLocalAddress());
- replicationStrategy_.removeObsoletePendingRanges();
-
- if (logger_.isDebugEnabled())
- logger_.debug("");
- Gossiper.instance().addApplicationState(STATE_LEFT, new ApplicationState(getLocalToken().toString()));
- try
- {
- Thread.sleep(2 * Gossiper.intervalInMillis_);
- }
- catch (InterruptedException e)
- {
- throw new AssertionError(e);
- }
-
+ leaveRing();
onFinish.run();
}
}