Skip to content

Commit

Permalink
[#8952] Replace guava cache with caffeine cache
Browse files Browse the repository at this point in the history
  • Loading branch information
emeroad committed Jun 22, 2022
1 parent 1fb4c26 commit 466afbd
Show file tree
Hide file tree
Showing 25 changed files with 166 additions and 167 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public class ProfilerLibs {
"com.google.rpc",
"com.google.type",


"com.github.benmanes.caffeine",
"org.objectweb.asm",
"org.slf4j",
"org.apache.thrift",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@
import com.navercorp.pinpoint.profiler.metadata.ApiMetaData;
import com.navercorp.pinpoint.profiler.metadata.ApiMetaDataService;
import com.navercorp.pinpoint.profiler.metadata.MetaDataType;
import com.navercorp.pinpoint.profiler.metadata.Result;
import com.navercorp.pinpoint.profiler.metadata.SimpleCache;
import com.navercorp.pinpoint.profiler.cache.Result;
import com.navercorp.pinpoint.profiler.cache.IdAllocator;
import com.navercorp.pinpoint.profiler.cache.SimpleCache;
import com.navercorp.pinpoint.profiler.sender.EnhancedDataSender;

import java.util.Objects;
Expand All @@ -31,7 +32,7 @@
*/
public class MockApiMetaDataService implements ApiMetaDataService {

private final SimpleCache<String> apiCache = new SimpleCache<>(new SimpleCache.ZigZagTransformer());
private final SimpleCache<String> apiCache = new SimpleCache<>(new IdAllocator.ZigZagAllocator());

private final EnhancedDataSender<MetaDataType> enhancedDataSender;

Expand Down
4 changes: 4 additions & 0 deletions profiler/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,10 @@
<version>4.1.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>


<dependency>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.navercorp.pinpoint.profiler.cache;

import com.navercorp.pinpoint.common.util.BytesUtils;

import java.util.concurrent.atomic.AtomicInteger;

public interface IdAllocator {
int allocate();

enum ID_TYPE {
BYPASS, ZIGZAG;
}

class ZigZagAllocator implements IdAllocator {
private final AtomicInteger idGen;

public ZigZagAllocator() {
this(1);
}

public ZigZagAllocator(int startValue) {
this.idGen = new AtomicInteger(startValue);
}

@Override
public int allocate() {
int id = this.idGen.getAndIncrement();
return BytesUtils.zigzagToInt(id);
}
}

class BypassAllocator implements IdAllocator {
private final AtomicInteger idGen;

public BypassAllocator() {
this(1);
}

public BypassAllocator(int startValue) {
this.idGen = new AtomicInteger(startValue);
}

@Override
public int allocate() {
return this.idGen.getAndIncrement();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
* limitations under the License.
*/

package com.navercorp.pinpoint.profiler.metadata;
package com.navercorp.pinpoint.profiler.cache;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.concurrent.ConcurrentMap;

Expand All @@ -35,8 +35,7 @@ public class LRUCache<T> {


public LRUCache(int maxCacheSize) {
final CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder();
cacheBuilder.concurrencyLevel(32);
final Caffeine<Object, Object> cacheBuilder = Caffeine.newBuilder();
cacheBuilder.initialCapacity(maxCacheSize);
cacheBuilder.maximumSize(maxCacheSize);
Cache<T, Object> localCache = cacheBuilder.build();
Expand All @@ -49,7 +48,6 @@ public LRUCache() {


public boolean put(T value) {

Object oldValue = cache.putIfAbsent(value, V);
return oldValue == null;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package com.navercorp.pinpoint.profiler.metadata;
package com.navercorp.pinpoint.profiler.cache;

/**
* @author emeroad
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,49 +14,38 @@
* limitations under the License.
*/

package com.navercorp.pinpoint.profiler.metadata;
package com.navercorp.pinpoint.profiler.cache;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.Objects;
import com.navercorp.pinpoint.common.util.BytesUtils;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

import java.util.Objects;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicInteger;

/**
* @author emeroad
*/
public class SimpleCache<T> {

// zero means not exist.
private final AtomicInteger idGen;
private final ConcurrentMap<T, Result> cache;
private final IdTransformer idTransformer;

public SimpleCache(IdTransformer idTransformer) {
this(idTransformer, 1024, 1);
}
private final IdAllocator idAllocator;

public SimpleCache(IdTransformer idTransformer, int cacheSize) {
this(idTransformer, cacheSize, 1);
public SimpleCache(IdAllocator idAllocator) {
this(idAllocator, 1024);
}

public SimpleCache(IdTransformer idTransformer, int cacheSize, int startValue) {
this.idGen = new AtomicInteger(startValue);
public SimpleCache(IdAllocator idAllocator, int cacheSize) {
this.cache = createCache(cacheSize);
this.idTransformer = Objects.requireNonNull(idTransformer, "idTransformer");
this.idAllocator = Objects.requireNonNull(idAllocator, "idTransformer");

}

private ConcurrentMap<T, Result> createCache(int maxCacheSize) {
final CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder();
cacheBuilder.concurrencyLevel(64);
final Caffeine<Object, Object> cacheBuilder = Caffeine.newBuilder();
cacheBuilder.initialCapacity(maxCacheSize);
cacheBuilder.maximumSize(maxCacheSize);
Cache<T, Result> localCache = cacheBuilder.build();
ConcurrentMap<T, Result> cache = localCache.asMap();
return cache;
return localCache.asMap();
}

public Result put(T value) {
Expand All @@ -76,27 +65,10 @@ public Result put(T value) {
}

private int nextId() {
int nextId = idGen.getAndIncrement();
return this.idTransformer.transform(nextId);
return this.idAllocator.allocate();
}

public interface IdTransformer {
int transform(int id);
}

public static class ZigZagTransformer implements IdTransformer {
@Override
public int transform(int id) {
return BytesUtils.zigzagToInt(id);
}
}

public static class BypassTransformer implements IdTransformer {
@Override
public int transform(int id) {
return id;
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@
*/

package com.navercorp.pinpoint.profiler.context.active;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.navercorp.pinpoint.common.trace.BaseHistogramSchema;
import com.navercorp.pinpoint.common.trace.HistogramSchema;
import com.navercorp.pinpoint.common.trace.HistogramSlot;
Expand Down Expand Up @@ -62,8 +61,7 @@ public DefaultActiveTraceRepository(ResponseTimeCollector responseTimeCollector,
}

private ConcurrentMap<ActiveTraceHandle, ActiveTrace> createCache(int maxActiveTraceSize) {
final CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder();
cacheBuilder.concurrencyLevel(64);
final Caffeine<Object, Object> cacheBuilder = Caffeine.newBuilder();
cacheBuilder.initialCapacity(maxActiveTraceSize);
cacheBuilder.maximumSize(maxActiveTraceSize);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import com.navercorp.pinpoint.profiler.metadata.ApiMetaDataService;
import com.navercorp.pinpoint.profiler.metadata.DefaultApiMetaDataService;
import com.navercorp.pinpoint.profiler.metadata.MetaDataType;
import com.navercorp.pinpoint.profiler.metadata.SimpleCache;
import com.navercorp.pinpoint.profiler.cache.SimpleCache;
import com.navercorp.pinpoint.profiler.sender.EnhancedDataSender;

import java.util.Objects;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@

package com.navercorp.pinpoint.profiler.context.provider.metadata;

import com.navercorp.pinpoint.profiler.metadata.SimpleCache;
import com.navercorp.pinpoint.profiler.cache.IdAllocator;
import com.navercorp.pinpoint.profiler.cache.SimpleCache;

import java.util.Objects;

Expand All @@ -25,17 +26,30 @@
*/
public class SimpleCacheFactory {

private final SimpleCache.IdTransformer idTransformer;
private final IdAllocator.ID_TYPE type;

public SimpleCacheFactory(SimpleCache.IdTransformer idTransformer) {
this.idTransformer = Objects.requireNonNull(idTransformer, "idTransformer");
public SimpleCacheFactory(IdAllocator.ID_TYPE type) {
this.type = Objects.requireNonNull(type, "type");
}

public <T> SimpleCache<T> newSimpleCache() {
return new SimpleCache<T>(idTransformer);
IdAllocator idAllocator = newIdAllocator(type, 1);
return new SimpleCache<>(idAllocator);
}

public <T> SimpleCache<T> newSimpleCache(int size ) {
return new SimpleCache<T>(idTransformer, size);
public <T> SimpleCache<T> newSimpleCache(int size) {
IdAllocator idAllocator = newIdAllocator(type, size);
return new SimpleCache<>(idAllocator, size);
}

private IdAllocator newIdAllocator(IdAllocator.ID_TYPE type, int size) {
switch (type) {
case BYPASS:
return new IdAllocator.BypassAllocator(size);
case ZIGZAG:
return new IdAllocator.ZigZagAllocator(size);
}
throw new RuntimeException("Unknown SimpleCache.ID_TYPE:" + type);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -19,28 +19,28 @@
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.navercorp.pinpoint.bootstrap.config.TransportModule;
import com.navercorp.pinpoint.profiler.metadata.SimpleCache;
import com.navercorp.pinpoint.profiler.cache.IdAllocator;

/**
* @author Woonduk Kang(emeroad)
*/
public class SimpleCacheFactoryProvider implements Provider<SimpleCacheFactory> {

private final SimpleCache.IdTransformer idTransformer;
private final IdAllocator.ID_TYPE type;

@Inject
public SimpleCacheFactoryProvider(TransportModule transportModule) {
if (TransportModule.THRIFT == transportModule) {
this.idTransformer = new SimpleCache.ZigZagTransformer();
this.type = IdAllocator.ID_TYPE.ZIGZAG;
} else if (TransportModule.GRPC == transportModule) {
this.idTransformer = new SimpleCache.BypassTransformer();
this.type = IdAllocator.ID_TYPE.BYPASS;
} else {
throw new IllegalStateException("unsupported transportModule:" + transportModule);
throw new IllegalStateException("Unsupported transportModule:" + transportModule);
}
}

@Override
public SimpleCacheFactory get() {
return new SimpleCacheFactory(idTransformer);
return new SimpleCacheFactory(type);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import com.navercorp.pinpoint.profiler.context.module.MetadataDataSender;
import com.navercorp.pinpoint.profiler.metadata.DefaultSqlMetaDataService;
import com.navercorp.pinpoint.profiler.metadata.MetaDataType;
import com.navercorp.pinpoint.profiler.metadata.SimpleCache;
import com.navercorp.pinpoint.profiler.cache.SimpleCache;
import com.navercorp.pinpoint.profiler.metadata.SqlMetaDataService;
import com.navercorp.pinpoint.profiler.sender.EnhancedDataSender;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import com.navercorp.pinpoint.profiler.context.module.MetadataDataSender;
import com.navercorp.pinpoint.profiler.metadata.DefaultStringMetaDataService;
import com.navercorp.pinpoint.profiler.metadata.MetaDataType;
import com.navercorp.pinpoint.profiler.metadata.SimpleCache;
import com.navercorp.pinpoint.profiler.cache.SimpleCache;
import com.navercorp.pinpoint.profiler.metadata.StringMetaDataService;
import com.navercorp.pinpoint.profiler.sender.EnhancedDataSender;

Expand Down
Loading

0 comments on commit 466afbd

Please sign in to comment.