Repository: cassandra
Updated Branches:
  refs/heads/trunk 1a7db7ae0 -> efa8efad4


Warn when evicting prepared statements from cache

patch by Robbie Strickland; reviewed by Aleksey Yeschenko for
CASSANDRA-7930


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

Branch: refs/heads/trunk
Commit: e1bc6b4a4594083b7e875d1a296402981f26e7d0
Parents: aa8964a
Author: Robbie Strickland <rostrickl...@gmail.com>
Authored: Thu Sep 18 16:41:49 2014 -0700
Committer: Aleksey Yeschenko <alek...@apache.org>
Committed: Thu Sep 18 16:41:49 2014 -0700

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +-
 .../apache/cassandra/cql3/QueryProcessor.java   | 23 ++++++++++++++++----
 2 files changed, 20 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/e1bc6b4a/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e7e1361..527b4e9 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,6 @@
 2.1.1
  * (cqlsh) Add command line option for cqlshrc file path (CASSANDRA-7131)
- * Provide visibility into prepared statements churn (CASSANDRA-7921)
+ * Provide visibility into prepared statements churn (CASSANDRA-7921, 
CASSANDRA-7930)
  * Invalidate prepared statements when their keyspace or table is
    dropped (CASSANDRA-7566)
  * cassandra-stress: fix support for NetworkTopologyStrategy (CASSANDRA-7945)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/e1bc6b4a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java 
b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
index 8744db4..9a09d42 100644
--- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
@@ -21,6 +21,8 @@ import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
@@ -29,8 +31,6 @@ import 
com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
 import com.googlecode.concurrentlinkedhashmap.EntryWeigher;
 import com.googlecode.concurrentlinkedhashmap.EvictionListener;
 import org.antlr.runtime.*;
-import org.apache.cassandra.service.IMigrationListener;
-import org.apache.cassandra.service.MigrationManager;
 import org.github.jamm.MemoryMeter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,8 +41,7 @@ import org.apache.cassandra.db.composites.*;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.metrics.CQLMetrics;
-import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.service.*;
 import org.apache.cassandra.service.pager.QueryPager;
 import org.apache.cassandra.service.pager.QueryPagers;
 import org.apache.cassandra.thrift.ThriftClientState;
@@ -90,6 +89,8 @@ public class QueryProcessor implements QueryHandler
     @VisibleForTesting
     public static final CQLMetrics metrics = new CQLMetrics();
 
+    private static AtomicInteger lastMinuteEvictionsCount = new 
AtomicInteger(0);
+
     static
     {
         preparedStatements = new ConcurrentLinkedHashMap.Builder<MD5Digest, 
ParsedStatement.Prepared>()
@@ -100,6 +101,7 @@ public class QueryProcessor implements QueryHandler
                                  public void onEviction(MD5Digest md5Digest, 
ParsedStatement.Prepared prepared)
                                  {
                                      metrics.preparedStatementsEvicted.inc();
+                                     
lastMinuteEvictionsCount.incrementAndGet();
                                  }
                              }).build();
 
@@ -111,6 +113,7 @@ public class QueryProcessor implements QueryHandler
                                        public void onEviction(Integer integer, 
CQLStatement cqlStatement)
                                        {
                                            
metrics.preparedStatementsEvicted.inc();
+                                           
lastMinuteEvictionsCount.incrementAndGet();
                                        }
                                    })
                                    .build();
@@ -152,6 +155,18 @@ public class QueryProcessor implements QueryHandler
     private QueryProcessor()
     {
         MigrationManager.instance.register(new MigrationSubscriber());
+
+        StorageService.scheduledTasks.scheduleAtFixedRate(new Runnable()
+        {
+            public void run()
+            {
+                long count = lastMinuteEvictionsCount.getAndSet(0);
+                if (count > 0)
+                    logger.info("{} prepared statements discarded in the last 
minute because cache limit reached ({} bytes)",
+                                count,
+                                MAX_CACHE_PREPARED_MEMORY);
+            }
+        }, 1, 1, TimeUnit.MINUTES);
     }
 
     public ParsedStatement.Prepared getPrepared(MD5Digest id)

Reply via email to