You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sh...@apache.org on 2013/10/23 22:44:31 UTC
svn commit: r1535167 - in /lucene/dev/branches/branch_4x: ./ lucene/
lucene/CHANGES.txt lucene/facet/
lucene/facet/src/java/org/apache/lucene/facet/search/OrdinalsCache.java
lucene/facet/src/test/org/apache/lucene/facet/search/OrdinalsCacheTest.java
Author: shaie
Date: Wed Oct 23 20:44:31 2013
New Revision: 1535167
URL: http://svn.apache.org/r1535167
Log:
LUCENE-5303: OrdinalsCache should use reader.getCoreCacheKey()
Added:
lucene/dev/branches/branch_4x/lucene/facet/src/test/org/apache/lucene/facet/search/OrdinalsCacheTest.java
- copied unchanged from r1535163, lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/search/OrdinalsCacheTest.java
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/lucene/ (props changed)
lucene/dev/branches/branch_4x/lucene/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_4x/lucene/facet/ (props changed)
lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/OrdinalsCache.java
Modified: lucene/dev/branches/branch_4x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/CHANGES.txt?rev=1535167&r1=1535166&r2=1535167&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/lucene/CHANGES.txt Wed Oct 23 20:44:31 2013
@@ -97,6 +97,9 @@ Bug Fixes
when there were buffered delete-by-Term. (Shalin Shekhar Mangar,
Mike McCandless)
+* LUCENE-5303: OrdinalsCache did not use coreCacheKey, resulting in
+ over caching across multiple threads. (Mike McCandless, Shai Erera)
+
API Changes:
* LUCENE-5222: Add SortField.needsScores(). Previously it was not possible
Modified: lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/OrdinalsCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/OrdinalsCache.java?rev=1535167&r1=1535166&r2=1535167&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/OrdinalsCache.java (original)
+++ lucene/dev/branches/branch_4x/lucene/facet/src/java/org/apache/lucene/facet/search/OrdinalsCache.java Wed Oct 23 20:44:31 2013
@@ -1,6 +1,7 @@
package org.apache.lucene.facet.search;
import java.io.IOException;
+import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
@@ -12,6 +13,7 @@ import org.apache.lucene.index.BinaryDoc
import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IntsRef;
+import org.apache.lucene.util.RamUsageEstimator;
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -94,7 +96,10 @@ public class OrdinalsCache {
}
}
- private static final Map<BinaryDocValues,CachedOrds> intsCache = new WeakHashMap<BinaryDocValues,CachedOrds>();
+ // outer map is a WeakHashMap which uses reader.getCoreCacheKey() as the weak
+ // reference. When it's no longer referenced, the entire inner map can be
+ // evicted.
+ private static final Map<Object,Map<String,CachedOrds>> ordsCache = new WeakHashMap<Object,Map<String,CachedOrds>>();
/**
* Returns the {@link CachedOrds} relevant to the given
@@ -107,12 +112,33 @@ public class OrdinalsCache {
if (dv == null) {
return null;
}
- CachedOrds ci = intsCache.get(dv);
- if (ci == null) {
- ci = new CachedOrds(dv, context.reader().maxDoc(), clp);
- intsCache.put(dv, ci);
+ Map<String,CachedOrds> fieldCache = ordsCache.get(context.reader().getCoreCacheKey());
+ if (fieldCache == null) {
+ fieldCache = new HashMap<String,OrdinalsCache.CachedOrds>();
+ ordsCache.put(context.reader().getCoreCacheKey(), fieldCache);
}
- return ci;
+ CachedOrds co = fieldCache.get(clp.field);
+ if (co == null) {
+ co = new CachedOrds(dv, context.reader().maxDoc(), clp);
+ fieldCache.put(clp.field, co);
+ }
+ return co;
}
+ /** Returns how many bytes the static ords cache is
+ * consuming. */
+ public synchronized static long ramBytesUsed() {
+ long size = 0;
+ for (Map<String,CachedOrds> e : ordsCache.values()) {
+ for (CachedOrds co : e.values()) {
+ size += RamUsageEstimator.NUM_BYTES_OBJECT_REF // CachedOrds reference in the map
+ + RamUsageEstimator.NUM_BYTES_OBJECT_HEADER // CachedOrds object header
+ + RamUsageEstimator.NUM_BYTES_ARRAY_HEADER * 2 // 2 int[] (header)
+ + RamUsageEstimator.NUM_BYTES_OBJECT_REF * 2 // 2 int[] (ref)
+ + RamUsageEstimator.NUM_BYTES_INT * co.offsets.length // sizeOf(offsets)
+ + RamUsageEstimator.NUM_BYTES_INT * co.ordinals.length; // sizeOf(ordinals)
+ }
+ }
+ return size;
+ }
}