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.RequestMetrics;
11 import com.atlassian.vcache.internal.core.DefaultRequestContext;
12 import com.atlassian.vcache.internal.core.DefaultTransactionControlManager;
13 import com.atlassian.vcache.internal.core.Sha1ExternalCacheKeyGenerator;
14 import com.atlassian.vcache.internal.core.metrics.DefaultMetricsCollector;
15 import com.atlassian.vcache.internal.core.metrics.MetricsCollector;
16 import com.atlassian.vcache.internal.test.AbstractUnreliableTransactionalExternalCacheIT;
17 import net.spy.memcached.AddrUtil;
18 import net.spy.memcached.BinaryConnectionFactory;
19 import net.spy.memcached.MemcachedClient;
20 import org.junit.Before;
21 import org.junit.BeforeClass;
22
23 import java.io.IOException;
24 import java.time.Duration;
25 import java.util.concurrent.CompletionStage;
26
27 import static com.atlassian.vcache.internal.test.CompletionStageSuccessful.successful;
28 import static org.hamcrest.MatcherAssert.assertThat;
29
30 public class MemcachedTransactionalExternalCacheIT extends AbstractUnreliableTransactionalExternalCacheIT {
31 private static MemcachedClient client;
32 private static MemcachedClient offlineClient;
33
34 private final RequestContext requestContext = new DefaultRequestContext(() -> "txn-it-test");
35 private final MetricsCollector metricsCollector = new DefaultMetricsCollector(() -> requestContext);
36
37 private MemcachedTransactionalExternalCache<String> cache;
38 private TransactionalExternalCache<String> wrappedCache;
39 private MemcachedDirectExternalCache<String> directCache;
40
41 private MemcachedTransactionalExternalCache<String> offlineCache;
42 private MemcachedDirectExternalCache<String> offlineDirectCache;
43
44 @Override
45 protected TransactionalExternalCache<String> cache() {
46 return wrappedCache;
47 }
48
49 @Override
50 protected DirectExternalCache<String> directCache() {
51 return directCache;
52 }
53
54 @Override
55 protected TransactionalExternalCache<String> offlineCache() {
56 return offlineCache;
57 }
58
59 @Override
60 protected DirectExternalCache<String> offlineDirectCache() {
61 return offlineDirectCache;
62 }
63
64 @Override
65 protected void directCacheRefresh() {
66 directCache.refreshCacheVersion();
67 }
68
69 @Override
70 protected void cacheTransactionSync() {
71 cache.transactionSync();
72 }
73
74 @Override
75 protected void cacheTransactionDiscard() {
76 cache.transactionDiscard();
77 }
78
79 @Override
80 protected void offlineCacheTransactionSync() {
81 offlineCache.transactionSync();
82 }
83
84 @Override
85 protected void offlineCacheTransactionDiscard() {
86 offlineCache.transactionDiscard();
87 }
88
89 @Override
90 protected RequestMetrics requestMetrics() {
91 return metricsCollector.obtainRequestMetrics(requestContext);
92 }
93
94 @BeforeClass
95 public static void init_client() throws IOException {
96 client = new MemcachedClient(
97 new BinaryConnectionFactory(),
98 AddrUtil.getAddresses(System.getProperty("memcached.svr")));
99
100 offlineClient = new MemcachedClient(
101 new BinaryConnectionFactory(),
102 AddrUtil.getAddresses("localhost:4"));
103 }
104
105 @Before
106 public void ensureCache() {
107 final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder()
108 .entryGrowthRateHint(ChangeRate.LOW_CHANGE)
109 .entryCountHint(5)
110 .defaultTtl(Duration.ofSeconds(60))
111 .dataChangeRateHint(ChangeRate.HIGH_CHANGE)
112 .build();
113 final MemcachedVCacheServiceSettings serviceSettings =
114 Utils.defaultServiceSettingsBuilder(() -> client, Duration.ofSeconds(1)).build();
115 cache = new MemcachedTransactionalExternalCache<>(
116 serviceSettings,
117 () -> requestContext,
118 new Sha1ExternalCacheKeyGenerator("it-test"),
119 CACHE_NAME,
120 StringMarshalling.pair(),
121 settings,
122 new DefaultTransactionControlManager(metricsCollector, context -> {}),
123 metricsCollector);
124 wrappedCache = metricsCollector.wrap(cache);
125
126 directCache = new MemcachedDirectExternalCache<>(
127 serviceSettings,
128 () -> requestContext,
129 new Sha1ExternalCacheKeyGenerator("it-test"),
130 CACHE_NAME,
131 StringMarshalling.pair(),
132 settings);
133
134
135 final CompletionStage<Void> rm = directCache.removeAll();
136 assertThat(rm, successful());
137
138 offlineCache = new MemcachedTransactionalExternalCache<>(
139 Utils.defaultServiceSettingsBuilder(() -> offlineClient, Duration.ofSeconds(1)).build(),
140 () -> requestContext,
141 new Sha1ExternalCacheKeyGenerator("it-test-offline"),
142 CACHE_NAME + ".offline",
143 StringMarshalling.pair(),
144 settings,
145 new DefaultTransactionControlManager(metricsCollector, context -> {}),
146 metricsCollector);
147
148 offlineDirectCache = new MemcachedDirectExternalCache<>(
149 serviceSettings,
150 () -> requestContext,
151 new Sha1ExternalCacheKeyGenerator("it-test-offline"),
152 CACHE_NAME + ".offline",
153 StringMarshalling.pair(),
154 settings);
155 }
156 }