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 2013/10/14 11:39:09 UTC

[01/11] git commit: typos

Updated Branches:
  refs/heads/cassandra-1.2 1797b49e2 -> d40f3c8d7
  refs/heads/cassandra-2.0 a7c654122 -> 810f0678c
  refs/heads/trunk 1353e0a37 -> 13f21db96


typos


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/4284d98a
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/4284d98a
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/4284d98a

Branch: refs/heads/trunk
Commit: 4284d98ae4f2cc47af8fead1222ddeb81552b656
Parents: 639c01a
Author: Brandon Williams <br...@apache.org>
Authored: Sun Oct 13 17:52:28 2013 -0500
Committer: Brandon Williams <br...@apache.org>
Committed: Sun Oct 13 17:52:28 2013 -0500

----------------------------------------------------------------------
 .../org/apache/cassandra/cql3/statements/CreateUserStatement.java  | 2 +-
 .../org/apache/cassandra/cql3/statements/DropUserStatement.java    | 2 +-
 src/java/org/apache/cassandra/service/StorageProxy.java            | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/4284d98a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
index df3a5e7..a82b38d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
@@ -57,7 +57,7 @@ public class CreateUserStatement extends AuthenticationStatement
     public void checkAccess(ClientState state) throws UnauthorizedException
     {
         if (!state.getUser().isSuper())
-            throw new UnauthorizedException("Only superusers are allowed to perfrom CREATE USER queries");
+            throw new UnauthorizedException("Only superusers are allowed to perform CREATE USER queries");
     }
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4284d98a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
index d55566c..0894db0 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
@@ -52,7 +52,7 @@ public class DropUserStatement extends AuthenticationStatement
     public void checkAccess(ClientState state) throws UnauthorizedException
     {
         if (!state.getUser().isSuper())
-            throw new UnauthorizedException("Only superusers are allowed to perfrom DROP USER queries");
+            throw new UnauthorizedException("Only superusers are allowed to perform DROP USER queries");
     }
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/4284d98a/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index cdb0bd6..f195285 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -384,7 +384,7 @@ public class StorageProxy implements StorageProxyMBean
         return responseHandler;
     }
 
-    // same as above except does not initiate writes (but does perfrom availability checks).
+    // same as above except does not initiate writes (but does perform availability checks).
     private static WriteResponseHandlerWrapper wrapResponseHandler(RowMutation mutation, ConsistencyLevel consistency_level, WriteType writeType)
     {
         AbstractReplicationStrategy rs = Table.open(mutation.getTable()).getReplicationStrategy();


[04/11] git commit: typos

Posted by jb...@apache.org.
typos


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1797b49e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1797b49e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1797b49e

Branch: refs/heads/cassandra-2.0
Commit: 1797b49e215b5710cda540d734a08429840ac788
Parents: 7290abd
Author: Brandon Williams <br...@apache.org>
Authored: Sun Oct 13 17:52:28 2013 -0500
Committer: Brandon Williams <br...@apache.org>
Committed: Sun Oct 13 17:54:17 2013 -0500

----------------------------------------------------------------------
 .../org/apache/cassandra/cql3/statements/CreateUserStatement.java  | 2 +-
 .../org/apache/cassandra/cql3/statements/DropUserStatement.java    | 2 +-
 src/java/org/apache/cassandra/service/StorageProxy.java            | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1797b49e/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
index df3a5e7..a82b38d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
@@ -57,7 +57,7 @@ public class CreateUserStatement extends AuthenticationStatement
     public void checkAccess(ClientState state) throws UnauthorizedException
     {
         if (!state.getUser().isSuper())
-            throw new UnauthorizedException("Only superusers are allowed to perfrom CREATE USER queries");
+            throw new UnauthorizedException("Only superusers are allowed to perform CREATE USER queries");
     }
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1797b49e/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
index d55566c..0894db0 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
@@ -52,7 +52,7 @@ public class DropUserStatement extends AuthenticationStatement
     public void checkAccess(ClientState state) throws UnauthorizedException
     {
         if (!state.getUser().isSuper())
-            throw new UnauthorizedException("Only superusers are allowed to perfrom DROP USER queries");
+            throw new UnauthorizedException("Only superusers are allowed to perform DROP USER queries");
     }
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1797b49e/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index cdb0bd6..f195285 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -384,7 +384,7 @@ public class StorageProxy implements StorageProxyMBean
         return responseHandler;
     }
 
-    // same as above except does not initiate writes (but does perfrom availability checks).
+    // same as above except does not initiate writes (but does perform availability checks).
     private static WriteResponseHandlerWrapper wrapResponseHandler(RowMutation mutation, ConsistencyLevel consistency_level, WriteType writeType)
     {
         AbstractReplicationStrategy rs = Table.open(mutation.getTable()).getReplicationStrategy();


[03/11] git commit: Merge branch 'cassandra-2.0' of https://git-wip-us.apache.org/repos/asf/cassandra into cassandra-2.0

Posted by jb...@apache.org.
Merge branch 'cassandra-2.0' of https://git-wip-us.apache.org/repos/asf/cassandra into cassandra-2.0


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/a7c65412
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/a7c65412
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/a7c65412

Branch: refs/heads/trunk
Commit: a7c6541220f6e3673075284bd5e398caa9641a54
Parents: c9a906c 53b2d9d
Author: Brandon Williams <br...@apache.org>
Authored: Sun Oct 13 17:53:17 2013 -0500
Committer: Brandon Williams <br...@apache.org>
Committed: Sun Oct 13 17:53:17 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 ++
 NEWS.txt                                        |  3 +-
 .../org/apache/cassandra/config/CFMetaData.java | 10 ++++--
 .../apache/cassandra/db/ColumnFamilyStore.java  |  8 ++---
 .../AbstractSimplePerColumnSecondaryIndex.java  | 19 ------------
 .../apache/cassandra/utils/StatusLogger.java    |  2 +-
 .../org/apache/cassandra/stress/Session.java    | 32 ++++++++++++++++++--
 7 files changed, 44 insertions(+), 32 deletions(-)
----------------------------------------------------------------------



[05/11] git commit: typos

Posted by jb...@apache.org.
typos


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1797b49e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1797b49e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1797b49e

Branch: refs/heads/trunk
Commit: 1797b49e215b5710cda540d734a08429840ac788
Parents: 7290abd
Author: Brandon Williams <br...@apache.org>
Authored: Sun Oct 13 17:52:28 2013 -0500
Committer: Brandon Williams <br...@apache.org>
Committed: Sun Oct 13 17:54:17 2013 -0500

----------------------------------------------------------------------
 .../org/apache/cassandra/cql3/statements/CreateUserStatement.java  | 2 +-
 .../org/apache/cassandra/cql3/statements/DropUserStatement.java    | 2 +-
 src/java/org/apache/cassandra/service/StorageProxy.java            | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1797b49e/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
index df3a5e7..a82b38d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateUserStatement.java
@@ -57,7 +57,7 @@ public class CreateUserStatement extends AuthenticationStatement
     public void checkAccess(ClientState state) throws UnauthorizedException
     {
         if (!state.getUser().isSuper())
-            throw new UnauthorizedException("Only superusers are allowed to perfrom CREATE USER queries");
+            throw new UnauthorizedException("Only superusers are allowed to perform CREATE USER queries");
     }
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1797b49e/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java b/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
index d55566c..0894db0 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DropUserStatement.java
@@ -52,7 +52,7 @@ public class DropUserStatement extends AuthenticationStatement
     public void checkAccess(ClientState state) throws UnauthorizedException
     {
         if (!state.getUser().isSuper())
-            throw new UnauthorizedException("Only superusers are allowed to perfrom DROP USER queries");
+            throw new UnauthorizedException("Only superusers are allowed to perform DROP USER queries");
     }
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1797b49e/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index cdb0bd6..f195285 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -384,7 +384,7 @@ public class StorageProxy implements StorageProxyMBean
         return responseHandler;
     }
 
-    // same as above except does not initiate writes (but does perfrom availability checks).
+    // same as above except does not initiate writes (but does perform availability checks).
     private static WriteResponseHandlerWrapper wrapResponseHandler(RowMutation mutation, ConsistencyLevel consistency_level, WriteType writeType)
     {
         AbstractReplicationStrategy rs = Table.open(mutation.getTable()).getReplicationStrategy();


[09/11] git commit: merge from 1.2

Posted by jb...@apache.org.
merge from 1.2


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/810f0678
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/810f0678
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/810f0678

Branch: refs/heads/trunk
Commit: 810f0678ccd598b8f99b7b5df459c5cbe76ee9b8
Parents: a7c6541 d40f3c8
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Oct 14 10:37:32 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Oct 14 10:37:32 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/DataTracker.java    | 30 ++++++++++++++------
 .../cassandra/io/sstable/SSTableReader.java     |  4 +--
 3 files changed, 25 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/810f0678/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 4668ae2,53bc848..cd06acc
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -48,43 -23,10 +48,44 @@@ Merged from 1.2
   * (Hadoop) Fetch no more than 128 splits in parallel (CASSANDRA-6169)
   * stress: add username/password authentication support (CASSANDRA-6068)
   * Fix indexed queries with row cache enabled on parent table (CASSANDRA-5732)
+  * Fix compaction race during columnfamily drop (CASSANDRA-5957)
  
  
 -1.2.10
 +2.0.1
 + * Fix bug that could allow reading deleted data temporarily (CASSANDRA-6025)
 + * Improve memory use defaults (CASSANDRA-5069)
 + * Make ThriftServer more easlly extensible (CASSANDRA-6058)
 + * Remove Hadoop dependency from ITransportFactory (CASSANDRA-6062)
 + * add file_cache_size_in_mb setting (CASSANDRA-5661)
 + * Improve error message when yaml contains invalid properties (CASSANDRA-5958)
 + * Improve leveled compaction's ability to find non-overlapping L0 compactions
 +   to work on concurrently (CASSANDRA-5921)
 + * Notify indexer of columns shadowed by range tombstones (CASSANDRA-5614)
 + * Log Merkle tree stats (CASSANDRA-2698)
 + * Switch from crc32 to adler32 for compressed sstable checksums (CASSANDRA-5862)
 + * Improve offheap memcpy performance (CASSANDRA-5884)
 + * Use a range aware scanner for cleanup (CASSANDRA-2524)
 + * Cleanup doesn't need to inspect sstables that contain only local data
 +   (CASSANDRA-5722)
 + * Add ability for CQL3 to list partition keys (CASSANDRA-4536)
 + * Improve native protocol serialization (CASSANDRA-5664)
 + * Upgrade Thrift to 0.9.1 (CASSANDRA-5923)
 + * Require superuser status for adding triggers (CASSANDRA-5963)
 + * Make standalone scrubber handle old and new style leveled manifest
 +   (CASSANDRA-6005)
 + * Fix paxos bugs (CASSANDRA-6012, 6013, 6023)
 + * Fix paged ranges with multiple replicas (CASSANDRA-6004)
 + * Fix potential AssertionError during tracing (CASSANDRA-6041)
 + * Fix NPE in sstablesplit (CASSANDRA-6027)
 + * Migrate pre-2.0 key/value/column aliases to system.schema_columns
 +   (CASSANDRA-6009)
 + * Paging filter empty rows too agressively (CASSANDRA-6040)
 + * Support variadic parameters for IN clauses (CASSANDRA-4210)
 + * cqlsh: return the result of CAS writes (CASSANDRA-5796)
 + * Fix validation of IN clauses with 2ndary indexes (CASSANDRA-6050)
 + * Support named bind variables in CQL (CASSANDRA-6033)
 +Merged from 1.2:
 + * Allow cache-keys-to-save to be set at runtime (CASSANDRA-5980)
   * Avoid second-guessing out-of-space state (CASSANDRA-5605)
   * Tuning knobs for dealing with large blobs and many CFs (CASSANDRA-5982)
   * (Hadoop) Fix CQLRW for thrift tables (CASSANDRA-6002)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/810f0678/src/java/org/apache/cassandra/db/DataTracker.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/DataTracker.java
index 1a19fef,4fe0a5e..365d607
--- a/src/java/org/apache/cassandra/db/DataTracker.java
+++ b/src/java/org/apache/cassandra/db/DataTracker.java
@@@ -199,19 -188,20 +199,20 @@@ public class DataTracke
      }
  
      /**
 -     * Removes files from compacting status: this is different from 'markCompacted'
 +     * Removes files from compacting status: this is different from 'markObsolete'
       * because it should be run regardless of whether a compaction succeeded.
       */
 -    public void unmarkCompacting(Collection<SSTableReader> unmark)
 +    public void unmarkCompacting(Iterable<SSTableReader> unmark)
      {
-         if (!cfstore.isValid())
+         boolean isValid = cfstore.isValid();
+         if (!isValid)
          {
 -            // We don't know if the original compaction suceeded or failed, which makes it difficult to know
 -            // if the sstable reference has already been released.
 -            // A "good enough" approach is to mark the sstables involved compacted, which if compaction succeeded
 +            // The CF has been dropped.  We don't know if the original compaction suceeded or failed,
 +            // which makes it difficult to know if the sstable reference has already been released.
 +            // A "good enough" approach is to mark the sstables involved obsolete, which if compaction succeeded
              // is harmlessly redundant, and if it failed ensures that at least the sstable will get deleted on restart.
              for (SSTableReader sstable : unmark)
 -                sstable.markCompacted();
 +                sstable.markObsolete();
          }
  
          View currentView, newView;
@@@ -221,9 -211,17 +222,17 @@@
              newView = currentView.unmarkCompacting(unmark);
          }
          while (!view.compareAndSet(currentView, newView));
+ 
+         if (!isValid)
+         {
+             // when the CFS is invalidated, it will call unreferenceSSTables().  However, unreferenceSSTables only deals
+             // with sstables that aren't currently being compacted.  If there are ongoing compactions that finish or are
+             // interrupted after the CFS is invalidated, those sstables need to be unreferenced as well, so we do that here.
+             unreferenceSSTables();
+         }
      }
  
 -    public void markCompacted(Collection<SSTableReader> sstables, OperationType compactionType)
 +    public void markObsolete(Collection<SSTableReader> sstables, OperationType compactionType)
      {
          replace(sstables, Collections.<SSTableReader>emptyList());
          notifySSTablesChanged(sstables, Collections.<SSTableReader>emptyList(), compactionType);
@@@ -360,8 -360,13 +369,13 @@@
              long size = sstable.bytesOnDisk();
              StorageMetrics.load.dec(size);
              cfstore.metric.liveDiskSpaceUsed.dec(size);
+ 
+             // tolerateCompacted will be true when the CFS is no longer valid (dropped). If there were ongoing
+             // compactions when it was invalidated, sstables may already be marked compacted, so we should
+             // tolerate that (see CASSANDRA-5957)
 -            boolean firstToCompact = sstable.markCompacted();
 +            boolean firstToCompact = sstable.markObsolete();
-             assert firstToCompact : sstable + " was already marked compacted";
+             assert (tolerateCompacted || firstToCompact) : sstable + " was already marked compacted";
+ 
              sstable.releaseReference();
          }
      }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/810f0678/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/io/sstable/SSTableReader.java
index abd7c9f,ed221d9..cb0873d
--- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
@@@ -1102,10 -1003,10 +1102,10 @@@ public class SSTableReader extends SSTa
       * When calling this function, the caller must ensure that the SSTableReader is not referenced anywhere
       * except for threads holding a reference.
       *
-      * @return true if the this is the first time the file was marked compacted.  Calling this
-      * multiple times would be buggy.
 -     * @return true if the this is the first time the file was marked compacted.  With rare exceptions
 -     * (see DataTracker.unmarkCompacted) calling this multiple times would be buggy.
++     * @return true if the this is the first time the file was marked obsolete.  Calling this
++     * multiple times is usually buggy (see exceptions in DataTracker.unmarkCompacting and removeOldSSTablesSize).
       */
 -    public boolean markCompacted()
 +    public boolean markObsolete()
      {
          if (logger.isDebugEnabled())
              logger.debug("Marking " + getFilename() + " compacted");


[07/11] git commit: Fix compaction race during columnfamily drop patch by Tyler Hobbs; reviewed by jbellis for CASSANDRA-5957

Posted by jb...@apache.org.
Fix compaction race during columnfamily drop
patch by Tyler Hobbs; reviewed by jbellis for CASSANDRA-5957


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d40f3c8d
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d40f3c8d
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d40f3c8d

Branch: refs/heads/trunk
Commit: d40f3c8d7f826e88c4e2d23dfa2712b258b9857f
Parents: 1797b49
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Oct 14 10:35:10 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Oct 14 10:35:10 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/DataTracker.java    | 30 ++++++++++++++------
 2 files changed, 23 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d40f3c8d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 7f43031..53bc848 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -23,6 +23,7 @@
  * (Hadoop) Fetch no more than 128 splits in parallel (CASSANDRA-6169)
  * stress: add username/password authentication support (CASSANDRA-6068)
  * Fix indexed queries with row cache enabled on parent table (CASSANDRA-5732)
+ * Fix compaction race during columnfamily drop (CASSANDRA-5957)
 
 
 1.2.10

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d40f3c8d/src/java/org/apache/cassandra/db/DataTracker.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java
index b2f52a9..4fe0a5e 100644
--- a/src/java/org/apache/cassandra/db/DataTracker.java
+++ b/src/java/org/apache/cassandra/db/DataTracker.java
@@ -193,7 +193,8 @@ public class DataTracker
      */
     public void unmarkCompacting(Collection<SSTableReader> unmark)
     {
-        if (!cfstore.isValid())
+        boolean isValid = cfstore.isValid();
+        if (!isValid)
         {
             // We don't know if the original compaction suceeded or failed, which makes it difficult to know
             // if the sstable reference has already been released.
@@ -210,6 +211,14 @@ public class DataTracker
             newView = currentView.unmarkCompacting(unmark);
         }
         while (!view.compareAndSet(currentView, newView));
+
+        if (!isValid)
+        {
+            // when the CFS is invalidated, it will call unreferenceSSTables().  However, unreferenceSSTables only deals
+            // with sstables that aren't currently being compacted.  If there are ongoing compactions that finish or are
+            // interrupted after the CFS is invalidated, those sstables need to be unreferenced as well, so we do that here.
+            unreferenceSSTables();
+        }
     }
 
     public void markCompacted(Collection<SSTableReader> sstables, OperationType compactionType)
@@ -262,7 +271,7 @@ public class DataTracker
             return;
         }
         notifySSTablesChanged(notCompacting, Collections.<SSTableReader>emptySet(), OperationType.UNKNOWN);
-        postReplace(notCompacting, Collections.<SSTableReader>emptySet());
+        postReplace(notCompacting, Collections.<SSTableReader>emptySet(), true);
     }
 
     /**
@@ -305,7 +314,7 @@ public class DataTracker
     {
         if (!cfstore.isValid())
         {
-            removeOldSSTablesSize(replacements);
+            removeOldSSTablesSize(replacements, false);
             replacements = Collections.emptyList();
         }
 
@@ -317,13 +326,13 @@ public class DataTracker
         }
         while (!view.compareAndSet(currentView, newView));
 
-        postReplace(oldSSTables, replacements);
+        postReplace(oldSSTables, replacements, false);
     }
 
-    private void postReplace(Collection<SSTableReader> oldSSTables, Iterable<SSTableReader> replacements)
+    private void postReplace(Collection<SSTableReader> oldSSTables, Iterable<SSTableReader> replacements, boolean tolerateCompacted)
     {
         addNewSSTablesSize(replacements);
-        removeOldSSTablesSize(oldSSTables);
+        removeOldSSTablesSize(oldSSTables, tolerateCompacted);
     }
 
     private void addNewSSTablesSize(Iterable<SSTableReader> newSSTables)
@@ -341,7 +350,7 @@ public class DataTracker
         }
     }
 
-    private void removeOldSSTablesSize(Iterable<SSTableReader> oldSSTables)
+    private void removeOldSSTablesSize(Iterable<SSTableReader> oldSSTables, boolean tolerateCompacted)
     {
         for (SSTableReader sstable : oldSSTables)
         {
@@ -351,8 +360,13 @@ public class DataTracker
             long size = sstable.bytesOnDisk();
             StorageMetrics.load.dec(size);
             cfstore.metric.liveDiskSpaceUsed.dec(size);
+
+            // tolerateCompacted will be true when the CFS is no longer valid (dropped). If there were ongoing
+            // compactions when it was invalidated, sstables may already be marked compacted, so we should
+            // tolerate that (see CASSANDRA-5957)
             boolean firstToCompact = sstable.markCompacted();
-            assert firstToCompact : sstable + " was already marked compacted";
+            assert (tolerateCompacted || firstToCompact) : sstable + " was already marked compacted";
+
             sstable.releaseReference();
         }
     }


[11/11] git commit: Merge branch 'cassandra-2.0' into trunk

Posted by jb...@apache.org.
Merge branch 'cassandra-2.0' into trunk


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/13f21db9
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/13f21db9
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/13f21db9

Branch: refs/heads/trunk
Commit: 13f21db96f403705ad8cedb3413ab87228d4c4e9
Parents: 1353e0a 810f067
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Oct 14 10:38:30 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Oct 14 10:38:30 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/DataTracker.java    | 30 ++++++++++++++------
 .../cassandra/io/sstable/SSTableReader.java     |  4 +--
 3 files changed, 25 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/13f21db9/CHANGES.txt
----------------------------------------------------------------------


[10/11] git commit: merge from 1.2

Posted by jb...@apache.org.
merge from 1.2


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/810f0678
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/810f0678
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/810f0678

Branch: refs/heads/cassandra-2.0
Commit: 810f0678ccd598b8f99b7b5df459c5cbe76ee9b8
Parents: a7c6541 d40f3c8
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Oct 14 10:37:32 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Oct 14 10:37:32 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/DataTracker.java    | 30 ++++++++++++++------
 .../cassandra/io/sstable/SSTableReader.java     |  4 +--
 3 files changed, 25 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/810f0678/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 4668ae2,53bc848..cd06acc
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -48,43 -23,10 +48,44 @@@ Merged from 1.2
   * (Hadoop) Fetch no more than 128 splits in parallel (CASSANDRA-6169)
   * stress: add username/password authentication support (CASSANDRA-6068)
   * Fix indexed queries with row cache enabled on parent table (CASSANDRA-5732)
+  * Fix compaction race during columnfamily drop (CASSANDRA-5957)
  
  
 -1.2.10
 +2.0.1
 + * Fix bug that could allow reading deleted data temporarily (CASSANDRA-6025)
 + * Improve memory use defaults (CASSANDRA-5069)
 + * Make ThriftServer more easlly extensible (CASSANDRA-6058)
 + * Remove Hadoop dependency from ITransportFactory (CASSANDRA-6062)
 + * add file_cache_size_in_mb setting (CASSANDRA-5661)
 + * Improve error message when yaml contains invalid properties (CASSANDRA-5958)
 + * Improve leveled compaction's ability to find non-overlapping L0 compactions
 +   to work on concurrently (CASSANDRA-5921)
 + * Notify indexer of columns shadowed by range tombstones (CASSANDRA-5614)
 + * Log Merkle tree stats (CASSANDRA-2698)
 + * Switch from crc32 to adler32 for compressed sstable checksums (CASSANDRA-5862)
 + * Improve offheap memcpy performance (CASSANDRA-5884)
 + * Use a range aware scanner for cleanup (CASSANDRA-2524)
 + * Cleanup doesn't need to inspect sstables that contain only local data
 +   (CASSANDRA-5722)
 + * Add ability for CQL3 to list partition keys (CASSANDRA-4536)
 + * Improve native protocol serialization (CASSANDRA-5664)
 + * Upgrade Thrift to 0.9.1 (CASSANDRA-5923)
 + * Require superuser status for adding triggers (CASSANDRA-5963)
 + * Make standalone scrubber handle old and new style leveled manifest
 +   (CASSANDRA-6005)
 + * Fix paxos bugs (CASSANDRA-6012, 6013, 6023)
 + * Fix paged ranges with multiple replicas (CASSANDRA-6004)
 + * Fix potential AssertionError during tracing (CASSANDRA-6041)
 + * Fix NPE in sstablesplit (CASSANDRA-6027)
 + * Migrate pre-2.0 key/value/column aliases to system.schema_columns
 +   (CASSANDRA-6009)
 + * Paging filter empty rows too agressively (CASSANDRA-6040)
 + * Support variadic parameters for IN clauses (CASSANDRA-4210)
 + * cqlsh: return the result of CAS writes (CASSANDRA-5796)
 + * Fix validation of IN clauses with 2ndary indexes (CASSANDRA-6050)
 + * Support named bind variables in CQL (CASSANDRA-6033)
 +Merged from 1.2:
 + * Allow cache-keys-to-save to be set at runtime (CASSANDRA-5980)
   * Avoid second-guessing out-of-space state (CASSANDRA-5605)
   * Tuning knobs for dealing with large blobs and many CFs (CASSANDRA-5982)
   * (Hadoop) Fix CQLRW for thrift tables (CASSANDRA-6002)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/810f0678/src/java/org/apache/cassandra/db/DataTracker.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/DataTracker.java
index 1a19fef,4fe0a5e..365d607
--- a/src/java/org/apache/cassandra/db/DataTracker.java
+++ b/src/java/org/apache/cassandra/db/DataTracker.java
@@@ -199,19 -188,20 +199,20 @@@ public class DataTracke
      }
  
      /**
 -     * Removes files from compacting status: this is different from 'markCompacted'
 +     * Removes files from compacting status: this is different from 'markObsolete'
       * because it should be run regardless of whether a compaction succeeded.
       */
 -    public void unmarkCompacting(Collection<SSTableReader> unmark)
 +    public void unmarkCompacting(Iterable<SSTableReader> unmark)
      {
-         if (!cfstore.isValid())
+         boolean isValid = cfstore.isValid();
+         if (!isValid)
          {
 -            // We don't know if the original compaction suceeded or failed, which makes it difficult to know
 -            // if the sstable reference has already been released.
 -            // A "good enough" approach is to mark the sstables involved compacted, which if compaction succeeded
 +            // The CF has been dropped.  We don't know if the original compaction suceeded or failed,
 +            // which makes it difficult to know if the sstable reference has already been released.
 +            // A "good enough" approach is to mark the sstables involved obsolete, which if compaction succeeded
              // is harmlessly redundant, and if it failed ensures that at least the sstable will get deleted on restart.
              for (SSTableReader sstable : unmark)
 -                sstable.markCompacted();
 +                sstable.markObsolete();
          }
  
          View currentView, newView;
@@@ -221,9 -211,17 +222,17 @@@
              newView = currentView.unmarkCompacting(unmark);
          }
          while (!view.compareAndSet(currentView, newView));
+ 
+         if (!isValid)
+         {
+             // when the CFS is invalidated, it will call unreferenceSSTables().  However, unreferenceSSTables only deals
+             // with sstables that aren't currently being compacted.  If there are ongoing compactions that finish or are
+             // interrupted after the CFS is invalidated, those sstables need to be unreferenced as well, so we do that here.
+             unreferenceSSTables();
+         }
      }
  
 -    public void markCompacted(Collection<SSTableReader> sstables, OperationType compactionType)
 +    public void markObsolete(Collection<SSTableReader> sstables, OperationType compactionType)
      {
          replace(sstables, Collections.<SSTableReader>emptyList());
          notifySSTablesChanged(sstables, Collections.<SSTableReader>emptyList(), compactionType);
@@@ -360,8 -360,13 +369,13 @@@
              long size = sstable.bytesOnDisk();
              StorageMetrics.load.dec(size);
              cfstore.metric.liveDiskSpaceUsed.dec(size);
+ 
+             // tolerateCompacted will be true when the CFS is no longer valid (dropped). If there were ongoing
+             // compactions when it was invalidated, sstables may already be marked compacted, so we should
+             // tolerate that (see CASSANDRA-5957)
 -            boolean firstToCompact = sstable.markCompacted();
 +            boolean firstToCompact = sstable.markObsolete();
-             assert firstToCompact : sstable + " was already marked compacted";
+             assert (tolerateCompacted || firstToCompact) : sstable + " was already marked compacted";
+ 
              sstable.releaseReference();
          }
      }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/810f0678/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/io/sstable/SSTableReader.java
index abd7c9f,ed221d9..cb0873d
--- a/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableReader.java
@@@ -1102,10 -1003,10 +1102,10 @@@ public class SSTableReader extends SSTa
       * When calling this function, the caller must ensure that the SSTableReader is not referenced anywhere
       * except for threads holding a reference.
       *
-      * @return true if the this is the first time the file was marked compacted.  Calling this
-      * multiple times would be buggy.
 -     * @return true if the this is the first time the file was marked compacted.  With rare exceptions
 -     * (see DataTracker.unmarkCompacted) calling this multiple times would be buggy.
++     * @return true if the this is the first time the file was marked obsolete.  Calling this
++     * multiple times is usually buggy (see exceptions in DataTracker.unmarkCompacting and removeOldSSTablesSize).
       */
 -    public boolean markCompacted()
 +    public boolean markObsolete()
      {
          if (logger.isDebugEnabled())
              logger.debug("Marking " + getFilename() + " compacted");


[08/11] git commit: Fix compaction race during columnfamily drop patch by Tyler Hobbs; reviewed by jbellis for CASSANDRA-5957

Posted by jb...@apache.org.
Fix compaction race during columnfamily drop
patch by Tyler Hobbs; reviewed by jbellis for CASSANDRA-5957


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d40f3c8d
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d40f3c8d
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d40f3c8d

Branch: refs/heads/cassandra-1.2
Commit: d40f3c8d7f826e88c4e2d23dfa2712b258b9857f
Parents: 1797b49
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Oct 14 10:35:10 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Oct 14 10:35:10 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/DataTracker.java    | 30 ++++++++++++++------
 2 files changed, 23 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d40f3c8d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 7f43031..53bc848 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -23,6 +23,7 @@
  * (Hadoop) Fetch no more than 128 splits in parallel (CASSANDRA-6169)
  * stress: add username/password authentication support (CASSANDRA-6068)
  * Fix indexed queries with row cache enabled on parent table (CASSANDRA-5732)
+ * Fix compaction race during columnfamily drop (CASSANDRA-5957)
 
 
 1.2.10

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d40f3c8d/src/java/org/apache/cassandra/db/DataTracker.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java
index b2f52a9..4fe0a5e 100644
--- a/src/java/org/apache/cassandra/db/DataTracker.java
+++ b/src/java/org/apache/cassandra/db/DataTracker.java
@@ -193,7 +193,8 @@ public class DataTracker
      */
     public void unmarkCompacting(Collection<SSTableReader> unmark)
     {
-        if (!cfstore.isValid())
+        boolean isValid = cfstore.isValid();
+        if (!isValid)
         {
             // We don't know if the original compaction suceeded or failed, which makes it difficult to know
             // if the sstable reference has already been released.
@@ -210,6 +211,14 @@ public class DataTracker
             newView = currentView.unmarkCompacting(unmark);
         }
         while (!view.compareAndSet(currentView, newView));
+
+        if (!isValid)
+        {
+            // when the CFS is invalidated, it will call unreferenceSSTables().  However, unreferenceSSTables only deals
+            // with sstables that aren't currently being compacted.  If there are ongoing compactions that finish or are
+            // interrupted after the CFS is invalidated, those sstables need to be unreferenced as well, so we do that here.
+            unreferenceSSTables();
+        }
     }
 
     public void markCompacted(Collection<SSTableReader> sstables, OperationType compactionType)
@@ -262,7 +271,7 @@ public class DataTracker
             return;
         }
         notifySSTablesChanged(notCompacting, Collections.<SSTableReader>emptySet(), OperationType.UNKNOWN);
-        postReplace(notCompacting, Collections.<SSTableReader>emptySet());
+        postReplace(notCompacting, Collections.<SSTableReader>emptySet(), true);
     }
 
     /**
@@ -305,7 +314,7 @@ public class DataTracker
     {
         if (!cfstore.isValid())
         {
-            removeOldSSTablesSize(replacements);
+            removeOldSSTablesSize(replacements, false);
             replacements = Collections.emptyList();
         }
 
@@ -317,13 +326,13 @@ public class DataTracker
         }
         while (!view.compareAndSet(currentView, newView));
 
-        postReplace(oldSSTables, replacements);
+        postReplace(oldSSTables, replacements, false);
     }
 
-    private void postReplace(Collection<SSTableReader> oldSSTables, Iterable<SSTableReader> replacements)
+    private void postReplace(Collection<SSTableReader> oldSSTables, Iterable<SSTableReader> replacements, boolean tolerateCompacted)
     {
         addNewSSTablesSize(replacements);
-        removeOldSSTablesSize(oldSSTables);
+        removeOldSSTablesSize(oldSSTables, tolerateCompacted);
     }
 
     private void addNewSSTablesSize(Iterable<SSTableReader> newSSTables)
@@ -341,7 +350,7 @@ public class DataTracker
         }
     }
 
-    private void removeOldSSTablesSize(Iterable<SSTableReader> oldSSTables)
+    private void removeOldSSTablesSize(Iterable<SSTableReader> oldSSTables, boolean tolerateCompacted)
     {
         for (SSTableReader sstable : oldSSTables)
         {
@@ -351,8 +360,13 @@ public class DataTracker
             long size = sstable.bytesOnDisk();
             StorageMetrics.load.dec(size);
             cfstore.metric.liveDiskSpaceUsed.dec(size);
+
+            // tolerateCompacted will be true when the CFS is no longer valid (dropped). If there were ongoing
+            // compactions when it was invalidated, sstables may already be marked compacted, so we should
+            // tolerate that (see CASSANDRA-5957)
             boolean firstToCompact = sstable.markCompacted();
-            assert firstToCompact : sstable + " was already marked compacted";
+            assert (tolerateCompacted || firstToCompact) : sstable + " was already marked compacted";
+
             sstable.releaseReference();
         }
     }


[02/11] git commit: Merge branch 'cassandra-1.2' into cassandra-2.0

Posted by jb...@apache.org.
Merge branch 'cassandra-1.2' into cassandra-2.0


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c9a906c4
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c9a906c4
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c9a906c4

Branch: refs/heads/trunk
Commit: c9a906c473d14f2c51a0541de4388e5dd64231ed
Parents: 3e7ebf8 4284d98
Author: Brandon Williams <br...@apache.org>
Authored: Sun Oct 13 17:52:36 2013 -0500
Committer: Brandon Williams <br...@apache.org>
Committed: Sun Oct 13 17:52:36 2013 -0500

----------------------------------------------------------------------
 .../org/apache/cassandra/cql3/statements/CreateUserStatement.java  | 2 +-
 .../org/apache/cassandra/cql3/statements/DropUserStatement.java    | 2 +-
 src/java/org/apache/cassandra/service/StorageProxy.java            | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c9a906c4/src/java/org/apache/cassandra/service/StorageProxy.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageProxy.java
index cac38a3,f195285..259d2f5
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@@ -736,14 -384,14 +736,14 @@@ public class StorageProxy implements St
          return responseHandler;
      }
  
-     // same as above except does not initiate writes (but does perfrom availability checks).
+     // same as above except does not initiate writes (but does perform availability checks).
      private static WriteResponseHandlerWrapper wrapResponseHandler(RowMutation mutation, ConsistencyLevel consistency_level, WriteType writeType)
      {
 -        AbstractReplicationStrategy rs = Table.open(mutation.getTable()).getReplicationStrategy();
 -        String table = mutation.getTable();
 +        AbstractReplicationStrategy rs = Keyspace.open(mutation.getKeyspaceName()).getReplicationStrategy();
 +        String keyspaceName = mutation.getKeyspaceName();
          Token tk = StorageService.getPartitioner().getToken(mutation.key());
 -        List<InetAddress> naturalEndpoints = StorageService.instance.getNaturalEndpoints(table, tk);
 -        Collection<InetAddress> pendingEndpoints = StorageService.instance.getTokenMetadata().pendingEndpointsFor(tk, table);
 +        List<InetAddress> naturalEndpoints = StorageService.instance.getNaturalEndpoints(keyspaceName, tk);
 +        Collection<InetAddress> pendingEndpoints = StorageService.instance.getTokenMetadata().pendingEndpointsFor(tk, keyspaceName);
          AbstractWriteResponseHandler responseHandler = rs.getWriteResponseHandler(naturalEndpoints, pendingEndpoints, consistency_level, null, writeType);
          return new WriteResponseHandlerWrapper(responseHandler, mutation);
      }


[06/11] git commit: Fix compaction race during columnfamily drop patch by Tyler Hobbs; reviewed by jbellis for CASSANDRA-5957

Posted by jb...@apache.org.
Fix compaction race during columnfamily drop
patch by Tyler Hobbs; reviewed by jbellis for CASSANDRA-5957


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d40f3c8d
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d40f3c8d
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d40f3c8d

Branch: refs/heads/cassandra-2.0
Commit: d40f3c8d7f826e88c4e2d23dfa2712b258b9857f
Parents: 1797b49
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Oct 14 10:35:10 2013 +0100
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Oct 14 10:35:10 2013 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/db/DataTracker.java    | 30 ++++++++++++++------
 2 files changed, 23 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d40f3c8d/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 7f43031..53bc848 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -23,6 +23,7 @@
  * (Hadoop) Fetch no more than 128 splits in parallel (CASSANDRA-6169)
  * stress: add username/password authentication support (CASSANDRA-6068)
  * Fix indexed queries with row cache enabled on parent table (CASSANDRA-5732)
+ * Fix compaction race during columnfamily drop (CASSANDRA-5957)
 
 
 1.2.10

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d40f3c8d/src/java/org/apache/cassandra/db/DataTracker.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/DataTracker.java b/src/java/org/apache/cassandra/db/DataTracker.java
index b2f52a9..4fe0a5e 100644
--- a/src/java/org/apache/cassandra/db/DataTracker.java
+++ b/src/java/org/apache/cassandra/db/DataTracker.java
@@ -193,7 +193,8 @@ public class DataTracker
      */
     public void unmarkCompacting(Collection<SSTableReader> unmark)
     {
-        if (!cfstore.isValid())
+        boolean isValid = cfstore.isValid();
+        if (!isValid)
         {
             // We don't know if the original compaction suceeded or failed, which makes it difficult to know
             // if the sstable reference has already been released.
@@ -210,6 +211,14 @@ public class DataTracker
             newView = currentView.unmarkCompacting(unmark);
         }
         while (!view.compareAndSet(currentView, newView));
+
+        if (!isValid)
+        {
+            // when the CFS is invalidated, it will call unreferenceSSTables().  However, unreferenceSSTables only deals
+            // with sstables that aren't currently being compacted.  If there are ongoing compactions that finish or are
+            // interrupted after the CFS is invalidated, those sstables need to be unreferenced as well, so we do that here.
+            unreferenceSSTables();
+        }
     }
 
     public void markCompacted(Collection<SSTableReader> sstables, OperationType compactionType)
@@ -262,7 +271,7 @@ public class DataTracker
             return;
         }
         notifySSTablesChanged(notCompacting, Collections.<SSTableReader>emptySet(), OperationType.UNKNOWN);
-        postReplace(notCompacting, Collections.<SSTableReader>emptySet());
+        postReplace(notCompacting, Collections.<SSTableReader>emptySet(), true);
     }
 
     /**
@@ -305,7 +314,7 @@ public class DataTracker
     {
         if (!cfstore.isValid())
         {
-            removeOldSSTablesSize(replacements);
+            removeOldSSTablesSize(replacements, false);
             replacements = Collections.emptyList();
         }
 
@@ -317,13 +326,13 @@ public class DataTracker
         }
         while (!view.compareAndSet(currentView, newView));
 
-        postReplace(oldSSTables, replacements);
+        postReplace(oldSSTables, replacements, false);
     }
 
-    private void postReplace(Collection<SSTableReader> oldSSTables, Iterable<SSTableReader> replacements)
+    private void postReplace(Collection<SSTableReader> oldSSTables, Iterable<SSTableReader> replacements, boolean tolerateCompacted)
     {
         addNewSSTablesSize(replacements);
-        removeOldSSTablesSize(oldSSTables);
+        removeOldSSTablesSize(oldSSTables, tolerateCompacted);
     }
 
     private void addNewSSTablesSize(Iterable<SSTableReader> newSSTables)
@@ -341,7 +350,7 @@ public class DataTracker
         }
     }
 
-    private void removeOldSSTablesSize(Iterable<SSTableReader> oldSSTables)
+    private void removeOldSSTablesSize(Iterable<SSTableReader> oldSSTables, boolean tolerateCompacted)
     {
         for (SSTableReader sstable : oldSSTables)
         {
@@ -351,8 +360,13 @@ public class DataTracker
             long size = sstable.bytesOnDisk();
             StorageMetrics.load.dec(size);
             cfstore.metric.liveDiskSpaceUsed.dec(size);
+
+            // tolerateCompacted will be true when the CFS is no longer valid (dropped). If there were ongoing
+            // compactions when it was invalidated, sstables may already be marked compacted, so we should
+            // tolerate that (see CASSANDRA-5957)
             boolean firstToCompact = sstable.markCompacted();
-            assert firstToCompact : sstable + " was already marked compacted";
+            assert (tolerateCompacted || firstToCompact) : sstable + " was already marked compacted";
+
             sstable.releaseReference();
         }
     }