From 49ac30801e883076171d76285deaf047cd09e0dc Mon Sep 17 00:00:00 2001 From: kimchy Date: Mon, 25 Apr 2011 00:16:42 +0300 Subject: [PATCH] more cache cleaning --- .../java/org/elasticsearch/common/Bytes.java | 8 - .../elasticsearch/common/CacheRecycler.java | 22 +++ .../common/io/FastCharArrayWriter.java | 22 --- .../common/io/StringBuilderWriter.java | 175 ------------------ .../common/lucene/all/AllEntries.java | 2 +- .../xcontent/json/JsonXContentGenerator.java | 4 +- 6 files changed, 25 insertions(+), 208 deletions(-) delete mode 100644 modules/elasticsearch/src/main/java/org/elasticsearch/common/io/StringBuilderWriter.java diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/common/Bytes.java b/modules/elasticsearch/src/main/java/org/elasticsearch/common/Bytes.java index 34056bf30ae..932d6386af0 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/common/Bytes.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/common/Bytes.java @@ -19,19 +19,11 @@ package org.elasticsearch.common; -import org.elasticsearch.common.thread.ThreadLocals; - /** * @author kimchy (shay.banon) */ public class Bytes { - public static final ThreadLocal> cachedBytes = new ThreadLocal>() { - @Override protected ThreadLocals.CleanableValue initialValue() { - return new ThreadLocals.CleanableValue(new byte[1024]); - } - }; - public static final byte[] EMPTY_ARRAY = new byte[0]; diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/common/CacheRecycler.java b/modules/elasticsearch/src/main/java/org/elasticsearch/common/CacheRecycler.java index e3f1084a50f..81679250b79 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/common/CacheRecycler.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/common/CacheRecycler.java @@ -34,6 +34,7 @@ public class CacheRecycler { public static void clear() { BufferRecycler.clean(); + bytes.remove(); doubleObjectHashMap.remove(); longObjectHashMap.remove(); longLongHashMap.remove(); @@ -46,6 +47,27 @@ public class CacheRecycler { intArray.remove(); } + // Bytes + private static ThreadLocal> bytes = new ThreadLocal>(); + + public static byte[] popBytes() { + SoftReference ref = bytes.get(); + byte[] bb = ref == null ? null : ref.get(); + if (bb == null) { + bb = new byte[1024]; + bytes.set(new SoftReference(bb)); + } + return bb; + } + + public static void pushBytes(byte[] bb) { + SoftReference ref = bytes.get(); + byte[] bb1 = ref == null ? null : ref.get(); + if (bb1 != null && bb1.length < bb.length) { + bytes.set(new SoftReference(bb)); + } + } + // ----- ExtTHashMap ----- private static ThreadLocal>> hashMap = new ThreadLocal>>(); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/FastCharArrayWriter.java b/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/FastCharArrayWriter.java index eb450920f70..8099ac147c1 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/FastCharArrayWriter.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/FastCharArrayWriter.java @@ -19,7 +19,6 @@ package org.elasticsearch.common.io; -import org.elasticsearch.common.thread.ThreadLocals; import org.elasticsearch.common.util.concurrent.NotThreadSafe; import java.io.IOException; @@ -34,27 +33,6 @@ import java.util.Arrays; @NotThreadSafe public class FastCharArrayWriter extends Writer { - /** - * A thread local based cache of {@link FastByteArrayOutputStream}. - */ - public static class Cached { - - private static final ThreadLocal> cache = new ThreadLocal>() { - @Override protected ThreadLocals.CleanableValue initialValue() { - return new ThreadLocals.CleanableValue(new FastCharArrayWriter()); - } - }; - - /** - * Returns the cached thread local byte stream, with its internal stream cleared. - */ - public static FastCharArrayWriter cached() { - FastCharArrayWriter os = cache.get().get(); - os.reset(); - return os; - } - } - /** * The buffer where data is stored. */ diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/StringBuilderWriter.java b/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/StringBuilderWriter.java deleted file mode 100644 index 65678518886..00000000000 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/common/io/StringBuilderWriter.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Licensed to Elastic Search and Shay Banon under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Elastic Search 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.elasticsearch.common.io; - -import org.elasticsearch.common.thread.ThreadLocals; -import org.elasticsearch.common.util.concurrent.NotThreadSafe; - -import java.io.Writer; - -/** - * A Writer based on {@link StringBuilder}. Also alows for thread local reuse of {@link StringBuilder} - * by using: StringBuilderWriter.Cached.cached() in order to obtain the cached writer. Note, - * in such cases, the {@link #getBuilder()} should be called and used (usually toString it) - * before another usage of the writer. - * - * @author kimchy (Shay Banon) - */ -@NotThreadSafe -public class StringBuilderWriter extends Writer { - - /** - * A thread local based cache of {@link StringBuilderWriter}. - */ - public static class Cached { - - private static final ThreadLocal> cache = new ThreadLocal>() { - @Override protected ThreadLocals.CleanableValue initialValue() { - return new ThreadLocals.CleanableValue(new StringBuilderWriter()); - } - }; - - /** - * Returns the cached thread local writer, with its internal {@link StringBuilder} cleared. - */ - public static StringBuilderWriter cached() { - StringBuilderWriter writer = cache.get().get(); - writer.getBuilder().setLength(0); - return writer; - } - } - - private final StringBuilder builder; - - /** - * Construct a new {@link StringBuilder} instance with default capacity. - */ - public StringBuilderWriter() { - this.builder = new StringBuilder(); - } - - /** - * Construct a new {@link StringBuilder} instance with the specified capacity. - * - * @param capacity The initial capacity of the underlying {@link StringBuilder} - */ - public StringBuilderWriter(int capacity) { - this.builder = new StringBuilder(capacity); - } - - /** - * Construct a new instance with the specified {@link StringBuilder}. - * - * @param builder The String builder - */ - public StringBuilderWriter(StringBuilder builder) { - this.builder = (builder != null ? builder : new StringBuilder()); - } - - /** - * Append a single character to this Writer. - * - * @param value The character to append - * @return This writer instance - */ - public Writer append(char value) { - builder.append(value); - return this; - } - - /** - * Append a character sequence to this Writer. - * - * @param value The character to append - * @return This writer instance - */ - public Writer append(CharSequence value) { - builder.append(value); - return this; - } - - /** - * Append a portion of a character sequence to the {@link StringBuilder}. - * - * @param value The character to append - * @param start The index of the first character - * @param end The index of the last character + 1 - * @return This writer instance - */ - public Writer append(CharSequence value, int start, int end) { - builder.append(value, start, end); - return this; - } - - /** - * Closing this writer has no effect. - */ - public void close() { - } - - /** - * Flushing this writer has no effect. - */ - public void flush() { - } - - - /** - * Write a String to the {@link StringBuilder}. - * - * @param value The value to write - */ - public void write(String value) { - if (value != null) { - builder.append(value); - } - } - - /** - * Write a portion of a character array to the {@link StringBuilder}. - * - * @param value The value to write - * @param offset The index of the first character - * @param length The number of characters to write - */ - public void write(char[] value, int offset, int length) { - if (value != null) { - builder.append(value, offset, length); - } - } - - /** - * Return the underlying builder. - * - * @return The underlying builder - */ - public StringBuilder getBuilder() { - return builder; - } - - /** - * Returns {@link StringBuilder#toString()}. - * - * @return The contents of the String builder. - */ - public String toString() { - return builder.toString(); - } -} diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/common/lucene/all/AllEntries.java b/modules/elasticsearch/src/main/java/org/elasticsearch/common/lucene/all/AllEntries.java index 5947f3ffd5d..377d2efd315 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/common/lucene/all/AllEntries.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/common/lucene/all/AllEntries.java @@ -104,7 +104,7 @@ public class AllEntries extends Reader { public String buildText() { reset(); - FastCharArrayWriter writer = FastCharArrayWriter.Cached.cached(); + FastCharArrayWriter writer = new FastCharArrayWriter(); for (Entry entry : entries) { writer.append(entry.reader()); writer.append(' '); diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/common/xcontent/json/JsonXContentGenerator.java b/modules/elasticsearch/src/main/java/org/elasticsearch/common/xcontent/json/JsonXContentGenerator.java index b02d29518bc..675be169b8a 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/common/xcontent/json/JsonXContentGenerator.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/common/xcontent/json/JsonXContentGenerator.java @@ -19,7 +19,7 @@ package org.elasticsearch.common.xcontent.json; -import org.elasticsearch.common.Bytes; +import org.elasticsearch.common.CacheRecycler; import org.elasticsearch.common.io.Streams; import org.elasticsearch.common.jackson.JsonGenerator; import org.elasticsearch.common.xcontent.*; @@ -214,7 +214,7 @@ public class JsonXContentGenerator implements XContentGenerator { generator.writeRaw(fieldName); generator.writeRaw("\" : "); flush(); - byte[] bytes = Bytes.cachedBytes.get().get(); + byte[] bytes = CacheRecycler.popBytes(); Streams.copy(content, bos, bytes); }