View Javadoc

1   package com.atlassian.vcache.internal.redis;
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 org.junit.Before;
18  import org.junit.Rule;
19  
20  import java.time.Duration;
21  import java.util.concurrent.CompletionStage;
22  
23  import static com.atlassian.vcache.internal.test.CompletionStageSuccessful.successful;
24  import static org.hamcrest.MatcherAssert.assertThat;
25  
26  public class RedisTransactionalExternalCacheIT extends AbstractUnreliableTransactionalExternalCacheIT {
27      @Rule
28      public JedisTester jedisTester = new JedisTester();
29  
30      @Rule
31      public JedisTester offlineJedisTester = new JedisTester(false);
32  
33      private final RequestContext requestContext = new DefaultRequestContext(() -> "txn-it-test");
34      private final MetricsCollector metricsCollector = new DefaultMetricsCollector(() -> requestContext);
35  
36      private RedisTransactionalExternalCache<String> cache;
37      private TransactionalExternalCache<String> wrappedCache;
38      private RedisDirectExternalCache<String> directCache;
39  
40      private RedisTransactionalExternalCache<String> offlineCache; // Points to a non-responsive memcached
41      private RedisDirectExternalCache<String> offlineDirectCache;
42  
43      @Override
44      protected TransactionalExternalCache<String> cache() {
45          return wrappedCache;
46      }
47  
48      @Override
49      protected DirectExternalCache<String> directCache() {
50          return directCache;
51      }
52  
53      @Override
54      protected TransactionalExternalCache<String> offlineCache() {
55          return offlineCache;
56      }
57  
58      @Override
59      protected DirectExternalCache<String> offlineDirectCache() {
60          return offlineDirectCache;
61      }
62  
63      @Override
64      protected void directCacheRefresh() {
65          directCache.refreshCacheVersion();
66      }
67  
68      @Override
69      protected void cacheTransactionSync() {
70          cache.transactionSync();
71      }
72  
73      @Override
74      protected void cacheTransactionDiscard() {
75          cache.transactionDiscard();
76      }
77  
78      @Override
79      protected void offlineCacheTransactionSync() {
80          offlineCache.transactionSync();
81      }
82  
83      @Override
84      protected void offlineCacheTransactionDiscard() {
85          offlineCache.transactionDiscard();
86      }
87  
88      @Override
89      protected RequestMetrics requestMetrics() {
90          return metricsCollector.obtainRequestMetrics(requestContext);
91      }
92  
93      @Before
94      public void ensureCache() {
95          final ExternalCacheSettings settings = new ExternalCacheSettingsBuilder()
96                  .entryGrowthRateHint(ChangeRate.LOW_CHANGE)
97                  .entryCountHint(5)
98                  .defaultTtl(Duration.ofMinutes(10))
99                  .dataChangeRateHint(ChangeRate.HIGH_CHANGE)
100                 .build();
101         cache = new RedisTransactionalExternalCache<>(
102                 jedisTester.jedisSupplier(),
103                 () -> requestContext,
104                 new Sha1ExternalCacheKeyGenerator("it-test"),
105                 CACHE_NAME,
106                 StringMarshalling.pair(),
107                 settings,
108                 new DefaultTransactionControlManager(metricsCollector, context -> {}),
109                 metricsCollector,
110                 Duration.ofSeconds(1));
111         wrappedCache = metricsCollector.wrap(cache);
112 
113         directCache = new RedisDirectExternalCache<>(
114                 jedisTester.jedisSupplier(),
115                 () -> requestContext,
116                 new Sha1ExternalCacheKeyGenerator("it-test"),
117                 CACHE_NAME,
118                 StringMarshalling.pair(),
119                 settings,
120                 Duration.ofSeconds(1));
121 
122         offlineCache = new RedisTransactionalExternalCache<>(
123                 offlineJedisTester.jedisSupplier(),
124                 () -> requestContext,
125                 new Sha1ExternalCacheKeyGenerator("it-test-offline"),
126                 CACHE_NAME + ".offline",
127                 StringMarshalling.pair(),
128                 settings,
129                 new DefaultTransactionControlManager(metricsCollector, context -> {}),
130                 metricsCollector,
131                 Duration.ofSeconds(1));
132         wrappedCache = metricsCollector.wrap(cache);
133 
134         offlineDirectCache = new RedisDirectExternalCache<>(
135                 offlineJedisTester.jedisSupplier(),
136                 () -> requestContext,
137                 new Sha1ExternalCacheKeyGenerator("it-test-offline"),
138                 CACHE_NAME + ".offline",
139                 StringMarshalling.pair(),
140                 settings,
141                 Duration.ofSeconds(1));
142 
143         // Start from a clean slate
144         final CompletionStage<Void> rm = directCache.removeAll();
145         assertThat(rm, successful());
146     }
147 }