1 /* 2 * Copyright (C) 2017, Google Inc. and others 3 * 4 * This program and the accompanying materials are made available under the 5 * terms of the Eclipse Distribution License v. 1.0 which is available at 6 * https://www.eclipse.org/org/documents/edl-v10.php. 7 * 8 * SPDX-License-Identifier: BSD-3-Clause 9 */ 10 11 package org.eclipse.jgit.internal.storage.reftable; 12 13 import static org.eclipse.jgit.internal.storage.reftable.ReftableConstants.MAX_BLOCK_SIZE; 14 15 import org.eclipse.jgit.lib.Config; 16 import org.eclipse.jgit.lib.Repository; 17 18 /** 19 * Configuration used by a reftable writer when constructing the stream. 20 */ 21 public class ReftableConfig { 22 private int refBlockSize = 4 << 10; 23 private int logBlockSize; 24 private int restartInterval; 25 private int maxIndexLevels; 26 private boolean alignBlocks = true; 27 private boolean indexObjects = true; 28 29 /** 30 * Create a default configuration. 31 */ 32 public ReftableConfig() { 33 } 34 35 /** 36 * Create a configuration honoring the repository's settings. 37 * 38 * @param db 39 * the repository to read settings from. The repository is not 40 * retained by the new configuration, instead its settings are 41 * copied during the constructor. 42 */ 43 public ReftableConfig(Repository db) { 44 fromConfig(db.getConfig()); 45 } 46 47 /** 48 * Create a configuration honoring settings in a 49 * {@link org.eclipse.jgit.lib.Config}. 50 * 51 * @param cfg 52 * the source to read settings from. The source is not retained 53 * by the new configuration, instead its settings are copied 54 * during the constructor. 55 */ 56 public ReftableConfig(Config cfg) { 57 fromConfig(cfg); 58 } 59 60 /** 61 * Copy an existing configuration to a new instance. 62 * 63 * @param cfg 64 * the source configuration to copy from. 65 */ 66 public ReftableConfig="../../../../../../org/eclipse/jgit/internal/storage/reftable/ReftableConfig.html#ReftableConfig">ReftableConfig(ReftableConfig cfg) { 67 this.refBlockSize = cfg.refBlockSize; 68 this.logBlockSize = cfg.logBlockSize; 69 this.restartInterval = cfg.restartInterval; 70 this.maxIndexLevels = cfg.maxIndexLevels; 71 this.alignBlocks = cfg.alignBlocks; 72 this.indexObjects = cfg.indexObjects; 73 } 74 75 /** 76 * Get desired output block size for references, in bytes. 77 * 78 * @return desired output block size for references, in bytes. 79 */ 80 public int getRefBlockSize() { 81 return refBlockSize; 82 } 83 84 /** 85 * Set desired output block size for references, in bytes. 86 * 87 * @param szBytes 88 * desired output block size for references, in bytes. 89 */ 90 public void setRefBlockSize(int szBytes) { 91 if (szBytes > MAX_BLOCK_SIZE) { 92 throw new IllegalArgumentException(); 93 } 94 refBlockSize = Math.max(0, szBytes); 95 } 96 97 /** 98 * Get desired output block size for log entries, in bytes. 99 * 100 * @return desired output block size for log entries, in bytes. If 0 the 101 * writer will default to {@code 2 * getRefBlockSize()}. 102 */ 103 public int getLogBlockSize() { 104 return logBlockSize; 105 } 106 107 /** 108 * Set desired output block size for log entries, in bytes. 109 * 110 * @param szBytes 111 * desired output block size for log entries, in bytes. If 0 will 112 * default to {@code 2 * getRefBlockSize()}. 113 */ 114 public void setLogBlockSize(int szBytes) { 115 if (szBytes > MAX_BLOCK_SIZE) { 116 throw new IllegalArgumentException(); 117 } 118 logBlockSize = Math.max(0, szBytes); 119 } 120 121 /** 122 * Get number of references between binary search markers. 123 * 124 * @return number of references between binary search markers. 125 */ 126 public int getRestartInterval() { 127 return restartInterval; 128 } 129 130 /** 131 * <p>Setter for the field <code>restartInterval</code>.</p> 132 * 133 * @param interval 134 * number of references between binary search markers. If 135 * {@code interval} is 0 (default), the writer will select a 136 * default value based on the block size. 137 */ 138 public void setRestartInterval(int interval) { 139 restartInterval = Math.max(0, interval); 140 } 141 142 /** 143 * Get maximum depth of the index; 0 for unlimited. 144 * 145 * @return maximum depth of the index; 0 for unlimited. 146 */ 147 public int getMaxIndexLevels() { 148 return maxIndexLevels; 149 } 150 151 /** 152 * Set maximum number of levels to use in indexes. 153 * 154 * @param levels 155 * maximum number of levels to use in indexes. Lower levels of 156 * the index respect {@link #getRefBlockSize()}, and the highest 157 * level may exceed that if the number of levels is limited. 158 */ 159 public void setMaxIndexLevels(int levels) { 160 maxIndexLevels = Math.max(0, levels); 161 } 162 163 /** 164 * Whether the writer should align blocks. 165 * 166 * @return {@code true} if the writer should align blocks. 167 */ 168 public boolean isAlignBlocks() { 169 return alignBlocks; 170 } 171 172 /** 173 * Whether blocks are written aligned to multiples of 174 * {@link #getRefBlockSize()}. 175 * 176 * @param align 177 * if {@code true} blocks are written aligned to multiples of 178 * {@link #getRefBlockSize()}. May increase file size due to NUL 179 * padding bytes added between blocks. Default is {@code true}. 180 */ 181 public void setAlignBlocks(boolean align) { 182 alignBlocks = align; 183 } 184 185 /** 186 * Whether the writer should index object to ref. 187 * 188 * @return {@code true} if the writer should index object to ref. 189 */ 190 public boolean isIndexObjects() { 191 return indexObjects; 192 } 193 194 /** 195 * Whether the reftable may include additional storage to efficiently map 196 * from {@code ObjectId} to reference names. 197 * 198 * @param index 199 * if {@code true} the reftable may include additional storage to 200 * efficiently map from {@code ObjectId} to reference names. By 201 * default, {@code true}. 202 */ 203 public void setIndexObjects(boolean index) { 204 indexObjects = index; 205 } 206 207 /** 208 * Update properties by setting fields from the configuration. 209 * 210 * If a property's corresponding variable is not defined in the supplied 211 * configuration, then it is left unmodified. 212 * 213 * @param rc 214 * configuration to read properties from. 215 */ 216 public void fromConfig(Config rc) { 217 refBlockSize = rc.getInt("reftable", "blockSize", refBlockSize); //$NON-NLS-1$ //$NON-NLS-2$ 218 logBlockSize = rc.getInt("reftable", "logBlockSize", logBlockSize); //$NON-NLS-1$ //$NON-NLS-2$ 219 restartInterval = rc.getInt("reftable", "restartInterval", restartInterval); //$NON-NLS-1$ //$NON-NLS-2$ 220 maxIndexLevels = rc.getInt("reftable", "indexLevels", maxIndexLevels); //$NON-NLS-1$ //$NON-NLS-2$ 221 alignBlocks = rc.getBoolean("reftable", "alignBlocks", alignBlocks); //$NON-NLS-1$ //$NON-NLS-2$ 222 indexObjects = rc.getBoolean("reftable", "indexObjects", indexObjects); //$NON-NLS-1$ //$NON-NLS-2$ 223 } 224 }