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