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/52b4fc39
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/52b4fc39
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/52b4fc39

Branch: refs/heads/cassandra-2.0
Commit: 52b4fc393350e85f44034094f323f2f06a347968
Parents: fb55849 2267c20
Author: Jonathan Ellis <jbel...@apache.org>
Authored: Mon Sep 23 13:33:38 2013 -0500
Committer: Jonathan Ellis <jbel...@apache.org>
Committed: Mon Sep 23 13:33:38 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 conf/cassandra.yaml                             |  5 ++++
 .../org/apache/cassandra/config/Config.java     |  2 ++
 .../cassandra/config/DatabaseDescriptor.java    | 14 +++++++++
 .../apache/cassandra/db/ColumnFamilyStore.java  | 31 ++++++++++++++++----
 .../cassandra/db/ColumnFamilyStoreMBean.java    |  9 ++++++
 .../cassandra/db/filter/SliceQueryFilter.java   | 20 +++++++++----
 .../cassandra/metrics/ColumnFamilyMetrics.java  |  8 +++++
 .../cassandra/service/StorageService.java       | 10 +++++++
 .../cassandra/service/StorageServiceMBean.java  |  5 ++++
 10 files changed, 93 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 88daf35,9ed00e2..aef45ba
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -7,43 -3,10 +7,44 @@@ Merged from 1.2
   * Allow where clause conditions to be in parenthesis (CASSANDRA-6037)
   * Do not open non-ssl storage port if encryption option is all 
(CASSANDRA-3916)
   * Improve memory usage of metadata min/max column names (CASSANDRA-6077)
+  * Add tombstone debug threshold and histogram (CASSANDRA-6042, 6057)
  
  
 -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/52b4fc39/conf/cassandra.yaml
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/config/Config.java
index 392e8c3,292161b..131c9ef
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@@ -177,8 -173,11 +177,10 @@@ public class Confi
  
      public String memtable_allocator = "SlabAllocator";
  
 -    private static boolean loadYaml = true;
      private static boolean outboundBindAny = false;
  
+     public volatile int tombstone_debug_threshold = 10000;
+ 
      public static boolean getOutboundBindAny()
      {
          return outboundBindAny;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 1ff4832,a41c157..ec9570a
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@@ -28,11 -28,9 +28,12 @@@ import java.util.concurrent.atomic.Atom
  import java.util.regex.Pattern;
  import javax.management.*;
  
 +import com.google.common.annotations.VisibleForTesting;
 +import com.google.common.base.Function;
  import com.google.common.collect.*;
  import com.google.common.util.concurrent.Futures;
 +import com.google.common.util.concurrent.Uninterruptibles;
+ import org.cliffc.high_scale_lib.NonBlockingHashMap;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -48,12 -45,11 +49,8 @@@ import org.apache.cassandra.config.Sche
  import org.apache.cassandra.db.columniterator.OnDiskAtomIterator;
  import org.apache.cassandra.db.commitlog.CommitLog;
  import org.apache.cassandra.db.commitlog.ReplayPosition;
 -import org.apache.cassandra.db.compaction.AbstractCompactionStrategy;
 -import org.apache.cassandra.db.compaction.CompactionManager;
 -import org.apache.cassandra.db.compaction.LeveledCompactionStrategy;
 -import org.apache.cassandra.db.compaction.OperationType;
 +import org.apache.cassandra.db.compaction.*;
- import org.apache.cassandra.db.filter.ColumnSlice;
- import org.apache.cassandra.db.filter.ExtendedFilter;
- import org.apache.cassandra.db.filter.IDiskAtomFilter;
- import org.apache.cassandra.db.filter.QueryFilter;
- import org.apache.cassandra.db.filter.SliceQueryFilter;
+ import org.apache.cassandra.db.filter.*;
  import org.apache.cassandra.db.index.SecondaryIndex;
  import org.apache.cassandra.db.index.SecondaryIndexManager;
  import org.apache.cassandra.db.marshal.AbstractType;
@@@ -1296,10 -1213,18 +1292,17 @@@ public class ColumnFamilyStore implemen
                  if (cf == null)
                      return null;
  
 -                // TODO this is necessary because when we collate 
supercolumns together, we don't check
 -                // their subcolumns for relevance, so we need to do a second 
prune post facto here.
 -                result = cf.isSuper() ? removeDeleted(cf, gcBefore) : 
removeDeletedCF(cf, gcBefore);
 -
 +                result = removeDeletedCF(cf, gcBefore);
              }
  
 +            removeDroppedColumns(result);
++
+             if (filter.filter instanceof SliceQueryFilter)
+             {
+                 // Log the number of tombstones scanned on single key queries
+                 metric.tombstoneScannedHistogram.update(((SliceQueryFilter) 
filter.filter).lastIgnored());
+                 metric.liveScannedHistogram.update(((SliceQueryFilter) 
filter.filter).lastLive());
+             }
          }
          finally
          {
@@@ -2164,15 -1901,32 +2167,31 @@@
  
      private void validateCompactionThresholds(int minThreshold, int 
maxThreshold)
      {
 -        if (minThreshold > maxThreshold && maxThreshold != 0)
 +        if (minThreshold > maxThreshold)
              throw new RuntimeException(String.format("The 
min_compaction_threshold cannot be larger than the max_compaction_threshold. " +
                                                       "Min is '%d', Max is 
'%d'.", minThreshold, maxThreshold));
 -    }
  
 -    public boolean isCompactionDisabled()
 -    {
 -        return getMinimumCompactionThreshold() <= 0 || 
getMaximumCompactionThreshold() <= 0;
 +        if (maxThreshold == 0 || minThreshold == 0)
 +            throw new RuntimeException("Disabling compaction by setting 
min_compaction_threshold or max_compaction_threshold to 0 " +
 +                    "is deprecated, set the compaction strategy option 
'enabled' to 'false' instead or use the nodetool command 
'disableautocompaction'.");
      }
  
+     public long getTombstonesPerLastRead()
+     {
+         return metric.tombstoneScannedHistogram.count();
+     }
+ 
+     public float getPercentageTombstonesPerLastRead()
+     {
+         long total = metric.tombstoneScannedHistogram.count() + 
metric.liveScannedHistogram.count();
+         return (metric.tombstoneScannedHistogram.count() / total);
+     }
+ 
+     public long getLiveCellsPerLastRead()
+     {
+         return metric.liveScannedHistogram.count();
+     }
+ 
      // End JMX get/set.
  
      public long estimateKeys()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
index e810dc6,f937032..6105714
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
@@@ -281,8 -281,20 +281,17 @@@ public interface ColumnFamilyStoreMBea
       */
      public void setCrcCheckChance(double crcCheckChance);
  
 -    /**
 -     * Disable automatic compaction.
 -     */
 -    public void disableAutoCompaction();
 +    public boolean isAutoCompactionDisabled();
  
+     /** Number of tombstoned cells retreived during the last slicequery */
+     public long getTombstonesPerLastRead();
+ 
+     /** Percentage of tombstoned cells retreived during the last slicequery */
+     public float getPercentageTombstonesPerLastRead();
+ 
+     /** Number of live cells retreived during the last slicequery */
+     public long getLiveCellsPerLastRead();
+ 
      public long estimateKeys();
  
      /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
index 11d7438,7e1ec6b..443ff8e
--- a/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
@@@ -21,17 -21,16 +21,13 @@@ import java.io.DataInput
  import java.io.DataOutput;
  import java.io.IOException;
  import java.nio.ByteBuffer;
- import java.util.Arrays;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Comparator;
- import java.util.Iterator;
- import java.util.List;
+ import java.util.*;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
+ import org.apache.cassandra.config.DatabaseDescriptor;
  import org.apache.cassandra.db.*;
 -import org.apache.cassandra.db.columniterator.ISSTableColumnIterator;
  import org.apache.cassandra.db.columniterator.OnDiskAtomIterator;
  import org.apache.cassandra.db.columniterator.SSTableSliceIterator;
  import org.apache.cassandra.db.marshal.AbstractType;
@@@ -202,48 -175,62 +198,50 @@@ public class SliceQueryFilter implement
          }
  
          Tracing.trace("Read {} live and {} tombstoned cells", 
columnCounter.live(), columnCounter.ignored());
+         if (columnCounter.ignored() > 
DatabaseDescriptor.getTombstoneDebugThreshold())
+             logger.debug("Read {} live and {} tombstoned cells", 
columnCounter.live(), columnCounter.ignored());
      }
  
 -    public int getLiveCount(ColumnFamily cf)
 +    public int getLiveCount(ColumnFamily cf, long now)
      {
 -        ColumnCounter counter = getColumnCounter(cf);
 -        for (IColumn column : cf)
 -            counter.count(column, cf);
 -        return counter.live();
 +        return columnCounter(cf.getComparator(), now).countAll(cf).live();
      }
  
 -    private ColumnCounter getColumnCounter(IColumnContainer container)
 +    public ColumnCounter columnCounter(AbstractType<?> comparator, long now)
      {
 -        AbstractType<?> comparator = container.getComparator();
          if (compositesToGroup < 0)
 -            return new ColumnCounter();
 +            return new ColumnCounter(now);
          else if (compositesToGroup == 0)
 -            return new ColumnCounter.GroupByPrefix(null, 0);
 +            return new ColumnCounter.GroupByPrefix(now, null, 0);
          else
 -            return new ColumnCounter.GroupByPrefix((CompositeType)comparator, 
compositesToGroup);
 +            return new ColumnCounter.GroupByPrefix(now, 
(CompositeType)comparator, compositesToGroup);
      }
  
 -    public void trim(ColumnFamily cf, int trimTo)
 +    public void trim(ColumnFamily cf, int trimTo, long now)
      {
 -        ColumnCounter counter = getColumnCounter(cf);
 +        ColumnCounter counter = columnCounter(cf.getComparator(), now);
  
 -        Collection<ByteBuffer> toRemove = null;
 -        boolean trimRemaining = false;
 +        Collection<Column> columns = reversed
 +                                   ? cf.getReverseSortedColumns()
 +                                   : cf.getSortedColumns();
  
 -        Collection<IColumn> columns = reversed
 -                                    ? cf.getReverseSortedColumns()
 -                                    : cf.getSortedColumns();
 +        DeletionInfo.InOrderTester tester = 
cf.deletionInfo().inOrderTester(reversed);
  
 -        for (IColumn column : columns)
 +        for (Iterator<Column> iter = columns.iterator(); iter.hasNext(); )
          {
 -            if (trimRemaining)
 -            {
 -                toRemove.add(column.name());
 -                continue;
 -            }
 +            Column column = iter.next();
 +            counter.count(column, tester);
  
 -            counter.count(column, cf);
              if (counter.live() > trimTo)
              {
 -                toRemove = new HashSet<ByteBuffer>();
 -                toRemove.add(column.name());
 -                trimRemaining = true;
 +                iter.remove();
 +                while (iter.hasNext())
 +                {
 +                    iter.next();
 +                    iter.remove();
 +                }
              }
          }
 -
 -        if (toRemove != null)
 -        {
 -            for (ByteBuffer columnName : toRemove)
 -                cf.remove(columnName);
 -        }
      }
  
      public ByteBuffer start()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
index 0f9f87d,9bd90a9..b63bbfb
--- a/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ColumnFamilyMetrics.java
@@@ -334,7 -337,8 +340,9 @@@ public class ColumnFamilyMetric
          
Metrics.defaultRegistry().removeMetric(factory.createMetricName("RecentBloomFilterFalseRatio"));
          
Metrics.defaultRegistry().removeMetric(factory.createMetricName("BloomFilterDiskSpaceUsed"));
          
Metrics.defaultRegistry().removeMetric(factory.createMetricName("KeyCacheHitRate"));
 +        
Metrics.defaultRegistry().removeMetric(factory.createMetricName("SpeculativeRetry"));
+         
Metrics.defaultRegistry().removeMetric(factory.createMetricName("TombstoneScannedHistogram"));
+         
Metrics.defaultRegistry().removeMetric(factory.createMetricName("LiveScannedHistogram"));
      }
  
      class ColumnFamilyMetricNameFactory implements MetricNameFactory

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/52b4fc39/src/java/org/apache/cassandra/service/StorageServiceMBean.java
----------------------------------------------------------------------

Reply via email to