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.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; // Points to a non-responsive memcached
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; // Points to a non-responsive memcached
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         // Start from a clean slate
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 }