You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@directmemory.apache.org by Maurizio Cucchiara <mc...@apache.org> on 2012/01/08 18:57:39 UTC
Re: svn commit: r1228898 - in /incubator/directmemory/trunk/examples/src:
main/java/org/apache/directmemory/examples/solr/ test/java/org/apache/directmemory/examples/solr/
test/resources/solr/config/
Ciao Tommaso,
sorry if I bother you, I don't want become that kind of person, but I have
to tell you that recently we reach a sort of consensus for the code
formatting style http://goo.gl/qFd4n
Please could you set your ide up to use the maven code style?
TIA
Twitter :http://www.twitter.com/m_cucchiara
G+ :https://plus.google.com/107903711540963855921
Linkedin :http://www.linkedin.com/in/mauriziocucchiara
Maurizio Cucchiara
On 8 January 2012 18:16, <to...@apache.org> wrote:
> Author: tommaso
> Date: Sun Jan 8 17:16:00 2012
> New Revision: 1228898
>
> URL: http://svn.apache.org/viewvc?rev=1228898&view=rev
> Log:
> [DIRECTMEMORY-59] - fixed statistics issue and added unit testing for it
>
> Added:
>
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> Modified:
>
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
>
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
>
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
>
> Modified:
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> URL:
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java?rev=1228898&r1=1228897&r2=1228898&view=diff
>
> ==============================================================================
> ---
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> (original)
> +++
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> Sun Jan 8 17:16:00 2012
> @@ -1,5 +1,3 @@
> -package org.apache.directmemory.examples.solr;
> -
> /*
> * Licensed to the Apache Software Foundation (ASF) under one
> * or more contributor license agreements. See the NOTICE file
> @@ -18,8 +16,11 @@ package org.apache.directmemory.examples
> * specific language governing permissions and limitations
> * under the License.
> */
> +package org.apache.directmemory.examples.solr;
>
> import org.apache.directmemory.cache.Cache;
> +import org.apache.directmemory.cache.CacheService;
> +import org.apache.directmemory.measures.Monitor;
> import org.apache.directmemory.measures.Ram;
> import org.apache.solr.common.util.NamedList;
> import org.apache.solr.common.util.SimpleOrderedMap;
> @@ -37,11 +38,9 @@ import java.util.concurrent.atomic.Atomi
> * A {@link SolrCache} based on Apache DirectMemory
> */
> public class SolrOffHeapCache<K, V>
> - implements SolrCache<K, V>
> -{
> + implements SolrCache<K, V> {
>
> - private static class CumulativeStats
> - {
> + private static class CumulativeStats {
> AtomicLong lookups = new AtomicLong();
>
> AtomicLong hits = new AtomicLong();
> @@ -74,32 +73,32 @@ public class SolrOffHeapCache<K, V>
> private String description = "DM Cache";
>
> @Override
> - public Object init( Map args, Object persistence, CacheRegenerator
> regenerator )
> - {
> - Object buffers = args.get( "buffers" );
> - String size = String.valueOf( args.get( "size" ) );
> - Cache.init( buffers != null ? Integer.valueOf( String.valueOf(
> buffers ) ) : 1,
> - Ram.Mb( Double.valueOf( size ) / 512 ) );
> + public Object init(Map args, Object persistence, CacheRegenerator
> regenerator) {
> + Object buffers = args.get("buffers");
> + String size = String.valueOf(args.get("size"));
> + Integer capacity =
> Integer.parseInt(String.valueOf(args.get("initialSize")));
> + Cache.init(buffers != null ?
> Integer.valueOf(String.valueOf(buffers)) : 1,
> + Ram.Mb(Double.valueOf(size) / 512),
> + Ram.Mb(Double.valueOf(capacity) / 512),
> + CacheService.DEFAULT_CONCURRENCY_LEVEL);
>
> state = State.CREATED;
> this.regenerator = regenerator;
> - name = (String) args.get( "name" );
> + name = (String) args.get("name");
> String str = size;
> - final int limit = str == null ? 1024 : Integer.parseInt( str );
> - str = (String) args.get( "initialSize" );
> - final int initialSize = Math.min( str == null ? 1024 :
> Integer.parseInt( str ), limit );
> - str = (String) args.get( "autowarmCount" );
> - autowarmCount = str == null ? 0 : Integer.parseInt( str );
> + final int limit = str == null ? 1024 : Integer.parseInt(str);
> + str = (String) args.get("initialSize");
> + final int initialSize = Math.min(str == null ? 1024 :
> Integer.parseInt(str), limit);
> + str = (String) args.get("autowarmCount");
> + autowarmCount = str == null ? 0 : Integer.parseInt(str);
>
> description = "Solr OffHeap Cache(maxSize=" + limit + ",
> initialSize=" + initialSize;
> - if ( autowarmCount > 0 )
> - {
> + if (autowarmCount > 0) {
> description += ", autowarmCount=" + autowarmCount + ",
> regenerator=" + regenerator;
> }
> description += ')';
>
> - if ( persistence == null )
> - {
> + if (persistence == null) {
> // must be the first time a cache of this type is being created
> persistence = new CumulativeStats();
> }
> @@ -110,138 +109,140 @@ public class SolrOffHeapCache<K, V>
> }
>
> @Override
> - public String name()
> - {
> + public String name() {
> return name;
> }
>
> @Override
> - public int size()
> - {
> - return Long.valueOf( Cache.entries() ).intValue();
> + public int size() {
> + return Long.valueOf(Cache.entries()).intValue();
> }
>
> @Override
> - public V put( K key, V value )
> - {
> - return (V) Cache.put( String.valueOf( key ), value );
> + public V put(K key, V value) {
> + synchronized (this) {
> + if (state == State.LIVE) {
> + stats.inserts.incrementAndGet();
> + }
> +
> + inserts++;
> + return (V) Cache.put(String.valueOf(key), value);
> + }
> }
>
> @Override
> - public V get( K key )
> - {
> - return (V) Cache.retrieve( String.valueOf( key ) );
> + public V get(K key) {
> + synchronized (this) {
> + V val = (V) Cache.retrieve(String.valueOf(key));
> + if (state == State.LIVE) {
> + // only increment lookups and hits if we are live.
> + lookups++;
> + stats.lookups.incrementAndGet();
> + if (val != null) {
> + hits++;
> + stats.hits.incrementAndGet();
> + }
> + }
> + return val;
> + }
> }
>
> @Override
> - public void clear()
> - {
> - synchronized ( this )
> - {
> + public void clear() {
> + synchronized (this) {
> Cache.clear();
> }
> }
>
> @Override
> - public void setState( State state )
> - {
> + public void setState(State state) {
> this.state = state;
> }
>
> @Override
> - public State getState()
> - {
> + public State getState() {
> return state;
> }
>
> @Override
> - public void warm( SolrIndexSearcher searcher, SolrCache<K, V> old )
> - throws IOException
> - {
> + public void warm(SolrIndexSearcher searcher, SolrCache<K, V> old)
> + throws IOException {
> // it looks like there is no point in warming an off heap item
> }
>
> @Override
> - public void close()
> - {
> + public void close() {
> + Cache.dump();
> + Monitor.dump();
> }
>
> @Override
> - public String getName()
> - {
> + public String getName() {
> return SolrOffHeapCache.class.getName();
> }
>
> @Override
> - public String getVersion()
> - {
> + public String getVersion() {
> return SolrCore.version;
> }
>
> - public String getDescription()
> - {
> + public String getDescription() {
> return description;
> }
>
> - public Category getCategory()
> - {
> + public Category getCategory() {
> return Category.CACHE;
> }
>
> @Override
> - public String getSourceId()
> - {
> + public String getSourceId() {
> return null;
> }
>
> @Override
> - public String getSource()
> - {
> + public String getSource() {
> return null;
> }
>
> @Override
> - public URL[] getDocs()
> - {
> + public URL[] getDocs() {
> return new URL[0];
> }
>
> - public NamedList getStatistics()
> - {
> + public NamedList getStatistics() {
> NamedList lst = new SimpleOrderedMap();
> - synchronized ( this )
> - {
> - lst.add( "lookups", lookups );
> - lst.add( "hits", hits );
> - lst.add( "hitratio", calcHitRatio( lookups, hits ) );
> - lst.add( "inserts", inserts );
> - lst.add( "evictions", evictions );
> - lst.add( "size", Cache.entries() );
> + synchronized (this) {
> + lst.add("lookups", lookups);
> + lst.add("hits", hits);
> + lst.add("hitratio", calcHitRatio(lookups, hits));
> + lst.add("inserts", inserts);
> + lst.add("evictions", evictions);
> + lst.add("size", Cache.entries());
> }
>
> - lst.add( "warmupTime", warmupTime );
> + lst.add("warmupTime", warmupTime);
>
> long clookups = stats.lookups.get();
> long chits = stats.hits.get();
> - lst.add( "cumulative_lookups", clookups );
> - lst.add( "cumulative_hits", chits );
> - lst.add( "cumulative_hitratio", calcHitRatio( clookups, chits ) );
> - lst.add( "cumulative_inserts", stats.inserts.get() );
> - lst.add( "cumulative_evictions", stats.evictions.get() );
> + lst.add("cumulative_lookups", clookups);
> + lst.add("cumulative_hits", chits);
> + lst.add("cumulative_hitratio", calcHitRatio(clookups, chits));
> + lst.add("cumulative_inserts", stats.inserts.get());
> + lst.add("cumulative_evictions", stats.evictions.get());
>
> return lst;
> }
>
> - private Object calcHitRatio( long clookups, long chits )
> - {
> - int ones = (int) ( hits * 100 / lookups );
> - int tenths = (int) ( hits * 1000 / lookups ) - ones * 10;
> - return Integer.toString( ones ) + '.' + tenths;
> + private Object calcHitRatio(long clookups, long chits) {
> + if (lookups == 0) return "0.00";
> + if (lookups == hits) return "1.00";
> + int hundredths = (int) (hits * 100 / lookups); // rounded down
> + if (hundredths < 10) return "0.0" + hundredths;
> + return "0." + hundredths;
> }
>
> @Override
> - public String toString()
> - {
> + public String toString() {
> return name + getStatistics().toString();
> }
> }
>
> Added:
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> URL:
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java?rev=1228898&view=auto
>
> ==============================================================================
> ---
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> (added)
> +++
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> Sun Jan 8 17:16:00 2012
> @@ -0,0 +1,87 @@
> +/**
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements. See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * The ASF licenses this file to You under the Apache License, Version 2.0
> + * (the "License"); you may not use this file except in compliance with
> + * the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing, software
> + * distributed under the License is distributed on an "AS IS" BASIS,
> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.directmemory.examples.solr;
> +
> +import org.apache.lucene.search.MatchAllDocsQuery;
> +import org.apache.lucene.search.Query;
> +import org.apache.lucene.search.Sort;
> +import org.apache.solr.common.util.NamedList;
> +import org.apache.solr.search.QueryResultKey;
> +import org.apache.solr.search.function.DocValues;
> +import org.junit.After;
> +import org.junit.Before;
> +import org.junit.Test;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +import java.util.Map;
> +
> +import static org.junit.Assert.*;
> +
> +/**
> + * Testcase for {@link SolrOffHeapCache}
> + */
> +public class SolrOffHeapCacheTest {
> +
> + private SolrOffHeapCache solrOffHeapCache;
> +
> + @Before
> + public void setUp() {
> + solrOffHeapCache = new SolrOffHeapCache();
> + Map<String, String> args = new HashMap<String, String>();
> + args.put("size", "10000");
> + args.put("initialSize", "1000");
> + solrOffHeapCache.init(args, null, null);
> + }
> +
> + @After
> + public void tearDown() {
> + solrOffHeapCache.clear();
> + solrOffHeapCache.close();
> + }
> +
> + @Test
> + public void testStatisticsWhenCacheNotUsedYet() {
> + try {
> + NamedList stats = solrOffHeapCache.getStatistics();
> + assertNotNull(stats);
> + assertEquals(0l, stats.get("lookups"));
> + assertEquals(0l, stats.get("evictions"));
> + assertEquals(0l, stats.get("hits"));
> + assertEquals(0l, stats.get("inserts"));
> + } catch (Exception e) {
> + fail(e.getLocalizedMessage());
> + }
> + }
> +
> + @Test
> + public void testPut() {
> + try {
> + QueryResultKey queryResultKey = new QueryResultKey(new
> MatchAllDocsQuery(), new ArrayList<Query>(), new Sort(), 1);
> + DocValues docValues = new DocValues() {
> + @Override
> + public String toString(int doc) {
> + return doc + "asd";
> + }
> + };
> + solrOffHeapCache.put(queryResultKey, docValues);
> + } catch (Exception e) {
> + e.printStackTrace();
> + fail(e.getLocalizedMessage());
> + }
> + }
> +}
>
> Modified:
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> URL:
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java?rev=1228898&r1=1228897&r2=1228898&view=diff
>
> ==============================================================================
> ---
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> (original)
> +++
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> Sun Jan 8 17:16:00 2012
> @@ -19,7 +19,8 @@ package org.apache.directmemory.examples
> import org.apache.directmemory.cache.Cache;
> import org.apache.solr.request.LocalSolrQueryRequest;
> import org.apache.solr.util.TestHarness;
> -import org.junit.Before;
> +import org.junit.AfterClass;
> +import org.junit.BeforeClass;
> import org.junit.Test;
>
> import static org.junit.Assert.assertTrue;
> @@ -27,41 +28,39 @@ import static org.junit.Assert.fail;
>
> /**
> */
> -public class SolrOffHeapIntegrationTest
> -{
> - private TestHarness h;
> -
> - @Before
> - public void setUp()
> - {
> +public class SolrOffHeapIntegrationTest {
> + private static TestHarness h;
> +
> + @BeforeClass
> + public static void setUp() {
> String data = "target/data/expand";
> - String config = this.getClass().getResource(
> "/solr/config/solrconfig.xml" ).getFile();
> - String schema = this.getClass().getResource(
> "/solr/config/schema.xml" ).getFile();
> - this.h = new TestHarness( data, config, schema );
> + String config =
> SolrOffHeapCache.class.getResource("/solr/config/solrconfig.xml").getFile();
> + String schema =
> SolrOffHeapCache.class.getResource("/solr/config/schema.xml").getFile();
> + h = new TestHarness(data, config, schema);
> + }
> +
> + @AfterClass
> + public static void tearDown() {
> + Cache.clear();
> }
>
> @Test
> - public void testSimpleQuery()
> - {
> - try
> - {
> + public void testSimpleQuery() {
> + try {
> // add a doc to Solr
> - h.validateAddDoc( "id", "1", "text", "something is happening
> here" );
> + h.validateAddDoc("id", "1", "text", "something is happening
> here");
>
> // make the query
> - LocalSolrQueryRequest request = h.getRequestFactory(
> "standard", 0, 100 ).makeRequest( "q", "something" );
> - String response = h.query( "standard", request );
> - assertTrue( response != null );
> - assertTrue( !response.contains( "error" ) );
> + LocalSolrQueryRequest request =
> h.getRequestFactory("standard", 0, 10).makeRequest("q", "something");
> + String response = h.query("standard", request);
> + assertTrue(response != null);
> + assertTrue(!response.contains("error"));
>
> // check the cache has been hit
> - assertTrue( Cache.entries() > 0 );
> + assertTrue(Cache.entries() > 0);
>
> - }
> - catch ( Throwable e )
> - {
> - e.printStackTrace();
> - fail( e.getLocalizedMessage() );
> + } catch (Throwable e) {
> + fail(e.getLocalizedMessage());
> }
> }
> }
>
> Modified:
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> URL:
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml?rev=1228898&r1=1228897&r2=1228898&view=diff
>
> ==============================================================================
> ---
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> (original)
> +++
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> Sun Jan 8 17:16:00 2012
> @@ -66,7 +66,7 @@
> cause a serious error to be logged if it can't be loaded. <lib
> path="../a-jar-that-does-not-exist.jar" />
> -->
> -
> + <luceneMatchVersion>LUCENE_35</luceneMatchVersion>
>
> <!--
> Used to specify an alternate directory to hold all index data other
> @@ -360,8 +360,8 @@
> for each document). Since Lucene internal document ids are
> transient, this cache will not be autowarmed.
> -->
> - <queryResultCache
> class="org.apache.directmemory.examples.solr.SolrOffHeapCache" size="512"
> - initialSize="512" autowarmCount="0" buffers="10"/>
> + <queryResultCache
> class="org.apache.directmemory.examples.solr.SolrOffHeapCache" size="10000"
> + initialSize="1000" autowarmCount="0" buffers="2"/>
>
> <!--
> If true, stored fields that are not requested will be loaded
>
>
>
Re: svn commit: r1228898 - in /incubator/directmemory/trunk/examples/src:
main/java/org/apache/directmemory/examples/solr/ test/java/org/apache/directmemory/examples/solr/
test/resources/solr/config/
Posted by Tommaso Teofili <to...@gmail.com>.
Hi Maurizio,
sure, no problem, my fault for having missed that.
I'll fix it.
Tommaso
2012/1/8 Maurizio Cucchiara <mc...@apache.org>
> Ciao Tommaso,
> sorry if I bother you, I don't want become that kind of person, but I have
> to tell you that recently we reach a sort of consensus for the code
> formatting style http://goo.gl/qFd4n
> Please could you set your ide up to use the maven code style?
> TIA
>
> Twitter :http://www.twitter.com/m_cucchiara
> G+ :https://plus.google.com/107903711540963855921
> Linkedin :http://www.linkedin.com/in/mauriziocucchiara
>
> Maurizio Cucchiara
>
>
> On 8 January 2012 18:16, <to...@apache.org> wrote:
>
> > Author: tommaso
> > Date: Sun Jan 8 17:16:00 2012
> > New Revision: 1228898
> >
> > URL: http://svn.apache.org/viewvc?rev=1228898&view=rev
> > Log:
> > [DIRECTMEMORY-59] - fixed statistics issue and added unit testing for it
> >
> > Added:
> >
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> > Modified:
> >
> >
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> >
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> >
> >
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> >
> > Modified:
> >
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> > URL:
> >
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java?rev=1228898&r1=1228897&r2=1228898&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> > (original)
> > +++
> >
> incubator/directmemory/trunk/examples/src/main/java/org/apache/directmemory/examples/solr/SolrOffHeapCache.java
> > Sun Jan 8 17:16:00 2012
> > @@ -1,5 +1,3 @@
> > -package org.apache.directmemory.examples.solr;
> > -
> > /*
> > * Licensed to the Apache Software Foundation (ASF) under one
> > * or more contributor license agreements. See the NOTICE file
> > @@ -18,8 +16,11 @@ package org.apache.directmemory.examples
> > * specific language governing permissions and limitations
> > * under the License.
> > */
> > +package org.apache.directmemory.examples.solr;
> >
> > import org.apache.directmemory.cache.Cache;
> > +import org.apache.directmemory.cache.CacheService;
> > +import org.apache.directmemory.measures.Monitor;
> > import org.apache.directmemory.measures.Ram;
> > import org.apache.solr.common.util.NamedList;
> > import org.apache.solr.common.util.SimpleOrderedMap;
> > @@ -37,11 +38,9 @@ import java.util.concurrent.atomic.Atomi
> > * A {@link SolrCache} based on Apache DirectMemory
> > */
> > public class SolrOffHeapCache<K, V>
> > - implements SolrCache<K, V>
> > -{
> > + implements SolrCache<K, V> {
> >
> > - private static class CumulativeStats
> > - {
> > + private static class CumulativeStats {
> > AtomicLong lookups = new AtomicLong();
> >
> > AtomicLong hits = new AtomicLong();
> > @@ -74,32 +73,32 @@ public class SolrOffHeapCache<K, V>
> > private String description = "DM Cache";
> >
> > @Override
> > - public Object init( Map args, Object persistence, CacheRegenerator
> > regenerator )
> > - {
> > - Object buffers = args.get( "buffers" );
> > - String size = String.valueOf( args.get( "size" ) );
> > - Cache.init( buffers != null ? Integer.valueOf( String.valueOf(
> > buffers ) ) : 1,
> > - Ram.Mb( Double.valueOf( size ) / 512 ) );
> > + public Object init(Map args, Object persistence, CacheRegenerator
> > regenerator) {
> > + Object buffers = args.get("buffers");
> > + String size = String.valueOf(args.get("size"));
> > + Integer capacity =
> > Integer.parseInt(String.valueOf(args.get("initialSize")));
> > + Cache.init(buffers != null ?
> > Integer.valueOf(String.valueOf(buffers)) : 1,
> > + Ram.Mb(Double.valueOf(size) / 512),
> > + Ram.Mb(Double.valueOf(capacity) / 512),
> > + CacheService.DEFAULT_CONCURRENCY_LEVEL);
> >
> > state = State.CREATED;
> > this.regenerator = regenerator;
> > - name = (String) args.get( "name" );
> > + name = (String) args.get("name");
> > String str = size;
> > - final int limit = str == null ? 1024 : Integer.parseInt( str );
> > - str = (String) args.get( "initialSize" );
> > - final int initialSize = Math.min( str == null ? 1024 :
> > Integer.parseInt( str ), limit );
> > - str = (String) args.get( "autowarmCount" );
> > - autowarmCount = str == null ? 0 : Integer.parseInt( str );
> > + final int limit = str == null ? 1024 : Integer.parseInt(str);
> > + str = (String) args.get("initialSize");
> > + final int initialSize = Math.min(str == null ? 1024 :
> > Integer.parseInt(str), limit);
> > + str = (String) args.get("autowarmCount");
> > + autowarmCount = str == null ? 0 : Integer.parseInt(str);
> >
> > description = "Solr OffHeap Cache(maxSize=" + limit + ",
> > initialSize=" + initialSize;
> > - if ( autowarmCount > 0 )
> > - {
> > + if (autowarmCount > 0) {
> > description += ", autowarmCount=" + autowarmCount + ",
> > regenerator=" + regenerator;
> > }
> > description += ')';
> >
> > - if ( persistence == null )
> > - {
> > + if (persistence == null) {
> > // must be the first time a cache of this type is being
> created
> > persistence = new CumulativeStats();
> > }
> > @@ -110,138 +109,140 @@ public class SolrOffHeapCache<K, V>
> > }
> >
> > @Override
> > - public String name()
> > - {
> > + public String name() {
> > return name;
> > }
> >
> > @Override
> > - public int size()
> > - {
> > - return Long.valueOf( Cache.entries() ).intValue();
> > + public int size() {
> > + return Long.valueOf(Cache.entries()).intValue();
> > }
> >
> > @Override
> > - public V put( K key, V value )
> > - {
> > - return (V) Cache.put( String.valueOf( key ), value );
> > + public V put(K key, V value) {
> > + synchronized (this) {
> > + if (state == State.LIVE) {
> > + stats.inserts.incrementAndGet();
> > + }
> > +
> > + inserts++;
> > + return (V) Cache.put(String.valueOf(key), value);
> > + }
> > }
> >
> > @Override
> > - public V get( K key )
> > - {
> > - return (V) Cache.retrieve( String.valueOf( key ) );
> > + public V get(K key) {
> > + synchronized (this) {
> > + V val = (V) Cache.retrieve(String.valueOf(key));
> > + if (state == State.LIVE) {
> > + // only increment lookups and hits if we are live.
> > + lookups++;
> > + stats.lookups.incrementAndGet();
> > + if (val != null) {
> > + hits++;
> > + stats.hits.incrementAndGet();
> > + }
> > + }
> > + return val;
> > + }
> > }
> >
> > @Override
> > - public void clear()
> > - {
> > - synchronized ( this )
> > - {
> > + public void clear() {
> > + synchronized (this) {
> > Cache.clear();
> > }
> > }
> >
> > @Override
> > - public void setState( State state )
> > - {
> > + public void setState(State state) {
> > this.state = state;
> > }
> >
> > @Override
> > - public State getState()
> > - {
> > + public State getState() {
> > return state;
> > }
> >
> > @Override
> > - public void warm( SolrIndexSearcher searcher, SolrCache<K, V> old )
> > - throws IOException
> > - {
> > + public void warm(SolrIndexSearcher searcher, SolrCache<K, V> old)
> > + throws IOException {
> > // it looks like there is no point in warming an off heap item
> > }
> >
> > @Override
> > - public void close()
> > - {
> > + public void close() {
> > + Cache.dump();
> > + Monitor.dump();
> > }
> >
> > @Override
> > - public String getName()
> > - {
> > + public String getName() {
> > return SolrOffHeapCache.class.getName();
> > }
> >
> > @Override
> > - public String getVersion()
> > - {
> > + public String getVersion() {
> > return SolrCore.version;
> > }
> >
> > - public String getDescription()
> > - {
> > + public String getDescription() {
> > return description;
> > }
> >
> > - public Category getCategory()
> > - {
> > + public Category getCategory() {
> > return Category.CACHE;
> > }
> >
> > @Override
> > - public String getSourceId()
> > - {
> > + public String getSourceId() {
> > return null;
> > }
> >
> > @Override
> > - public String getSource()
> > - {
> > + public String getSource() {
> > return null;
> > }
> >
> > @Override
> > - public URL[] getDocs()
> > - {
> > + public URL[] getDocs() {
> > return new URL[0];
> > }
> >
> > - public NamedList getStatistics()
> > - {
> > + public NamedList getStatistics() {
> > NamedList lst = new SimpleOrderedMap();
> > - synchronized ( this )
> > - {
> > - lst.add( "lookups", lookups );
> > - lst.add( "hits", hits );
> > - lst.add( "hitratio", calcHitRatio( lookups, hits ) );
> > - lst.add( "inserts", inserts );
> > - lst.add( "evictions", evictions );
> > - lst.add( "size", Cache.entries() );
> > + synchronized (this) {
> > + lst.add("lookups", lookups);
> > + lst.add("hits", hits);
> > + lst.add("hitratio", calcHitRatio(lookups, hits));
> > + lst.add("inserts", inserts);
> > + lst.add("evictions", evictions);
> > + lst.add("size", Cache.entries());
> > }
> >
> > - lst.add( "warmupTime", warmupTime );
> > + lst.add("warmupTime", warmupTime);
> >
> > long clookups = stats.lookups.get();
> > long chits = stats.hits.get();
> > - lst.add( "cumulative_lookups", clookups );
> > - lst.add( "cumulative_hits", chits );
> > - lst.add( "cumulative_hitratio", calcHitRatio( clookups, chits )
> );
> > - lst.add( "cumulative_inserts", stats.inserts.get() );
> > - lst.add( "cumulative_evictions", stats.evictions.get() );
> > + lst.add("cumulative_lookups", clookups);
> > + lst.add("cumulative_hits", chits);
> > + lst.add("cumulative_hitratio", calcHitRatio(clookups, chits));
> > + lst.add("cumulative_inserts", stats.inserts.get());
> > + lst.add("cumulative_evictions", stats.evictions.get());
> >
> > return lst;
> > }
> >
> > - private Object calcHitRatio( long clookups, long chits )
> > - {
> > - int ones = (int) ( hits * 100 / lookups );
> > - int tenths = (int) ( hits * 1000 / lookups ) - ones * 10;
> > - return Integer.toString( ones ) + '.' + tenths;
> > + private Object calcHitRatio(long clookups, long chits) {
> > + if (lookups == 0) return "0.00";
> > + if (lookups == hits) return "1.00";
> > + int hundredths = (int) (hits * 100 / lookups); // rounded down
> > + if (hundredths < 10) return "0.0" + hundredths;
> > + return "0." + hundredths;
> > }
> >
> > @Override
> > - public String toString()
> > - {
> > + public String toString() {
> > return name + getStatistics().toString();
> > }
> > }
> >
> > Added:
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> > URL:
> >
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java?rev=1228898&view=auto
> >
> >
> ==============================================================================
> > ---
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> > (added)
> > +++
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapCacheTest.java
> > Sun Jan 8 17:16:00 2012
> > @@ -0,0 +1,87 @@
> > +/**
> > + * Licensed to the Apache Software Foundation (ASF) under one or more
> > + * contributor license agreements. See the NOTICE file distributed with
> > + * this work for additional information regarding copyright ownership.
> > + * The ASF licenses this file to You under the Apache License, Version
> 2.0
> > + * (the "License"); you may not use this file except in compliance with
> > + * the License. You may obtain a copy of the License at
> > + *
> > + * http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> > implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +package org.apache.directmemory.examples.solr;
> > +
> > +import org.apache.lucene.search.MatchAllDocsQuery;
> > +import org.apache.lucene.search.Query;
> > +import org.apache.lucene.search.Sort;
> > +import org.apache.solr.common.util.NamedList;
> > +import org.apache.solr.search.QueryResultKey;
> > +import org.apache.solr.search.function.DocValues;
> > +import org.junit.After;
> > +import org.junit.Before;
> > +import org.junit.Test;
> > +
> > +import java.util.ArrayList;
> > +import java.util.HashMap;
> > +import java.util.Map;
> > +
> > +import static org.junit.Assert.*;
> > +
> > +/**
> > + * Testcase for {@link SolrOffHeapCache}
> > + */
> > +public class SolrOffHeapCacheTest {
> > +
> > + private SolrOffHeapCache solrOffHeapCache;
> > +
> > + @Before
> > + public void setUp() {
> > + solrOffHeapCache = new SolrOffHeapCache();
> > + Map<String, String> args = new HashMap<String, String>();
> > + args.put("size", "10000");
> > + args.put("initialSize", "1000");
> > + solrOffHeapCache.init(args, null, null);
> > + }
> > +
> > + @After
> > + public void tearDown() {
> > + solrOffHeapCache.clear();
> > + solrOffHeapCache.close();
> > + }
> > +
> > + @Test
> > + public void testStatisticsWhenCacheNotUsedYet() {
> > + try {
> > + NamedList stats = solrOffHeapCache.getStatistics();
> > + assertNotNull(stats);
> > + assertEquals(0l, stats.get("lookups"));
> > + assertEquals(0l, stats.get("evictions"));
> > + assertEquals(0l, stats.get("hits"));
> > + assertEquals(0l, stats.get("inserts"));
> > + } catch (Exception e) {
> > + fail(e.getLocalizedMessage());
> > + }
> > + }
> > +
> > + @Test
> > + public void testPut() {
> > + try {
> > + QueryResultKey queryResultKey = new QueryResultKey(new
> > MatchAllDocsQuery(), new ArrayList<Query>(), new Sort(), 1);
> > + DocValues docValues = new DocValues() {
> > + @Override
> > + public String toString(int doc) {
> > + return doc + "asd";
> > + }
> > + };
> > + solrOffHeapCache.put(queryResultKey, docValues);
> > + } catch (Exception e) {
> > + e.printStackTrace();
> > + fail(e.getLocalizedMessage());
> > + }
> > + }
> > +}
> >
> > Modified:
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> > URL:
> >
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java?rev=1228898&r1=1228897&r2=1228898&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> > (original)
> > +++
> >
> incubator/directmemory/trunk/examples/src/test/java/org/apache/directmemory/examples/solr/SolrOffHeapIntegrationTest.java
> > Sun Jan 8 17:16:00 2012
> > @@ -19,7 +19,8 @@ package org.apache.directmemory.examples
> > import org.apache.directmemory.cache.Cache;
> > import org.apache.solr.request.LocalSolrQueryRequest;
> > import org.apache.solr.util.TestHarness;
> > -import org.junit.Before;
> > +import org.junit.AfterClass;
> > +import org.junit.BeforeClass;
> > import org.junit.Test;
> >
> > import static org.junit.Assert.assertTrue;
> > @@ -27,41 +28,39 @@ import static org.junit.Assert.fail;
> >
> > /**
> > */
> > -public class SolrOffHeapIntegrationTest
> > -{
> > - private TestHarness h;
> > -
> > - @Before
> > - public void setUp()
> > - {
> > +public class SolrOffHeapIntegrationTest {
> > + private static TestHarness h;
> > +
> > + @BeforeClass
> > + public static void setUp() {
> > String data = "target/data/expand";
> > - String config = this.getClass().getResource(
> > "/solr/config/solrconfig.xml" ).getFile();
> > - String schema = this.getClass().getResource(
> > "/solr/config/schema.xml" ).getFile();
> > - this.h = new TestHarness( data, config, schema );
> > + String config =
> >
> SolrOffHeapCache.class.getResource("/solr/config/solrconfig.xml").getFile();
> > + String schema =
> > SolrOffHeapCache.class.getResource("/solr/config/schema.xml").getFile();
> > + h = new TestHarness(data, config, schema);
> > + }
> > +
> > + @AfterClass
> > + public static void tearDown() {
> > + Cache.clear();
> > }
> >
> > @Test
> > - public void testSimpleQuery()
> > - {
> > - try
> > - {
> > + public void testSimpleQuery() {
> > + try {
> > // add a doc to Solr
> > - h.validateAddDoc( "id", "1", "text", "something is happening
> > here" );
> > + h.validateAddDoc("id", "1", "text", "something is happening
> > here");
> >
> > // make the query
> > - LocalSolrQueryRequest request = h.getRequestFactory(
> > "standard", 0, 100 ).makeRequest( "q", "something" );
> > - String response = h.query( "standard", request );
> > - assertTrue( response != null );
> > - assertTrue( !response.contains( "error" ) );
> > + LocalSolrQueryRequest request =
> > h.getRequestFactory("standard", 0, 10).makeRequest("q", "something");
> > + String response = h.query("standard", request);
> > + assertTrue(response != null);
> > + assertTrue(!response.contains("error"));
> >
> > // check the cache has been hit
> > - assertTrue( Cache.entries() > 0 );
> > + assertTrue(Cache.entries() > 0);
> >
> > - }
> > - catch ( Throwable e )
> > - {
> > - e.printStackTrace();
> > - fail( e.getLocalizedMessage() );
> > + } catch (Throwable e) {
> > + fail(e.getLocalizedMessage());
> > }
> > }
> > }
> >
> > Modified:
> >
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> > URL:
> >
> http://svn.apache.org/viewvc/incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml?rev=1228898&r1=1228897&r2=1228898&view=diff
> >
> >
> ==============================================================================
> > ---
> >
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> > (original)
> > +++
> >
> incubator/directmemory/trunk/examples/src/test/resources/solr/config/solrconfig.xml
> > Sun Jan 8 17:16:00 2012
> > @@ -66,7 +66,7 @@
> > cause a serious error to be logged if it can't be loaded. <lib
> > path="../a-jar-that-does-not-exist.jar" />
> > -->
> > -
> > + <luceneMatchVersion>LUCENE_35</luceneMatchVersion>
> >
> > <!--
> > Used to specify an alternate directory to hold all index data other
> > @@ -360,8 +360,8 @@
> > for each document). Since Lucene internal document ids are
> > transient, this cache will not be autowarmed.
> > -->
> > - <queryResultCache
> > class="org.apache.directmemory.examples.solr.SolrOffHeapCache" size="512"
> > - initialSize="512" autowarmCount="0" buffers="10"/>
> > + <queryResultCache
> > class="org.apache.directmemory.examples.solr.SolrOffHeapCache"
> size="10000"
> > + initialSize="1000" autowarmCount="0" buffers="2"/>
> >
> > <!--
> > If true, stored fields that are not requested will be loaded
> >
> >
> >
>