|
58 | 58 |
|
59 | 59 | import static org.opensearch.cache.common.tier.TieredSpilloverCache.ZERO_SEGMENT_COUNT_EXCEPTION_MESSAGE;
|
60 | 60 | import static org.opensearch.cache.common.tier.TieredSpilloverCacheSettings.DISK_CACHE_ENABLED_SETTING_MAP;
|
| 61 | +import static org.opensearch.cache.common.tier.TieredSpilloverCacheSettings.MIN_DISK_CACHE_SIZE_IN_BYTES; |
61 | 62 | import static org.opensearch.cache.common.tier.TieredSpilloverCacheSettings.TIERED_SPILLOVER_ONHEAP_STORE_SIZE;
|
62 | 63 | import static org.opensearch.cache.common.tier.TieredSpilloverCacheSettings.TIERED_SPILLOVER_SEGMENTS;
|
63 | 64 | import static org.opensearch.cache.common.tier.TieredSpilloverCacheSettings.TOOK_TIME_POLICY_CONCRETE_SETTINGS_MAP;
|
@@ -2112,6 +2113,134 @@ public void testTieredCacheDefaultSegmentCount() {
|
2112 | 2113 | assertTrue(VALID_SEGMENT_COUNT_VALUES.contains(tieredSpilloverCache.getNumberOfSegments()));
|
2113 | 2114 | }
|
2114 | 2115 |
|
| 2116 | + public void testSegmentSizesWhenUsingFactory() { |
| 2117 | + // The TSC's tier size settings, TIERED_SPILLOVER_ONHEAP_STORE_SIZE and TIERED_SPILLOVER_DISK_STORE_SIZE, |
| 2118 | + // should always be respected, overriding the individual implementation's size settings if present |
| 2119 | + long expectedHeapSize = 256L * between(10, 20); |
| 2120 | + long expectedDiskSize = MIN_DISK_CACHE_SIZE_IN_BYTES + 256L * between(30, 40); |
| 2121 | + long heapSizeFromImplSetting = 50; |
| 2122 | + int diskSizeFromImplSetting = 50; |
| 2123 | + int numSegments = getNumberOfSegments(); |
| 2124 | + |
| 2125 | + int keyValueSize = 1; |
| 2126 | + MockCacheRemovalListener<String, String> removalListener = new MockCacheRemovalListener<>(); |
| 2127 | + Settings settings = Settings.builder() |
| 2128 | + .put( |
| 2129 | + CacheSettings.getConcreteStoreNameSettingForCacheType(CacheType.INDICES_REQUEST_CACHE).getKey(), |
| 2130 | + TieredSpilloverCache.TieredSpilloverCacheFactory.TIERED_SPILLOVER_CACHE_NAME |
| 2131 | + ) |
| 2132 | + .put( |
| 2133 | + TieredSpilloverCacheSettings.TIERED_SPILLOVER_ONHEAP_STORE_NAME.getConcreteSettingForNamespace( |
| 2134 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2135 | + ).getKey(), |
| 2136 | + OpenSearchOnHeapCache.OpenSearchOnHeapCacheFactory.NAME |
| 2137 | + ) |
| 2138 | + .put( |
| 2139 | + TieredSpilloverCacheSettings.TIERED_SPILLOVER_DISK_STORE_NAME.getConcreteSettingForNamespace( |
| 2140 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2141 | + ).getKey(), |
| 2142 | + MockDiskCache.MockDiskCacheFactory.NAME |
| 2143 | + ) |
| 2144 | + // These two size settings should be honored |
| 2145 | + .put( |
| 2146 | + TieredSpilloverCacheSettings.TIERED_SPILLOVER_ONHEAP_STORE_SIZE.getConcreteSettingForNamespace( |
| 2147 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2148 | + ).getKey(), |
| 2149 | + expectedHeapSize + "b" |
| 2150 | + ) |
| 2151 | + .put( |
| 2152 | + TieredSpilloverCacheSettings.TIERED_SPILLOVER_DISK_STORE_SIZE.getConcreteSettingForNamespace( |
| 2153 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2154 | + ).getKey(), |
| 2155 | + expectedDiskSize |
| 2156 | + ) |
| 2157 | + // The size setting from the OpenSearchOnHeap implementation should not be honored |
| 2158 | + .put( |
| 2159 | + OpenSearchOnHeapCacheSettings.MAXIMUM_SIZE_IN_BYTES.getConcreteSettingForNamespace( |
| 2160 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2161 | + ).getKey(), |
| 2162 | + heapSizeFromImplSetting + "b" |
| 2163 | + ) |
| 2164 | + .put(FeatureFlags.PLUGGABLE_CACHE, "true") |
| 2165 | + .put( |
| 2166 | + TIERED_SPILLOVER_SEGMENTS.getConcreteSettingForNamespace(CacheType.INDICES_REQUEST_CACHE.getSettingPrefix()).getKey(), |
| 2167 | + numSegments |
| 2168 | + ) |
| 2169 | + .build(); |
| 2170 | + String storagePath = getStoragePath(settings); |
| 2171 | + |
| 2172 | + TieredSpilloverCache<String, String> tieredSpilloverCache = (TieredSpilloverCache< |
| 2173 | + String, |
| 2174 | + String>) new TieredSpilloverCache.TieredSpilloverCacheFactory().create( |
| 2175 | + new CacheConfig.Builder<String, String>().setKeyType(String.class) |
| 2176 | + .setKeyType(String.class) |
| 2177 | + .setWeigher((k, v) -> keyValueSize) |
| 2178 | + .setRemovalListener(removalListener) |
| 2179 | + .setKeySerializer(new StringSerializer()) |
| 2180 | + .setValueSerializer(new StringSerializer()) |
| 2181 | + .setSettings(settings) |
| 2182 | + .setDimensionNames(dimensionNames) |
| 2183 | + .setCachedResultParser(s -> new CachedQueryResult.PolicyValues(20_000_000L)) // Values will always appear to have taken |
| 2184 | + // 20_000_000 ns = 20 ms to compute |
| 2185 | + .setClusterSettings(clusterSettings) |
| 2186 | + .setStoragePath(storagePath) |
| 2187 | + .build(), |
| 2188 | + CacheType.INDICES_REQUEST_CACHE, |
| 2189 | + Map.of( |
| 2190 | + OpenSearchOnHeapCache.OpenSearchOnHeapCacheFactory.NAME, |
| 2191 | + new OpenSearchOnHeapCache.OpenSearchOnHeapCacheFactory(), |
| 2192 | + MockDiskCache.MockDiskCacheFactory.NAME, |
| 2193 | + // The size value passed in here acts as the "implementation setting" for the disk tier, and should also be ignored |
| 2194 | + new MockDiskCache.MockDiskCacheFactory(0, diskSizeFromImplSetting, false, keyValueSize) |
| 2195 | + ) |
| 2196 | + ); |
| 2197 | + checkSegmentSizes(tieredSpilloverCache, expectedHeapSize, expectedDiskSize); |
| 2198 | + } |
| 2199 | + |
| 2200 | + public void testSegmentSizesWhenNotUsingFactory() { |
| 2201 | + long expectedHeapSize = 256L * between(10, 20); |
| 2202 | + long expectedDiskSize = MIN_DISK_CACHE_SIZE_IN_BYTES + 256L * between(30, 40); |
| 2203 | + int heapSizeFromImplSetting = 50; |
| 2204 | + int diskSizeFromImplSetting = 50; |
| 2205 | + |
| 2206 | + Settings settings = Settings.builder() |
| 2207 | + .put( |
| 2208 | + CacheSettings.getConcreteStoreNameSettingForCacheType(CacheType.INDICES_REQUEST_CACHE).getKey(), |
| 2209 | + TieredSpilloverCache.TieredSpilloverCacheFactory.TIERED_SPILLOVER_CACHE_NAME |
| 2210 | + ) |
| 2211 | + .put(FeatureFlags.PLUGGABLE_CACHE, "true") |
| 2212 | + // The size setting from the OpenSearchOnHeapCache implementation should not be honored |
| 2213 | + .put( |
| 2214 | + OpenSearchOnHeapCacheSettings.MAXIMUM_SIZE_IN_BYTES.getConcreteSettingForNamespace( |
| 2215 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2216 | + ).getKey(), |
| 2217 | + heapSizeFromImplSetting + "b" |
| 2218 | + ) |
| 2219 | + .build(); |
| 2220 | + |
| 2221 | + int keyValueSize = 1; |
| 2222 | + MockCacheRemovalListener<String, String> removalListener = new MockCacheRemovalListener<>(); |
| 2223 | + int numSegments = getNumberOfSegments(); |
| 2224 | + CacheConfig<String, String> cacheConfig = getCacheConfig(1, settings, removalListener, numSegments); |
| 2225 | + TieredSpilloverCache<String, String> tieredSpilloverCache = getTieredSpilloverCache( |
| 2226 | + new OpenSearchOnHeapCache.OpenSearchOnHeapCacheFactory(), |
| 2227 | + new MockDiskCache.MockDiskCacheFactory(0, diskSizeFromImplSetting, true, keyValueSize), |
| 2228 | + cacheConfig, |
| 2229 | + null, |
| 2230 | + removalListener, |
| 2231 | + numSegments, |
| 2232 | + expectedHeapSize, |
| 2233 | + expectedDiskSize |
| 2234 | + ); |
| 2235 | + checkSegmentSizes(tieredSpilloverCache, expectedHeapSize, expectedDiskSize); |
| 2236 | + } |
| 2237 | + |
| 2238 | + private void checkSegmentSizes(TieredSpilloverCache<String, String> cache, long expectedHeapSize, long expectedDiskSize) { |
| 2239 | + TieredSpilloverCache.TieredSpilloverCacheSegment<String, String> segment = cache.tieredSpilloverCacheSegments[0]; |
| 2240 | + assertEquals(expectedHeapSize / cache.getNumberOfSegments(), segment.getOnHeapCacheMaxWeight()); |
| 2241 | + assertEquals(expectedDiskSize / cache.getNumberOfSegments(), segment.getDiskCacheMaxWeight()); |
| 2242 | + } |
| 2243 | + |
2115 | 2244 | public void testDropStatsForDimensions() throws Exception {
|
2116 | 2245 | int onHeapCacheSize = randomIntBetween(300, 600);
|
2117 | 2246 | int diskCacheSize = randomIntBetween(700, 1200);
|
@@ -2455,9 +2584,9 @@ private void verifyComputeIfAbsentThrowsException(
|
2455 | 2584 | MockCacheRemovalListener<String, String> removalListener = new MockCacheRemovalListener<>();
|
2456 | 2585 | Settings settings = Settings.builder()
|
2457 | 2586 | .put(
|
2458 |
| - OpenSearchOnHeapCacheSettings.getSettingListForCacheType(CacheType.INDICES_REQUEST_CACHE) |
2459 |
| - .get(MAXIMUM_SIZE_IN_BYTES_KEY) |
2460 |
| - .getKey(), |
| 2587 | + TieredSpilloverCacheSettings.TIERED_SPILLOVER_ONHEAP_STORE_SIZE.getConcreteSettingForNamespace( |
| 2588 | + CacheType.INDICES_REQUEST_CACHE.getSettingPrefix() |
| 2589 | + ).getKey(), |
2461 | 2590 | onHeapCacheSize * keyValueSize + "b"
|
2462 | 2591 | )
|
2463 | 2592 | .build();
|
|
0 commit comments