1 /*
2 * Copyright (C) 2017, Google Inc.
3 * and other copyright owners as documented in the project's IP log.
4 *
5 * This program and the accompanying materials are made available
6 * under the terms of the Eclipse Distribution License v1.0 which
7 * accompanies this distribution, is reproduced below, and is
8 * available at http://www.eclipse.org/org/documents/edl-v10.php
9 *
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or
13 * without modification, are permitted provided that the following
14 * conditions are met:
15 *
16 * - Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 *
19 * - Redistributions in binary form must reproduce the above
20 * copyright notice, this list of conditions and the following
21 * disclaimer in the documentation and/or other materials provided
22 * with the distribution.
23 *
24 * - Neither the name of the Eclipse Foundation, Inc. nor the
25 * names of its contributors may be used to endorse or promote
26 * products derived from this software without specific prior
27 * written permission.
28 *
29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
30 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
31 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
34 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 */
43
44 package org.eclipse.jgit.internal.storage.reftable;
45
46 import static org.eclipse.jgit.internal.storage.reftable.ReftableConstants.MAX_BLOCK_SIZE;
47
48 import org.eclipse.jgit.lib.Config;
49 import org.eclipse.jgit.lib.Repository;
50
51 /**
52 * Configuration used by a reftable writer when constructing the stream.
53 */
54 public class ReftableConfig {
55 private int refBlockSize = 4 << 10;
56 private int logBlockSize;
57 private int restartInterval;
58 private int maxIndexLevels;
59 private boolean alignBlocks = true;
60 private boolean indexObjects = true;
61
62 /**
63 * Create a default configuration.
64 */
65 public ReftableConfig() {
66 }
67
68 /**
69 * Create a configuration honoring the repository's settings.
70 *
71 * @param db
72 * the repository to read settings from. The repository is not
73 * retained by the new configuration, instead its settings are
74 * copied during the constructor.
75 */
76 public ReftableConfig(Repository db) {
77 fromConfig(db.getConfig());
78 }
79
80 /**
81 * Create a configuration honoring settings in a
82 * {@link org.eclipse.jgit.lib.Config}.
83 *
84 * @param cfg
85 * the source to read settings from. The source is not retained
86 * by the new configuration, instead its settings are copied
87 * during the constructor.
88 */
89 public ReftableConfig(Config cfg) {
90 fromConfig(cfg);
91 }
92
93 /**
94 * Copy an existing configuration to a new instance.
95 *
96 * @param cfg
97 * the source configuration to copy from.
98 */
99 public ReftableConfig="../../../../../../org/eclipse/jgit/internal/storage/reftable/ReftableConfig.html#ReftableConfig">ReftableConfig(ReftableConfig cfg) {
100 this.refBlockSize = cfg.refBlockSize;
101 this.logBlockSize = cfg.logBlockSize;
102 this.restartInterval = cfg.restartInterval;
103 this.maxIndexLevels = cfg.maxIndexLevels;
104 this.alignBlocks = cfg.alignBlocks;
105 this.indexObjects = cfg.indexObjects;
106 }
107
108 /**
109 * Get desired output block size for references, in bytes.
110 *
111 * @return desired output block size for references, in bytes.
112 */
113 public int getRefBlockSize() {
114 return refBlockSize;
115 }
116
117 /**
118 * Set desired output block size for references, in bytes.
119 *
120 * @param szBytes
121 * desired output block size for references, in bytes.
122 */
123 public void setRefBlockSize(int szBytes) {
124 if (szBytes > MAX_BLOCK_SIZE) {
125 throw new IllegalArgumentException();
126 }
127 refBlockSize = Math.max(0, szBytes);
128 }
129
130 /**
131 * Get desired output block size for log entries, in bytes.
132 *
133 * @return desired output block size for log entries, in bytes. If 0 the
134 * writer will default to {@code 2 * getRefBlockSize()}.
135 */
136 public int getLogBlockSize() {
137 return logBlockSize;
138 }
139
140 /**
141 * Set desired output block size for log entries, in bytes.
142 *
143 * @param szBytes
144 * desired output block size for log entries, in bytes. If 0 will
145 * default to {@code 2 * getRefBlockSize()}.
146 */
147 public void setLogBlockSize(int szBytes) {
148 if (szBytes > MAX_BLOCK_SIZE) {
149 throw new IllegalArgumentException();
150 }
151 logBlockSize = Math.max(0, szBytes);
152 }
153
154 /**
155 * Get number of references between binary search markers.
156 *
157 * @return number of references between binary search markers.
158 */
159 public int getRestartInterval() {
160 return restartInterval;
161 }
162
163 /**
164 * <p>Setter for the field <code>restartInterval</code>.</p>
165 *
166 * @param interval
167 * number of references between binary search markers. If
168 * {@code interval} is 0 (default), the writer will select a
169 * default value based on the block size.
170 */
171 public void setRestartInterval(int interval) {
172 restartInterval = Math.max(0, interval);
173 }
174
175 /**
176 * Get maximum depth of the index; 0 for unlimited.
177 *
178 * @return maximum depth of the index; 0 for unlimited.
179 */
180 public int getMaxIndexLevels() {
181 return maxIndexLevels;
182 }
183
184 /**
185 * Set maximum number of levels to use in indexes.
186 *
187 * @param levels
188 * maximum number of levels to use in indexes. Lower levels of
189 * the index respect {@link #getRefBlockSize()}, and the highest
190 * level may exceed that if the number of levels is limited.
191 */
192 public void setMaxIndexLevels(int levels) {
193 maxIndexLevels = Math.max(0, levels);
194 }
195
196 /**
197 * Whether the writer should align blocks.
198 *
199 * @return {@code true} if the writer should align blocks.
200 */
201 public boolean isAlignBlocks() {
202 return alignBlocks;
203 }
204
205 /**
206 * Whether blocks are written aligned to multiples of
207 * {@link #getRefBlockSize()}.
208 *
209 * @param align
210 * if {@code true} blocks are written aligned to multiples of
211 * {@link #getRefBlockSize()}. May increase file size due to NUL
212 * padding bytes added between blocks. Default is {@code true}.
213 */
214 public void setAlignBlocks(boolean align) {
215 alignBlocks = align;
216 }
217
218 /**
219 * Whether the writer should index object to ref.
220 *
221 * @return {@code true} if the writer should index object to ref.
222 */
223 public boolean isIndexObjects() {
224 return indexObjects;
225 }
226
227 /**
228 * Whether the reftable may include additional storage to efficiently map
229 * from {@code ObjectId} to reference names.
230 *
231 * @param index
232 * if {@code true} the reftable may include additional storage to
233 * efficiently map from {@code ObjectId} to reference names. By
234 * default, {@code true}.
235 */
236 public void setIndexObjects(boolean index) {
237 indexObjects = index;
238 }
239
240 /**
241 * Update properties by setting fields from the configuration.
242 *
243 * If a property's corresponding variable is not defined in the supplied
244 * configuration, then it is left unmodified.
245 *
246 * @param rc
247 * configuration to read properties from.
248 */
249 public void fromConfig(Config rc) {
250 refBlockSize = rc.getInt("reftable", "blockSize", refBlockSize); //$NON-NLS-1$ //$NON-NLS-2$
251 logBlockSize = rc.getInt("reftable", "logBlockSize", logBlockSize); //$NON-NLS-1$ //$NON-NLS-2$
252 restartInterval = rc.getInt("reftable", "restartInterval", restartInterval); //$NON-NLS-1$ //$NON-NLS-2$
253 maxIndexLevels = rc.getInt("reftable", "indexLevels", maxIndexLevels); //$NON-NLS-1$ //$NON-NLS-2$
254 alignBlocks = rc.getBoolean("reftable", "alignBlocks", alignBlocks); //$NON-NLS-1$ //$NON-NLS-2$
255 indexObjects = rc.getBoolean("reftable", "indexObjects", indexObjects); //$NON-NLS-1$ //$NON-NLS-2$
256 }
257 }