View Javadoc

1   package com.atlassian.vcache.internal.memcached;
2   
3   import com.atlassian.marshalling.jdk.StringMarshalling;
4   import com.atlassian.vcache.DirectExternalCache;
5   import com.atlassian.vcache.ExternalCacheSettings;
6   import com.atlassian.vcache.StableReadExternalCache;
7   import com.atlassian.vcache.internal.RequestContext;
8   import com.atlassian.vcache.internal.RequestMetrics;
9   import com.atlassian.vcache.internal.core.DefaultRequestContext;
10  import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
11  import com.atlassian.vcache.internal.core.metrics.DefaultMetricsCollector;
12  import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
13  import com.atlassian.vcache.internal.test.AbstractUnreliableStableReadExternalCacheIT;
14  import net.spy.memcached.AddrUtil;
15  import net.spy.memcached.BinaryConnectionFactory;
16  import net.spy.memcached.MemcachedClient;
17  import org.junit.BeforeClass;
18  
19  import java.io.IOException;
20  import java.time.Duration;
21  
22  public class MemcachedStableReadExternalCacheIT extends AbstractUnreliableStableReadExternalCacheIT {
23      private static MemcachedClient client;
24      private static MemcachedClient offlineClient; // Points to a non-responsive memcached
25      private RequestContext requestContext = new DefaultRequestContext(() -> "tenant-id");
26      private final MetricsCollector metricsCollector = new DefaultMetricsCollector(() -> requestContext);
27  
28      @BeforeClass
29      public static void init_client() throws IOException {
30          client = new MemcachedClient(
31                  new BinaryConnectionFactory(),
32                  AddrUtil.getAddresses(System.getProperty("memcached.svr")));
33  
34          offlineClient = new MemcachedClient(
35                  new BinaryConnectionFactory(),
36                  AddrUtil.getAddresses("localhost:4")); // Unassigned port
37      }
38  
39      @Override
40      protected StableReadExternalCache<String> createCache(String name, ExternalCacheSettings settings, Duration lockTimeout) {
41          return createCache(name, settings, lockTimeout, client);
42      }
43  
44      private StableReadExternalCache<String> createCache(String name, ExternalCacheSettings settings, Duration lockTimeout, MemcachedClient client) {
45          return metricsCollector.wrap(
46                  new MemcachedStableReadExternalCache<>(
47                          Utils.defaultServiceSettingsBuilder(() -> client, lockTimeout).build(),
48                          () -> requestContext,
49                          new Sha1ExternalCacheKeyGenerator("it-test"),
50                          name,
51                          StringMarshalling.pair(),
52                          settings,
53                          metricsCollector));
54      }
55  
56      @Override
57      protected StableReadExternalCache<String> createOfflineCache(String name, ExternalCacheSettings settings, Duration lockTimeout) {
58          return createCache(name, settings, lockTimeout, offlineClient);
59      }
60  
61      @Override
62      protected DirectExternalCache<String> obtainDirectCache(String name, ExternalCacheSettings settings) {
63          return new MemcachedDirectExternalCache<>(
64                  Utils.defaultServiceSettingsBuilder(() -> client, Duration.ofSeconds(1)).build(),
65                  () -> requestContext,
66                  new Sha1ExternalCacheKeyGenerator("it-test"),
67                  name,
68                  StringMarshalling.pair(),
69                  settings);
70      }
71  
72      @Override
73      protected RequestMetrics requestMetrics() {
74          return metricsCollector.obtainRequestMetrics(requestContext);
75      }
76  }