Author: eevans
Date: Wed Dec 14 22:55:36 2011
New Revision: 1214527

URL: http://svn.apache.org/viewvc?rev=1214527&view=rev
Log:
use an LRU map for storage of prepared statements

Patch by eevans; reviewed by Rick Shaw for CASSANDRA-2475

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java?rev=1214527&r1=1214526&r2=1214527&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/ClientState.java Wed 
Dec 14 22:55:36 2011
@@ -20,6 +20,7 @@ package org.apache.cassandra.service;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -42,6 +43,7 @@ import org.apache.cassandra.thrift.Inval
  */
 public class ClientState
 {
+    private static final int MAX_CACHE_PREPARED = 50;   // Ridiculously large, 
right?
     private static Logger logger = LoggerFactory.getLogger(ClientState.class);
 
     // Current user for the session
@@ -50,8 +52,12 @@ public class ClientState
     // Reusable array for authorization
     private final List<Object> resource = new ArrayList<Object>();
 
-    // a map of prepared statements index by an integer
-    private Map<Integer,CQLStatement> prepared = new 
HashMap<Integer,CQLStatement>();
+    // An LRU map of prepared statements
+    private Map<Integer, CQLStatement> prepared = new HashMap<Integer, 
CQLStatement>() {
+        protected boolean removeEldestEntry(Map.Entry<Integer, CQLStatement> 
eldest) {
+            return size() > MAX_CACHE_PREPARED;
+        }
+    };
 
     private long clock;
 

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1214527&r1=1214526&r2=1214527&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java 
Wed Dec 14 22:55:36 2011
@@ -1254,8 +1254,11 @@ public class CassandraServer implements 
         if (logger.isDebugEnabled()) 
logger.debug("execute_prepared_cql_query");
         
         CQLStatement statement = state().getPrepared().get(itemId);
-        if (logger.isTraceEnabled()) logger.trace("Retreving prepared 
statement: #"+ itemId + " count:"+state().getPrepared().size());
-        
+
+        if (statement == null)
+            throw new InvalidRequestException(String.format("Prepared query 
with ID %d not found", itemId));
+        logger.trace("Retrieved prepared statement #{} with {} bind markers", 
itemId, state().getPrepared().size());
+
         return QueryProcessor.processPrepared(statement, state(), 
bindVariables);
     }
 


Reply via email to