1 /*
2 * Copyright (C) 2009, 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.storage.file;
45
46 import org.eclipse.jgit.internal.storage.file.WindowCache;
47 import org.eclipse.jgit.lib.Config;
48 import org.eclipse.jgit.storage.pack.PackConfig;
49
50 /** Configuration parameters for JVM-wide buffer cache used by JGit. */
51 public class WindowCacheConfig {
52 /** 1024 (number of bytes in one kibibyte/kilobyte) */
53 public static final int KB = 1024;
54
55 /** 1024 {@link #KB} (number of bytes in one mebibyte/megabyte) */
56 public static final int MB = 1024 * KB;
57
58 private int packedGitOpenFiles;
59
60 private long packedGitLimit;
61
62 private int packedGitWindowSize;
63
64 private boolean packedGitMMAP;
65
66 private int deltaBaseCacheLimit;
67
68 private int streamFileThreshold;
69
70 /** Create a default configuration. */
71 public WindowCacheConfig() {
72 packedGitOpenFiles = 128;
73 packedGitLimit = 10 * MB;
74 packedGitWindowSize = 8 * KB;
75 packedGitMMAP = false;
76 deltaBaseCacheLimit = 10 * MB;
77 streamFileThreshold = PackConfig.DEFAULT_BIG_FILE_THRESHOLD;
78 }
79
80 /**
81 * @return maximum number of streams to open at a time. Open packs count
82 * against the process limits. <b>Default is 128.</b>
83 */
84 public int getPackedGitOpenFiles() {
85 return packedGitOpenFiles;
86 }
87
88 /**
89 * @param fdLimit
90 * maximum number of streams to open at a time. Open packs count
91 * against the process limits
92 */
93 public void setPackedGitOpenFiles(final int fdLimit) {
94 packedGitOpenFiles = fdLimit;
95 }
96
97 /**
98 * @return maximum number bytes of heap memory to dedicate to caching pack
99 * file data. <b>Default is 10 MB.</b>
100 */
101 public long getPackedGitLimit() {
102 return packedGitLimit;
103 }
104
105 /**
106 * @param newLimit
107 * maximum number bytes of heap memory to dedicate to caching
108 * pack file data.
109 */
110 public void setPackedGitLimit(final long newLimit) {
111 packedGitLimit = newLimit;
112 }
113
114 /**
115 * @return size in bytes of a single window mapped or read in from the pack
116 * file. <b>Default is 8 KB.</b>
117 */
118 public int getPackedGitWindowSize() {
119 return packedGitWindowSize;
120 }
121
122 /**
123 * @param newSize
124 * size in bytes of a single window read in from the pack file.
125 */
126 public void setPackedGitWindowSize(final int newSize) {
127 packedGitWindowSize = newSize;
128 }
129
130 /**
131 * @return true enables use of Java NIO virtual memory mapping for windows;
132 * false reads entire window into a byte[] with standard read calls.
133 * <b>Default false.</b>
134 */
135 public boolean isPackedGitMMAP() {
136 return packedGitMMAP;
137 }
138
139 /**
140 * @param usemmap
141 * true enables use of Java NIO virtual memory mapping for
142 * windows; false reads entire window into a byte[] with standard
143 * read calls.
144 */
145 public void setPackedGitMMAP(final boolean usemmap) {
146 packedGitMMAP = usemmap;
147 }
148
149 /**
150 * @return maximum number of bytes to cache in delta base cache for
151 * inflated, recently accessed objects, without delta chains.
152 * <b>Default 10 MB.</b>
153 */
154 public int getDeltaBaseCacheLimit() {
155 return deltaBaseCacheLimit;
156 }
157
158 /**
159 * @param newLimit
160 * maximum number of bytes to cache in delta base cache for
161 * inflated, recently accessed objects, without delta chains.
162 */
163 public void setDeltaBaseCacheLimit(final int newLimit) {
164 deltaBaseCacheLimit = newLimit;
165 }
166
167 /** @return the size threshold beyond which objects must be streamed. */
168 public int getStreamFileThreshold() {
169 return streamFileThreshold;
170 }
171
172 /**
173 * @param newLimit
174 * new byte limit for objects that must be streamed. Objects
175 * smaller than this size can be obtained as a contiguous byte
176 * array, while objects bigger than this size require using an
177 * {@link org.eclipse.jgit.lib.ObjectStream}.
178 */
179 public void setStreamFileThreshold(final int newLimit) {
180 streamFileThreshold = newLimit;
181 }
182
183 /**
184 * Update properties by setting fields from the configuration.
185 * <p>
186 * If a property is not defined in the configuration, then it is left
187 * unmodified.
188 *
189 * @param rc
190 * configuration to read properties from.
191 * @return {@code this}.
192 * @since 3.0
193 */
194 public WindowCacheConfig fromConfig(final Config rc) {
195 setPackedGitOpenFiles(rc.getInt(
196 "core", null, "packedgitopenfiles", getPackedGitOpenFiles())); //$NON-NLS-1$ //$NON-NLS-2$
197 setPackedGitLimit(rc.getLong(
198 "core", null, "packedgitlimit", getPackedGitLimit())); //$NON-NLS-1$ //$NON-NLS-2$
199 setPackedGitWindowSize(rc.getInt(
200 "core", null, "packedgitwindowsize", getPackedGitWindowSize())); //$NON-NLS-1$ //$NON-NLS-2$
201 setPackedGitMMAP(rc.getBoolean(
202 "core", null, "packedgitmmap", isPackedGitMMAP())); //$NON-NLS-1$ //$NON-NLS-2$
203 setDeltaBaseCacheLimit(rc.getInt(
204 "core", null, "deltabasecachelimit", getDeltaBaseCacheLimit())); //$NON-NLS-1$ //$NON-NLS-2$
205
206 long maxMem = Runtime.getRuntime().maxMemory();
207 long sft = rc.getLong(
208 "core", null, "streamfilethreshold", getStreamFileThreshold()); //$NON-NLS-1$ //$NON-NLS-2$
209 sft = Math.min(sft, maxMem / 4); // don't use more than 1/4 of the heap
210 sft = Math.min(sft, Integer.MAX_VALUE); // cannot exceed array length
211 setStreamFileThreshold((int) sft);
212 return this;
213 }
214
215 /**
216 * Install this configuration as the live settings.
217 * <p>
218 * The new configuration is applied immediately. If the new limits are
219 * smaller than what what is currently cached, older entries will be purged
220 * as soon as possible to allow the cache to meet the new limit.
221 *
222 * @since 3.0
223 */
224 @SuppressWarnings("deprecation")
225 public void install() {
226 WindowCache.reconfigure(this);
227 }
228 }