Skip to content

Commit

Permalink
SOLR-16328 : intern() strings in DocCollection to reduce memory footp… (
Browse files Browse the repository at this point in the history
  • Loading branch information
noblepaul committed Sep 7, 2022
1 parent bddbe7a commit 1b7ff71
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 1 deletion.
2 changes: 2 additions & 0 deletions solr/CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ Optimizations

* SOLR-16336: avoid fetching solrconfig.xml & schema.xml for already cached schema and config (noble)

* SOLR-16328: intern() strings in DocCollection to reduce memory footprint (noble)

Bug Fixes
---------------------
* SOLR-15918: Skip repetitive parent znode creation on config set upload (Mike Drob)
Expand Down
34 changes: 34 additions & 0 deletions solr/core/src/java/org/apache/solr/core/CoreContainer.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import static org.apache.solr.core.CorePropertiesLocator.PROPERTIES_FILENAME;
import static org.apache.solr.security.AuthenticationPlugin.AUTHENTICATION_PLUGIN_PROP;

import com.github.benmanes.caffeine.cache.Interner;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
Expand Down Expand Up @@ -56,6 +57,7 @@
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.TimeoutException;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
Expand Down Expand Up @@ -89,6 +91,7 @@
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.cloud.Aliases;
import org.apache.solr.common.cloud.ClusterState;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.Replica.State;
Expand Down Expand Up @@ -150,6 +153,8 @@
import org.apache.solr.util.StartupLoggingUtils;
import org.apache.solr.util.stats.MetricUtils;
import org.apache.zookeeper.KeeperException;
import org.noggit.JSONParser;
import org.noggit.ObjectBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -383,6 +388,7 @@ public CoreContainer(NodeConfig config, CoresLocator locator, boolean asyncSolrC
if (null != this.cfg.getBooleanQueryMaxClauseCount()) {
IndexSearcher.setMaxClauseCount(this.cfg.getBooleanQueryMaxClauseCount());
}
setWeakStringInterner();
this.coresLocator = locator;
this.containerProperties = new Properties(config.getSolrProperties());
this.asyncSolrCoreLoad = asyncSolrCoreLoad;
Expand Down Expand Up @@ -2424,6 +2430,34 @@ public PlacementPluginFactory<? extends PlacementPluginConfig> getPlacementPlugi
public void runAsync(Runnable r) {
coreContainerAsyncTaskExecutor.submit(r);
}

public static void setWeakStringInterner() {
boolean enable = "true".equals(System.getProperty("solr.use.str.intern", "true"));
if (!enable) return;
Interner<String> interner = Interner.newWeakInterner();
ClusterState.setStrInternerParser(
new Function<>() {
@Override
public ObjectBuilder apply(JSONParser p) {
try {
return new ObjectBuilder(p) {
@Override
public void addKeyVal(Object map, Object key, Object val) throws IOException {
if (key != null) {
key = interner.intern(key.toString());
}
if (val instanceof String) {
val = interner.intern((String) val);
}
super.addKeyVal(map, key, val);
}
};
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
}
}

class CloserThread extends Thread {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
*/
package org.apache.solr.common.cloud;

import static org.apache.solr.common.util.Utils.STANDARDOBJBUILDER;

import java.lang.invoke.MethodHandles;
import java.util.Collection;
import java.util.Collections;
Expand All @@ -28,14 +30,17 @@
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.cloud.DocCollection.CollectionStateProps;
import org.apache.solr.common.cloud.Replica.ReplicaStateProps;
import org.apache.solr.common.util.Utils;
import org.noggit.JSONParser;
import org.noggit.JSONWriter;
import org.noggit.ObjectBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -227,7 +232,8 @@ public static ClusterState createFromJson(int version, byte[] bytes, Set<String>
return new ClusterState(liveNodes, Collections.<String, DocCollection>emptyMap());
}
@SuppressWarnings({"unchecked"})
Map<String, Object> stateMap = (Map<String, Object>) Utils.fromJSON(bytes);
Map<String, Object> stateMap =
(Map<String, Object>) Utils.fromJSON(bytes, 0, bytes.length, STR_INTERNER_OBJ_BUILDER);
return createFromCollectionMap(version, stateMap, liveNodes);
}

Expand Down Expand Up @@ -477,4 +483,12 @@ public PerReplicaStates getStates() {
return perReplicaStates;
}
}

private static volatile Function<JSONParser, ObjectBuilder> STR_INTERNER_OBJ_BUILDER =
STANDARDOBJBUILDER;

public static void setStrInternerParser(Function<JSONParser, ObjectBuilder> fun) {
if (fun == null) return;
STR_INTERNER_OBJ_BUILDER = fun;
}
}

0 comments on commit 1b7ff71

Please sign in to comment.