Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#8952] Replace guava cache with caffeine cache #8953

Merged
merged 1 commit into from
Jun 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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