1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 6 package org.rocksdb; 7 8 import java.util.*; 9 10 public class MutableColumnFamilyOptions 11 extends AbstractMutableOptions { 12 13 /** 14 * User must use builder pattern, or parser. 15 * 16 * @param keys the keys 17 * @param values the values 18 * 19 * See {@link #builder()} and {@link #parse(String)}. 20 */ MutableColumnFamilyOptions(final String[] keys, final String[] values)21 private MutableColumnFamilyOptions(final String[] keys, 22 final String[] values) { 23 super(keys, values); 24 } 25 26 /** 27 * Creates a builder which allows you 28 * to set MutableColumnFamilyOptions in a fluent 29 * manner 30 * 31 * @return A builder for MutableColumnFamilyOptions 32 */ builder()33 public static MutableColumnFamilyOptionsBuilder builder() { 34 return new MutableColumnFamilyOptionsBuilder(); 35 } 36 37 /** 38 * Parses a String representation of MutableColumnFamilyOptions 39 * 40 * The format is: key1=value1;key2=value2;key3=value3 etc 41 * 42 * For int[] values, each int should be separated by a comma, e.g. 43 * 44 * key1=value1;intArrayKey1=1,2,3 45 * 46 * @param str The string representation of the mutable column family options 47 * 48 * @return A builder for the mutable column family options 49 */ parse(final String str)50 public static MutableColumnFamilyOptionsBuilder parse(final String str) { 51 Objects.requireNonNull(str); 52 53 final MutableColumnFamilyOptionsBuilder builder = 54 new MutableColumnFamilyOptionsBuilder(); 55 56 final String[] options = str.trim().split(KEY_VALUE_PAIR_SEPARATOR); 57 for(final String option : options) { 58 final int equalsOffset = option.indexOf(KEY_VALUE_SEPARATOR); 59 if(equalsOffset <= 0) { 60 throw new IllegalArgumentException( 61 "options string has an invalid key=value pair"); 62 } 63 64 final String key = option.substring(0, equalsOffset); 65 if(key.isEmpty()) { 66 throw new IllegalArgumentException("options string is invalid"); 67 } 68 69 final String value = option.substring(equalsOffset + 1); 70 if(value.isEmpty()) { 71 throw new IllegalArgumentException("options string is invalid"); 72 } 73 74 builder.fromString(key, value); 75 } 76 77 return builder; 78 } 79 80 private interface MutableColumnFamilyOptionKey extends MutableOptionKey {} 81 82 public enum MemtableOption implements MutableColumnFamilyOptionKey { 83 write_buffer_size(ValueType.LONG), 84 arena_block_size(ValueType.LONG), 85 memtable_prefix_bloom_size_ratio(ValueType.DOUBLE), 86 @Deprecated memtable_prefix_bloom_bits(ValueType.INT), 87 @Deprecated memtable_prefix_bloom_probes(ValueType.INT), 88 memtable_huge_page_size(ValueType.LONG), 89 max_successive_merges(ValueType.LONG), 90 @Deprecated filter_deletes(ValueType.BOOLEAN), 91 max_write_buffer_number(ValueType.INT), 92 inplace_update_num_locks(ValueType.LONG); 93 94 private final ValueType valueType; MemtableOption(final ValueType valueType)95 MemtableOption(final ValueType valueType) { 96 this.valueType = valueType; 97 } 98 99 @Override getValueType()100 public ValueType getValueType() { 101 return valueType; 102 } 103 } 104 105 public enum CompactionOption implements MutableColumnFamilyOptionKey { 106 disable_auto_compactions(ValueType.BOOLEAN), 107 @Deprecated soft_rate_limit(ValueType.DOUBLE), 108 soft_pending_compaction_bytes_limit(ValueType.LONG), 109 @Deprecated hard_rate_limit(ValueType.DOUBLE), 110 hard_pending_compaction_bytes_limit(ValueType.LONG), 111 level0_file_num_compaction_trigger(ValueType.INT), 112 level0_slowdown_writes_trigger(ValueType.INT), 113 level0_stop_writes_trigger(ValueType.INT), 114 max_compaction_bytes(ValueType.LONG), 115 target_file_size_base(ValueType.LONG), 116 target_file_size_multiplier(ValueType.INT), 117 max_bytes_for_level_base(ValueType.LONG), 118 max_bytes_for_level_multiplier(ValueType.INT), 119 max_bytes_for_level_multiplier_additional(ValueType.INT_ARRAY), 120 ttl(ValueType.LONG); 121 122 private final ValueType valueType; CompactionOption(final ValueType valueType)123 CompactionOption(final ValueType valueType) { 124 this.valueType = valueType; 125 } 126 127 @Override getValueType()128 public ValueType getValueType() { 129 return valueType; 130 } 131 } 132 133 public enum MiscOption implements MutableColumnFamilyOptionKey { 134 max_sequential_skip_in_iterations(ValueType.LONG), 135 paranoid_file_checks(ValueType.BOOLEAN), 136 report_bg_io_stats(ValueType.BOOLEAN), 137 compression_type(ValueType.ENUM); 138 139 private final ValueType valueType; MiscOption(final ValueType valueType)140 MiscOption(final ValueType valueType) { 141 this.valueType = valueType; 142 } 143 144 @Override getValueType()145 public ValueType getValueType() { 146 return valueType; 147 } 148 } 149 150 public static class MutableColumnFamilyOptionsBuilder 151 extends AbstractMutableOptionsBuilder<MutableColumnFamilyOptions, MutableColumnFamilyOptionsBuilder, MutableColumnFamilyOptionKey> 152 implements MutableColumnFamilyOptionsInterface<MutableColumnFamilyOptionsBuilder> { 153 154 private final static Map<String, MutableColumnFamilyOptionKey> ALL_KEYS_LOOKUP = new HashMap<>(); 155 static { 156 for(final MutableColumnFamilyOptionKey key : MemtableOption.values()) { key.name()157 ALL_KEYS_LOOKUP.put(key.name(), key); 158 } 159 160 for(final MutableColumnFamilyOptionKey key : CompactionOption.values()) { key.name()161 ALL_KEYS_LOOKUP.put(key.name(), key); 162 } 163 164 for(final MutableColumnFamilyOptionKey key : MiscOption.values()) { key.name()165 ALL_KEYS_LOOKUP.put(key.name(), key); 166 } 167 } 168 MutableColumnFamilyOptionsBuilder()169 private MutableColumnFamilyOptionsBuilder() { 170 super(); 171 } 172 173 @Override self()174 protected MutableColumnFamilyOptionsBuilder self() { 175 return this; 176 } 177 178 @Override allKeys()179 protected Map<String, MutableColumnFamilyOptionKey> allKeys() { 180 return ALL_KEYS_LOOKUP; 181 } 182 183 @Override build(final String[] keys, final String[] values)184 protected MutableColumnFamilyOptions build(final String[] keys, 185 final String[] values) { 186 return new MutableColumnFamilyOptions(keys, values); 187 } 188 189 @Override setWriteBufferSize( final long writeBufferSize)190 public MutableColumnFamilyOptionsBuilder setWriteBufferSize( 191 final long writeBufferSize) { 192 return setLong(MemtableOption.write_buffer_size, writeBufferSize); 193 } 194 195 @Override writeBufferSize()196 public long writeBufferSize() { 197 return getLong(MemtableOption.write_buffer_size); 198 } 199 200 @Override setArenaBlockSize( final long arenaBlockSize)201 public MutableColumnFamilyOptionsBuilder setArenaBlockSize( 202 final long arenaBlockSize) { 203 return setLong(MemtableOption.arena_block_size, arenaBlockSize); 204 } 205 206 @Override arenaBlockSize()207 public long arenaBlockSize() { 208 return getLong(MemtableOption.arena_block_size); 209 } 210 211 @Override setMemtablePrefixBloomSizeRatio( final double memtablePrefixBloomSizeRatio)212 public MutableColumnFamilyOptionsBuilder setMemtablePrefixBloomSizeRatio( 213 final double memtablePrefixBloomSizeRatio) { 214 return setDouble(MemtableOption.memtable_prefix_bloom_size_ratio, 215 memtablePrefixBloomSizeRatio); 216 } 217 218 @Override memtablePrefixBloomSizeRatio()219 public double memtablePrefixBloomSizeRatio() { 220 return getDouble(MemtableOption.memtable_prefix_bloom_size_ratio); 221 } 222 223 @Override setMemtableHugePageSize( final long memtableHugePageSize)224 public MutableColumnFamilyOptionsBuilder setMemtableHugePageSize( 225 final long memtableHugePageSize) { 226 return setLong(MemtableOption.memtable_huge_page_size, 227 memtableHugePageSize); 228 } 229 230 @Override memtableHugePageSize()231 public long memtableHugePageSize() { 232 return getLong(MemtableOption.memtable_huge_page_size); 233 } 234 235 @Override setMaxSuccessiveMerges( final long maxSuccessiveMerges)236 public MutableColumnFamilyOptionsBuilder setMaxSuccessiveMerges( 237 final long maxSuccessiveMerges) { 238 return setLong(MemtableOption.max_successive_merges, maxSuccessiveMerges); 239 } 240 241 @Override maxSuccessiveMerges()242 public long maxSuccessiveMerges() { 243 return getLong(MemtableOption.max_successive_merges); 244 } 245 246 @Override setMaxWriteBufferNumber( final int maxWriteBufferNumber)247 public MutableColumnFamilyOptionsBuilder setMaxWriteBufferNumber( 248 final int maxWriteBufferNumber) { 249 return setInt(MemtableOption.max_write_buffer_number, 250 maxWriteBufferNumber); 251 } 252 253 @Override maxWriteBufferNumber()254 public int maxWriteBufferNumber() { 255 return getInt(MemtableOption.max_write_buffer_number); 256 } 257 258 @Override setInplaceUpdateNumLocks( final long inplaceUpdateNumLocks)259 public MutableColumnFamilyOptionsBuilder setInplaceUpdateNumLocks( 260 final long inplaceUpdateNumLocks) { 261 return setLong(MemtableOption.inplace_update_num_locks, 262 inplaceUpdateNumLocks); 263 } 264 265 @Override inplaceUpdateNumLocks()266 public long inplaceUpdateNumLocks() { 267 return getLong(MemtableOption.inplace_update_num_locks); 268 } 269 270 @Override setDisableAutoCompactions( final boolean disableAutoCompactions)271 public MutableColumnFamilyOptionsBuilder setDisableAutoCompactions( 272 final boolean disableAutoCompactions) { 273 return setBoolean(CompactionOption.disable_auto_compactions, 274 disableAutoCompactions); 275 } 276 277 @Override disableAutoCompactions()278 public boolean disableAutoCompactions() { 279 return getBoolean(CompactionOption.disable_auto_compactions); 280 } 281 282 @Override setSoftPendingCompactionBytesLimit( final long softPendingCompactionBytesLimit)283 public MutableColumnFamilyOptionsBuilder setSoftPendingCompactionBytesLimit( 284 final long softPendingCompactionBytesLimit) { 285 return setLong(CompactionOption.soft_pending_compaction_bytes_limit, 286 softPendingCompactionBytesLimit); 287 } 288 289 @Override softPendingCompactionBytesLimit()290 public long softPendingCompactionBytesLimit() { 291 return getLong(CompactionOption.soft_pending_compaction_bytes_limit); 292 } 293 294 @Override setHardPendingCompactionBytesLimit( final long hardPendingCompactionBytesLimit)295 public MutableColumnFamilyOptionsBuilder setHardPendingCompactionBytesLimit( 296 final long hardPendingCompactionBytesLimit) { 297 return setLong(CompactionOption.hard_pending_compaction_bytes_limit, 298 hardPendingCompactionBytesLimit); 299 } 300 301 @Override hardPendingCompactionBytesLimit()302 public long hardPendingCompactionBytesLimit() { 303 return getLong(CompactionOption.hard_pending_compaction_bytes_limit); 304 } 305 306 @Override setLevel0FileNumCompactionTrigger( final int level0FileNumCompactionTrigger)307 public MutableColumnFamilyOptionsBuilder setLevel0FileNumCompactionTrigger( 308 final int level0FileNumCompactionTrigger) { 309 return setInt(CompactionOption.level0_file_num_compaction_trigger, 310 level0FileNumCompactionTrigger); 311 } 312 313 @Override level0FileNumCompactionTrigger()314 public int level0FileNumCompactionTrigger() { 315 return getInt(CompactionOption.level0_file_num_compaction_trigger); 316 } 317 318 @Override setLevel0SlowdownWritesTrigger( final int level0SlowdownWritesTrigger)319 public MutableColumnFamilyOptionsBuilder setLevel0SlowdownWritesTrigger( 320 final int level0SlowdownWritesTrigger) { 321 return setInt(CompactionOption.level0_slowdown_writes_trigger, 322 level0SlowdownWritesTrigger); 323 } 324 325 @Override level0SlowdownWritesTrigger()326 public int level0SlowdownWritesTrigger() { 327 return getInt(CompactionOption.level0_slowdown_writes_trigger); 328 } 329 330 @Override setLevel0StopWritesTrigger( final int level0StopWritesTrigger)331 public MutableColumnFamilyOptionsBuilder setLevel0StopWritesTrigger( 332 final int level0StopWritesTrigger) { 333 return setInt(CompactionOption.level0_stop_writes_trigger, 334 level0StopWritesTrigger); 335 } 336 337 @Override level0StopWritesTrigger()338 public int level0StopWritesTrigger() { 339 return getInt(CompactionOption.level0_stop_writes_trigger); 340 } 341 342 @Override setMaxCompactionBytes(final long maxCompactionBytes)343 public MutableColumnFamilyOptionsBuilder setMaxCompactionBytes(final long maxCompactionBytes) { 344 return setLong(CompactionOption.max_compaction_bytes, maxCompactionBytes); 345 } 346 347 @Override maxCompactionBytes()348 public long maxCompactionBytes() { 349 return getLong(CompactionOption.max_compaction_bytes); 350 } 351 352 353 @Override setTargetFileSizeBase( final long targetFileSizeBase)354 public MutableColumnFamilyOptionsBuilder setTargetFileSizeBase( 355 final long targetFileSizeBase) { 356 return setLong(CompactionOption.target_file_size_base, 357 targetFileSizeBase); 358 } 359 360 @Override targetFileSizeBase()361 public long targetFileSizeBase() { 362 return getLong(CompactionOption.target_file_size_base); 363 } 364 365 @Override setTargetFileSizeMultiplier( final int targetFileSizeMultiplier)366 public MutableColumnFamilyOptionsBuilder setTargetFileSizeMultiplier( 367 final int targetFileSizeMultiplier) { 368 return setInt(CompactionOption.target_file_size_multiplier, 369 targetFileSizeMultiplier); 370 } 371 372 @Override targetFileSizeMultiplier()373 public int targetFileSizeMultiplier() { 374 return getInt(CompactionOption.target_file_size_multiplier); 375 } 376 377 @Override setMaxBytesForLevelBase( final long maxBytesForLevelBase)378 public MutableColumnFamilyOptionsBuilder setMaxBytesForLevelBase( 379 final long maxBytesForLevelBase) { 380 return setLong(CompactionOption.max_bytes_for_level_base, 381 maxBytesForLevelBase); 382 } 383 384 @Override maxBytesForLevelBase()385 public long maxBytesForLevelBase() { 386 return getLong(CompactionOption.max_bytes_for_level_base); 387 } 388 389 @Override setMaxBytesForLevelMultiplier( final double maxBytesForLevelMultiplier)390 public MutableColumnFamilyOptionsBuilder setMaxBytesForLevelMultiplier( 391 final double maxBytesForLevelMultiplier) { 392 return setDouble(CompactionOption.max_bytes_for_level_multiplier, maxBytesForLevelMultiplier); 393 } 394 395 @Override maxBytesForLevelMultiplier()396 public double maxBytesForLevelMultiplier() { 397 return getDouble(CompactionOption.max_bytes_for_level_multiplier); 398 } 399 400 @Override setMaxBytesForLevelMultiplierAdditional( final int[] maxBytesForLevelMultiplierAdditional)401 public MutableColumnFamilyOptionsBuilder setMaxBytesForLevelMultiplierAdditional( 402 final int[] maxBytesForLevelMultiplierAdditional) { 403 return setIntArray( 404 CompactionOption.max_bytes_for_level_multiplier_additional, 405 maxBytesForLevelMultiplierAdditional); 406 } 407 408 @Override maxBytesForLevelMultiplierAdditional()409 public int[] maxBytesForLevelMultiplierAdditional() { 410 return getIntArray( 411 CompactionOption.max_bytes_for_level_multiplier_additional); 412 } 413 414 @Override setMaxSequentialSkipInIterations( final long maxSequentialSkipInIterations)415 public MutableColumnFamilyOptionsBuilder setMaxSequentialSkipInIterations( 416 final long maxSequentialSkipInIterations) { 417 return setLong(MiscOption.max_sequential_skip_in_iterations, 418 maxSequentialSkipInIterations); 419 } 420 421 @Override maxSequentialSkipInIterations()422 public long maxSequentialSkipInIterations() { 423 return getLong(MiscOption.max_sequential_skip_in_iterations); 424 } 425 426 @Override setParanoidFileChecks( final boolean paranoidFileChecks)427 public MutableColumnFamilyOptionsBuilder setParanoidFileChecks( 428 final boolean paranoidFileChecks) { 429 return setBoolean(MiscOption.paranoid_file_checks, paranoidFileChecks); 430 } 431 432 @Override paranoidFileChecks()433 public boolean paranoidFileChecks() { 434 return getBoolean(MiscOption.paranoid_file_checks); 435 } 436 437 @Override setCompressionType( final CompressionType compressionType)438 public MutableColumnFamilyOptionsBuilder setCompressionType( 439 final CompressionType compressionType) { 440 return setEnum(MiscOption.compression_type, compressionType); 441 } 442 443 @Override compressionType()444 public CompressionType compressionType() { 445 return (CompressionType)getEnum(MiscOption.compression_type); 446 } 447 448 @Override setReportBgIoStats( final boolean reportBgIoStats)449 public MutableColumnFamilyOptionsBuilder setReportBgIoStats( 450 final boolean reportBgIoStats) { 451 return setBoolean(MiscOption.report_bg_io_stats, reportBgIoStats); 452 } 453 454 @Override reportBgIoStats()455 public boolean reportBgIoStats() { 456 return getBoolean(MiscOption.report_bg_io_stats); 457 } 458 459 @Override setTtl(final long ttl)460 public MutableColumnFamilyOptionsBuilder setTtl(final long ttl) { 461 return setLong(CompactionOption.ttl, ttl); 462 } 463 464 @Override ttl()465 public long ttl() { 466 return getLong(CompactionOption.ttl); 467 } 468 } 469 } 470