Author: jbellis
Date: Tue Feb 9 22:57:32 2010
New Revision: 908267
URL: http://svn.apache.org/viewvc?rev=908267&view=rev
Log:
sleep after moving to get load info before asking for bootstrap token. patch
by Stu Hood; reviewed by jbellis for CASSANDRA-762
Modified:
incubator/cassandra/branches/cassandra-0.5/CHANGES.txt
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
Modified: incubator/cassandra/branches/cassandra-0.5/CHANGES.txt
URL:
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/CHANGES.txt?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
--- incubator/cassandra/branches/cassandra-0.5/CHANGES.txt (original)
+++ incubator/cassandra/branches/cassandra-0.5/CHANGES.txt Tue Feb 9 22:57:32
2010
@@ -3,6 +3,7 @@
(CASSANDRA-716)
* don't omit live subcolumns of deleted supercolumns in thrift result.
(CASSANDRA-703)
+ * more accurate load estimate for bootstrapping (CASSANDRA-762)
0.5.0 final
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
---
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
(original)
+++
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/io/Streaming.java
Tue Feb 9 22:57:32 2010
@@ -51,7 +51,7 @@
{
private static Logger logger = Logger.getLogger(Streaming.class);
private static String TABLE_NAME = "STREAMING-TABLE-NAME";
- public static final long RING_DELAY = 30 * 1000; // delay after which we
assume ring has stablized
+ public static final int RING_DELAY = 30 * 1000; // delay after which we
assume ring has stablized
/**
* Split out files for all tables on disk locally for each range and then
stream them to the target endpoint.
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
---
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
(original)
+++
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageLoadBalancer.java
Tue Feb 9 22:57:32 2010
@@ -167,7 +167,7 @@
}
}
- private static final long BROADCAST_INTERVAL = 5 * 60 * 1000L;
+ private static final int BROADCAST_INTERVAL = 5 * 60 * 1000;
private static StorageLoadBalancer instance_;
@@ -367,18 +367,17 @@
loadTimer_.schedule(new LoadDisseminator(), 2 *
Gossiper.intervalInMillis_, BROADCAST_INTERVAL);
}
- /** wait for node information to be available. if the rest of the cluster
just came up,
- this could be up to threshold_ ms (currently 5 minutes). */
+ /**
+ * Wait for at least BROADCAST_INTERVAL ms, to give all nodes enough time
to
+ * report in.
+ */
public void waitForLoadInfo()
{
+ int duration = BROADCAST_INTERVAL + Streaming.RING_DELAY;
try
{
- while (loadInfo_.isEmpty())
- {
- Thread.sleep(100);
- }
- // one more sleep in case there are some stragglers
- Thread.sleep(Streaming.RING_DELAY);
+ logger_.info("Sleeping " + duration + " ms to wait for load
information...");
+ Thread.sleep(duration);
}
catch (InterruptedException e)
{
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
---
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
(original)
+++
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageService.java
Tue Feb 9 22:57:32 2010
@@ -300,7 +300,7 @@
if (DatabaseDescriptor.isAutoBootstrap()
&&
!(DatabaseDescriptor.getSeeds().contains(FBUtilities.getLocalAddress()) ||
SystemTable.isBootstrapped()))
{
- logger_.info("Starting in bootstrap mode (first, sleeping to get
load information)");
+ logger_.info("Starting in bootstrap mode");
StorageLoadBalancer.instance().waitForLoadInfo();
logger_.info("... got load info");
if (tokenMetadata_.isMember(FBUtilities.getLocalAddress()))
@@ -1276,6 +1276,7 @@
if
(tokenMetadata_.getPendingRanges(FBUtilities.getLocalAddress()).size() > 0)
throw new UnsupportedOperationException("data is currently moving
to this node; unable to leave the ring");
+ // leave the ring
logger_.info("DECOMMISSIONING");
startLeaving();
logger_.info("decommission sleeping " + Streaming.RING_DELAY);
@@ -1355,7 +1356,7 @@
}
}
- public void move(String newToken) throws InterruptedException
+ public void move(String newToken) throws IOException, InterruptedException
{
move(partitioner_.getTokenFactory().fromString(newToken));
}
@@ -1370,11 +1371,14 @@
*
* @param token new token to boot to, or if null, find balanced token to
boot to
*/
- private void move(final Token token) throws InterruptedException
+ private void move(final Token token) throws IOException,
InterruptedException
{
if
(tokenMetadata_.getPendingRanges(FBUtilities.getLocalAddress()).size() > 0)
throw new UnsupportedOperationException("data is currently moving
to this node; unable to leave the ring");
+ if (token != null && tokenMetadata_.sortedTokens().contains(token))
+ throw new IOException("target token " + token + " is already owned
by another node");
+ // leave the ring
logger_.info("starting move. leaving token " + getLocalToken());
startLeaving();
logger_.info("move sleeping " + Streaming.RING_DELAY);
@@ -1388,7 +1392,10 @@
{
Token bootstrapToken = token;
if (bootstrapToken == null)
+ {
+ StorageLoadBalancer.instance().waitForLoadInfo();
bootstrapToken =
BootStrapper.getBalancedToken(tokenMetadata_,
StorageLoadBalancer.instance().getLoadInfo());
+ }
logger_.info("re-bootstrapping to new token " +
bootstrapToken);
startBootstrap(bootstrapToken);
}
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
---
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
(original)
+++
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/service/StorageServiceMBean.java
Tue Feb 9 22:57:32 2010
@@ -132,7 +132,7 @@
* @param newToken token to move this node to.
* This node will unload its data onto its neighbors, and bootstrap to the
new token.
*/
- public void move(String newToken) throws InterruptedException;
+ public void move(String newToken) throws IOException, InterruptedException;
/**
* This node will unload its data onto its neighbors, and bootstrap to
share the range
Modified:
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=908267&r1=908266&r2=908267&view=diff
==============================================================================
---
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
(original)
+++
incubator/cassandra/branches/cassandra-0.5/src/java/org/apache/cassandra/tools/NodeProbe.java
Tue Feb 9 22:57:32 2010
@@ -392,7 +392,7 @@
ssProxy.loadBalance();
}
- public void move(String newToken) throws InterruptedException
+ public void move(String newToken) throws IOException, InterruptedException
{
ssProxy.move(newToken);
}