View Javadoc

1   package com.atlassian.vcache.internal.memcached;
2   
3   import com.atlassian.marshalling.jdk.StringMarshalling;
4   import com.atlassian.vcache.ChangeRate;
5   import com.atlassian.vcache.DirectExternalCache;
6   import com.atlassian.vcache.ExternalCacheSettings;
7   import com.atlassian.vcache.ExternalCacheSettingsBuilder;
8   import com.atlassian.vcache.TransactionalExternalCache;
9   import com.atlassian.vcache.internal.RequestContext;
10  import com.atlassian.vcache.internal.core.DefaultRequestContext;
11  import com.atlassian.vcache.internal.core.DefaultTransactionControlManager;
12  import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
13  import com.atlassian.vcache.internal.core.metrics.DefaultMetricsCollector;
14  import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
15  import com.atlassian.vcache.internal.test.AbstractTransactionalExternalCacheIT;
16  import net.spy.memcached.AddrUtil;
17  import net.spy.memcached.BinaryConnectionFactory;
18  import net.spy.memcached.MemcachedClient;
19  import org.junit.Before;
20  import org.junit.BeforeClass;
21  
22  import java.io.IOException;
23  import java.time.Duration;
24  import java.util.concurrent.CompletionStage;
25  
26  import static com.atlassian.vcache.internal.test.CompletionStageSuccessful.successful;
27  import static org.hamcrest.MatcherAssert.assertThat;
28  
29  public class MemcachedTransactionalExternalCacheIT extends AbstractTransactionalExternalCacheIT {
30      private static MemcachedClient client;
31  
32      private final RequestContext requestContext = new DefaultRequestContext("txn-it-test");
33      private final MetricsCollector metricsCollector = new DefaultMetricsCollector(() -> requestContext);
34  
35      private MemcachedTransactionalExternalCache<String> cache;
36      private MemcachedDirectExternalCache<String> directCache;
37  
38      @Override
39      protected TransactionalExternalCache<String> cache() {
40          return cache;
41      }
42  
43      @Override
44      protected DirectExternalCache<String> directCache() {
45          return directCache;
46      }
47  
48      @Override
49      protected void directCacheRefresh() {
50          directCache.refreshCacheVersion();
51      }
52  
53      @Override
54      protected void cacheTransactionSync() {
55          cache.transactionSync();
56      }
57  
58      @Override
59      protected void cacheTransactionDiscard() {
60          cache.transactionDiscard();
61      }
62  
63      @BeforeClass
64      public static void init_client() throws IOException {
65          client = new MemcachedClient(
66                  new BinaryConnectionFactory(),
67                  AddrUtil.getAddresses(System.getProperty("memcached.svr")));
68      }
69  
70      @Before
71      public void ensureCache() {
72          final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder()
73                  .entryGrowthRateHint(ChangeRate.LOW_CHANGE)
74                  .entryCountHint(5)
75                  .defaultTtl(Duration.ofSeconds(60))
76                  .dataChangeRateHint(ChangeRate.HIGH_CHANGE)
77                  .build();
78          cache = new MemcachedTransactionalExternalCache<>(
79                  () -> client,
80                  () -> requestContext,
81                  new Sha1ExternalCacheKeyGenerator("it-test"),
82                  CACHE_NAME,
83                  StringMarshalling.pair(),
84                  settings,
85                  new DefaultTransactionControlManager(metricsCollector, context -> {}),
86                  metricsCollector,
87                  Duration.ofSeconds(1));
88  
89          directCache = new MemcachedDirectExternalCache<>(
90                  () -> client,
91                  () -> requestContext,
92                  new Sha1ExternalCacheKeyGenerator("it-test"),
93                  CACHE_NAME,
94                  StringMarshalling.pair(),
95                  settings,
96                  Duration.ofSeconds(1));
97  
98          // Start from a clean slate
99          final CompletionStage<Void> rm = directCache.removeAll();
100         assertThat(rm, successful());
101     }
102 }