Author: xedin
Date: Mon Dec 19 09:33:17 2011
New Revision: 1220672
URL: http://svn.apache.org/viewvc?rev=1220672&view=rev
Log:
merge from 1.0
Modified:
cassandra/trunk/ (props changed)
cassandra/trunk/build.xml
cassandra/trunk/contrib/ (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
(props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
(props changed)
cassandra/trunk/src/java/org/apache/cassandra/db/context/CounterContext.java
cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
cassandra/trunk/src/java/org/apache/cassandra/io/util/SequentialWriter.java
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java
cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
cassandra/trunk/src/java/org/apache/cassandra/utils/CLibrary.java
Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7:1026516-1211709
/cassandra/branches/cassandra-0.7.0:1053690-1055654
-/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0:1125021-1130369
/cassandra/branches/cassandra-0.8.1:1101014-1125018
-/cassandra/branches/cassandra-1.0:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0:1167085-1220666
/cassandra/branches/cassandra-1.0.0:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5:1208016
/cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
Modified: cassandra/trunk/build.xml
URL:
http://svn.apache.org/viewvc/cassandra/trunk/build.xml?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
--- cassandra/trunk/build.xml (original)
+++ cassandra/trunk/build.xml Mon Dec 19 09:33:17 2011
@@ -376,7 +376,9 @@ url=${svn.entry.url}?pathrev=${svn.entry
<dependency groupId="com.thoughtworks.paranamer"
artifactId="paranamer-ant" version="2.1"/>
<dependency groupId="junit" artifactId="junit" version="4.6" />
<dependency groupId="commons-logging" artifactId="commons-logging"
version="1.1.1"/>
- <dependency groupId="org.apache.rat" artifactId="apache-rat"
version="0.6" />
+ <dependency groupId="org.apache.rat" artifactId="apache-rat"
version="0.6">
+ <exclusion groupId="commons-lang" artifactId="commons-lang"/>
+ </dependency>
<dependency groupId="org.apache.hadoop" artifactId="hadoop-core"
version="0.20.203.0"/>
<dependency groupId="net.sf.jopt-simple" artifactId="jopt-simple"
version="3.2"/>
<dependency groupId="net.java.dev.jna" artifactId="jna"
version="3.2.7"/>
Propchange: cassandra/trunk/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009
/cassandra/branches/cassandra-0.7/contrib:1026516-1211709
/cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654
-/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369
/cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018
-/cassandra/branches/cassandra-1.0/contrib:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0/contrib:1167085-1220666
/cassandra/branches/cassandra-1.0.0/contrib:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5/contrib:1208016
/cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1211709
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018
-/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167085-1220666
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1208016
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1211709
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018
-/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167085-1220666
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1208016
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1211709
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018
-/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167085-1220666
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1208016
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1211709
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018
-/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167085-1220666
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1208016
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
Propchange:
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Dec 19 09:33:17 2011
@@ -1,10 +1,10 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291
/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1211709
/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654
-/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938
+/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1198724,1198726-1206097,1206099-1212854,1212938,1214916
/cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369
/cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018
-/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1213775,1220665
+/cassandra/branches/cassandra-1.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167085-1220666
/cassandra/branches/cassandra-1.0.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1167104-1167229,1167232-1181093,1181741,1181816,1181820,1182951,1183243
/cassandra/branches/cassandra-1.0.5/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1208016
/cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
Modified:
cassandra/trunk/src/java/org/apache/cassandra/db/context/CounterContext.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/context/CounterContext.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
---
cassandra/trunk/src/java/org/apache/cassandra/db/context/CounterContext.java
(original)
+++
cassandra/trunk/src/java/org/apache/cassandra/db/context/CounterContext.java
Mon Dec 19 09:33:17 2011
@@ -19,15 +19,18 @@ package org.apache.cassandra.db.context;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
-import org.apache.log4j.Logger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
-import org.apache.cassandra.db.marshal.MarshalException;
import org.apache.cassandra.db.DBConstants;
+import org.apache.cassandra.db.marshal.MarshalException;
import org.apache.cassandra.utils.Allocator;
-import org.apache.cassandra.utils.HeapAllocator;
import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.HeapAllocator;
import org.apache.cassandra.utils.NodeId;
/**
@@ -73,7 +76,7 @@ public class CounterContext implements I
private static final int COUNT_LENGTH = DBConstants.longSize;
private static final int STEP_LENGTH = NodeId.LENGTH + CLOCK_LENGTH +
COUNT_LENGTH;
- private static final Logger logger =
Logger.getLogger(CounterContext.class);
+ private static final Logger logger =
LoggerFactory.getLogger(CounterContext.class);
// lazy-load singleton
private static class LazyHolder
Modified: cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java Mon Dec 19
09:33:17 2011
@@ -930,7 +930,8 @@ public class Gossiper implements IFailur
}
else
{
- // this is a new node
+ // this is a new node, report it to the FD in case it is the
first time we are seeing it AND it's not alive
+ FailureDetector.instance.report(ep);
handleMajorStateChange(ep, remoteState);
}
}
Modified:
cassandra/trunk/src/java/org/apache/cassandra/io/util/SequentialWriter.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/util/SequentialWriter.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/io/util/SequentialWriter.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/io/util/SequentialWriter.java
Mon Dec 19 09:33:17 2011
@@ -39,6 +39,9 @@ public class SequentialWriter extends Ou
protected byte[] buffer;
private final boolean skipIOCache;
private final int fd;
+ private final int directoryFD;
+ // directory should be synced only after first file sync, in other words,
only once per file
+ private boolean directorySynced = false;
protected long current = 0, bufferOffset;
protected int validBufferBytes;
@@ -60,6 +63,7 @@ public class SequentialWriter extends Ou
buffer = new byte[bufferSize];
this.skipIOCache = skipIOCache;
fd = CLibrary.getfd(out.getFD());
+ directoryFD = CLibrary.tryOpenDirectory(file.getParent());
stream = new DataOutputStream(this);
}
@@ -148,6 +152,12 @@ public class SequentialWriter extends Ou
flushInternal();
out.getFD().sync();
+ if (!directorySynced)
+ {
+ CLibrary.trySync(directoryFD);
+ directorySynced = true;
+ }
+
syncNeeded = false;
}
}
@@ -288,6 +298,7 @@ public class SequentialWriter extends Ou
CLibrary.trySkipCache(fd, 0, 0);
out.close();
+ CLibrary.tryCloseFD(directoryFD);
}
/**
Modified:
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
---
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
(original)
+++
cassandra/trunk/src/java/org/apache/cassandra/service/AbstractCassandraDaemon.java
Mon Dec 19 09:33:17 2011
@@ -23,6 +23,8 @@ import java.io.IOException;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
import java.util.UUID;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
@@ -46,6 +48,9 @@ import org.apache.cassandra.db.commitlog
import org.apache.cassandra.db.migration.Migration;
import org.apache.cassandra.utils.CLibrary;
import org.apache.cassandra.utils.Mx4jTool;
+import org.apache.commons.lang.ArrayUtils;
+
+import com.google.common.collect.Iterables;
/**
* The <code>CassandraDaemon</code> is an abstraction for a Cassandra daemon
@@ -117,10 +122,10 @@ public abstract class AbstractCassandraD
*/
protected void setup() throws IOException
{
- logger.info("JVM vendor/version: {}/{}",
System.getProperty("java.vm.name"), System.getProperty("java.version") );
+ logger.info("JVM vendor/version: {}/{}",
System.getProperty("java.vm.name"), System.getProperty("java.version") );
logger.info("Heap size: {}/{}", Runtime.getRuntime().totalMemory(),
Runtime.getRuntime().maxMemory());
- logger.info("Classpath: {}",
System.getProperty("java.class.path"));
- CLibrary.tryMlockall();
+ logger.info("Classpath: {}", System.getProperty("java.class.path"));
+ CLibrary.tryMlockall();
listenPort = DatabaseDescriptor.getRpcPort();
listenAddr = DatabaseDescriptor.getRpcAddress();
@@ -139,7 +144,20 @@ public abstract class AbstractCassandraD
}
}
});
-
+
+ // check all directories(data, commitlog, saved cache) for existence
and permission
+ Iterable<String> dirs =
Iterables.concat(Arrays.asList(DatabaseDescriptor.getAllDataFileLocations()),
+ Arrays.asList(new String[]
{DatabaseDescriptor.getCommitLogLocation(),
+
DatabaseDescriptor.getSavedCachesLocation()}));
+ for (String dataDir : dirs)
+ {
+ logger.debug("Checking directory {}", dataDir);
+ File dir = new File(dataDir);
+ if (dir.exists())
+ assert dir.isDirectory() && dir.canRead() && dir.canWrite() &&
dir.canExecute()
+ : String.format("Directory %s is not accessible.",
dataDir);
+ }
+
// check the system table to keep user from shooting self in foot by
changing partitioner, cluster name, etc.
// we do a one-off scrub of the system table first; we can't load the
list of the rest of the tables,
// until system table is opened.
Modified:
cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/MigrationManager.java
Mon Dec 19 09:33:17 2011
@@ -53,6 +53,8 @@ public class MigrationManager implements
// avoids re-pushing migrations that we're waiting on target to apply
already
private static Map<InetAddress,UUID> lastPushed = new
MapMaker().expiration(1, TimeUnit.MINUTES).makeMap();
+
+ private static UUID highestKnown;
public void onJoin(InetAddress endpoint, EndpointState epState) {
VersionedValue value =
epState.getApplicationState(ApplicationState.SCHEMA);
@@ -94,6 +96,7 @@ public class MigrationManager implements
*/
public static void rectify(UUID theirVersion, InetAddress endpoint)
{
+ updateHighestKnown(theirVersion);
UUID myVersion = Schema.instance.getVersion();
if (theirVersion.timestamp() < myVersion.timestamp()
&& !StorageService.instance.isClientMode())
@@ -112,6 +115,17 @@ public class MigrationManager implements
}
}
}
+
+ private static void updateHighestKnown(UUID theirversion)
+ {
+ if (highestKnown == null || theirversion.timestamp() >
highestKnown.timestamp())
+ highestKnown = theirversion;
+ }
+
+ public static boolean isReadyForBootstrap()
+ {
+ return highestKnown.compareTo(Schema.instance.getVersion()) == 0;
+ }
private static void pushMigrations(InetAddress endpoint,
Collection<IColumn> migrations)
{
Modified:
cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
Mon Dec 19 09:33:17 2011
@@ -524,6 +524,7 @@ public class StorageService implements I
|| !Schema.instance.getNonSystemTables().isEmpty()))
{
setMode(Mode.JOINING, "waiting for ring and schema information",
true);
+ // first sleep the delay to make sure we see the schema
try
{
Thread.sleep(delay);
@@ -532,6 +533,22 @@ public class StorageService implements I
{
throw new AssertionError(e);
}
+ // now if our schema hasn't matched, keep sleeping until it does
+ while (!MigrationManager.isReadyForBootstrap())
+ {
+ setMode(Mode.JOINING, "waiting for schema information to
complete", true);
+ try
+ {
+ Thread.sleep(delay);
+ }
+ catch (InterruptedException e)
+ {
+ throw new AssertionError(e);
+ }
+ }
+ setMode(Mode.JOINING, "schema complete, ready to bootstrap", true);
+
+
if (logger_.isDebugEnabled())
logger_.debug("... got ring + schema info");
Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/CLibrary.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/CLibrary.java?rev=1220672&r1=1220671&r2=1220672&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/utils/CLibrary.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/utils/CLibrary.java Mon Dec
19 09:33:17 2011
@@ -18,14 +18,18 @@
*/
package org.apache.cassandra.utils;
+import java.io.BufferedReader;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
+import java.io.InputStreamReader;
import java.lang.reflect.Field;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.commons.lang.StringUtils;
+
import com.sun.jna.LastErrorException;
import com.sun.jna.Native;
@@ -42,6 +46,7 @@ public final class CLibrary
private static final int F_SETFL = 4; /* set file status flags */
private static final int F_NOCACHE = 48; /* Mac OS X specific flag, turns
cache on/off */
private static final int O_DIRECT = 040000; /* fcntl.h */
+ private static final int O_RDONLY = 00000000; /* fcntl.h */
private static final int POSIX_FADV_NORMAL = 0; /* fadvise.h */
private static final int POSIX_FADV_RANDOM = 1; /* fadvise.h */
@@ -80,7 +85,11 @@ public final class CLibrary
// fadvice
public static native int posix_fadvise(int fd, long offset, int len, int
flag) throws LastErrorException;
-
+
+ public static native int open(String path, int flags) throws
LastErrorException;
+ public static native int fsync(int fd) throws LastErrorException;
+ public static native int close(int fd) throws LastErrorException;
+
private static int errno(RuntimeException e)
{
assert e instanceof LastErrorException;
@@ -148,6 +157,7 @@ public final class CLibrary
}
catch (RuntimeException e)
{
+ logger.error("Unable to create hard link", e);
if (!(e instanceof LastErrorException))
throw e;
// there are 17 different error codes listed on the man page.
punt until/unless we find which
@@ -178,10 +188,37 @@ public final class CLibrary
pb = new ProcessBuilder("ln", sourceFile.getAbsolutePath(),
destinationFile.getAbsolutePath());
pb.redirectErrorStream(true);
}
+ try
+ {
+ exec(pb);
+ }
+ catch (IOException ex)
+ {
+ logger.error("Unable to create hard link", ex);
+ throw ex;
+ }
+ }
+
+ private static void exec(ProcessBuilder pb) throws IOException
+ {
Process p = pb.start();
try
{
- p.waitFor();
+ int errCode = p.waitFor();
+ if (errCode != 0)
+ {
+ BufferedReader in = new BufferedReader(new
InputStreamReader(p.getInputStream()));
+ BufferedReader err = new BufferedReader(new
InputStreamReader(p.getErrorStream()));
+ StringBuffer buff = new StringBuffer();
+ String str;
+ while ((str = in.readLine()) != null)
+
buff.append(str).append(System.getProperty("line.separator"));
+ while ((str = err.readLine()) != null)
+
buff.append(str).append(System.getProperty("line.separator"));
+ throw new IOException("Exception while executing the command:
"+ StringUtils.join(pb.command(), " ") +
+ ", command error Code: " + errCode +
+ ", command output: "+ buff.toString());
+ }
}
catch (InterruptedException e)
{
@@ -229,6 +266,73 @@ public final class CLibrary
return result;
}
+ public static int tryOpenDirectory(String path)
+ {
+ int fd = -1;
+
+ try
+ {
+ return open(path, O_RDONLY);
+ }
+ catch (UnsatisfiedLinkError e)
+ {
+ // JNA is unavailable just skipping Direct I/O
+ }
+ catch (RuntimeException e)
+ {
+ if (!(e instanceof LastErrorException))
+ throw e;
+
+ logger.warn(String.format("open(%s, O_RDONLY) failed, errno
(%d).", path, CLibrary.errno(e)));
+ }
+
+ return fd;
+ }
+
+ public static void trySync(int fd)
+ {
+ if (fd == -1)
+ return;
+
+ try
+ {
+ fsync(fd);
+ }
+ catch (UnsatisfiedLinkError e)
+ {
+ // JNA is unavailable just skipping Direct I/O
+ }
+ catch (RuntimeException e)
+ {
+ if (!(e instanceof LastErrorException))
+ throw e;
+
+ logger.warn(String.format("fsync(%d) failed, errno (%d).", fd,
CLibrary.errno(e)));
+ }
+ }
+
+ public static void tryCloseFD(int fd)
+ {
+ if (fd == -1)
+ return;
+
+ try
+ {
+ close(fd);
+ }
+ catch (UnsatisfiedLinkError e)
+ {
+ // JNA is unavailable just skipping Direct I/O
+ }
+ catch (RuntimeException e)
+ {
+ if (!(e instanceof LastErrorException))
+ throw e;
+
+ logger.warn(String.format("close(%d) failed, errno (%d).", fd,
CLibrary.errno(e)));
+ }
+ }
+
/**
* Get system file descriptor from FileDescriptor object.
* @param descriptor - FileDescriptor objec to get fd from