View Javadoc
1   /*
2    * Copyright (C) 2018, David Pursehouse <david.pursehouse@gmail.com>
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  package org.eclipse.jgit.storage.file;
44  
45  import java.util.Map;
46  
47  import javax.management.MXBean;
48  
49  import org.eclipse.jgit.internal.storage.file.WindowCache;
50  
51  /**
52   * Cache statistics for {@link WindowCache}.
53   *
54   * @since 4.11
55   */
56  @MXBean
57  public interface WindowCacheStats {
58  	/**
59  	 * @return the number of open files.
60  	 * @deprecated use {@link #getOpenFileCount()} instead
61  	 */
62  	@Deprecated
63  	public static int getOpenFiles() {
64  		return (int) WindowCache.getInstance().getStats().getOpenFileCount();
65  	}
66  
67  	/**
68  	 * @return the number of open bytes.
69  	 * @deprecated use {@link #getOpenByteCount()} instead
70  	 */
71  	@Deprecated
72  	public static long getOpenBytes() {
73  		return WindowCache.getInstance().getStats().getOpenByteCount();
74  	}
75  
76  	/**
77  	 * @return cache statistics for the WindowCache
78  	 * @since 5.1.13
79  	 */
80  	public static WindowCacheStats getStats() {
81  		return WindowCache.getInstance().getStats();
82  	}
83  
84  	/**
85  	 * Number of cache hits
86  	 *
87  	 * @return number of cache hits
88  	 */
89  	long getHitCount();
90  
91  	/**
92  	 * Ratio of cache requests which were hits defined as
93  	 * {@code hitCount / requestCount}, or {@code 1.0} when
94  	 * {@code requestCount == 0}. Note that {@code hitRate + missRate =~ 1.0}.
95  	 *
96  	 * @return the ratio of cache requests which were hits
97  	 */
98  	default double getHitRatio() {
99  		long requestCount = getRequestCount();
100 		return (requestCount == 0) ? 1.0
101 				: (double) getHitCount() / requestCount;
102 	}
103 
104 	/**
105 	 * Number of cache misses.
106 	 *
107 	 * @return number of cash misses
108 	 */
109 	long getMissCount();
110 
111 	/**
112 	 * Ratio of cache requests which were misses defined as
113 	 * {@code missCount / requestCount}, or {@code 0.0} when
114 	 * {@code requestCount == 0}. Note that {@code hitRate + missRate =~ 1.0}.
115 	 * Cache misses include all requests which weren't cache hits, including
116 	 * requests which resulted in either successful or failed loading attempts.
117 	 *
118 	 * @return the ratio of cache requests which were misses
119 	 */
120 	default double getMissRatio() {
121 		long requestCount = getRequestCount();
122 		return (requestCount == 0) ? 0.0
123 				: (double) getMissCount() / requestCount;
124 	}
125 
126 	/**
127 	 * Number of successful loads
128 	 *
129 	 * @return number of successful loads
130 	 */
131 	long getLoadSuccessCount();
132 
133 	/**
134 	 * Number of failed loads
135 	 *
136 	 * @return number of failed loads
137 	 */
138 	long getLoadFailureCount();
139 
140 	/**
141 	 * Ratio of cache load attempts which threw exceptions. This is defined as
142 	 * {@code loadFailureCount / (loadSuccessCount + loadFailureCount)}, or
143 	 * {@code 0.0} when {@code loadSuccessCount + loadFailureCount == 0}.
144 	 *
145 	 * @return the ratio of cache loading attempts which threw exceptions
146 	 */
147 	default double getLoadFailureRatio() {
148 		long loadFailureCount = getLoadFailureCount();
149 		long totalLoadCount = getLoadSuccessCount() + loadFailureCount;
150 		return (totalLoadCount == 0) ? 0.0
151 				: (double) loadFailureCount / totalLoadCount;
152 	}
153 
154 	/**
155 	 * Total number of times that the cache attempted to load new values. This
156 	 * includes both successful load operations, as well as failed loads. This
157 	 * is defined as {@code loadSuccessCount + loadFailureCount}.
158 	 *
159 	 * @return the {@code loadSuccessCount + loadFailureCount}
160 	 */
161 	default long getLoadCount() {
162 		return getLoadSuccessCount() + getLoadFailureCount();
163 	}
164 
165 	/**
166 	 * Number of cache evictions
167 	 *
168 	 * @return number of evictions
169 	 */
170 	long getEvictionCount();
171 
172 	/**
173 	 * Ratio of cache evictions. This is defined as
174 	 * {@code evictionCount / requestCount}, or {@code 0.0} when
175 	 * {@code requestCount == 0}.
176 	 *
177 	 * @return the ratio of cache loading attempts which threw exceptions
178 	 */
179 	default double getEvictionRatio() {
180 		long evictionCount = getEvictionCount();
181 		long requestCount = getRequestCount();
182 		return (requestCount == 0) ? 0.0
183 				: (double) evictionCount / requestCount;
184 	}
185 
186 	/**
187 	 * Number of times the cache returned either a cached or uncached value.
188 	 * This is defined as {@code hitCount + missCount}.
189 	 *
190 	 * @return the {@code hitCount + missCount}
191 	 */
192 	default long getRequestCount() {
193 		return getHitCount() + getMissCount();
194 	}
195 
196 	/**
197 	 * Average time in nanoseconds for loading new values. This is
198 	 * {@code totalLoadTime / (loadSuccessCount + loadFailureCount)}.
199 	 *
200 	 * @return the average time spent loading new values
201 	 */
202 	default double getAverageLoadTime() {
203 		long totalLoadCount = getLoadSuccessCount() + getLoadFailureCount();
204 		return (totalLoadCount == 0) ? 0.0
205 				: (double) getTotalLoadTime() / totalLoadCount;
206 	}
207 
208 	/**
209 	 * Total time in nanoseconds the cache spent loading new values.
210 	 *
211 	 * @return the total number of nanoseconds the cache has spent loading new
212 	 *         values
213 	 */
214 	long getTotalLoadTime();
215 
216 	/**
217 	 * Number of pack files kept open by the cache
218 	 *
219 	 * @return number of files kept open by cache
220 	 */
221 	long getOpenFileCount();
222 
223 	/**
224 	 * Number of bytes cached
225 	 *
226 	 * @return number of bytes cached
227 	 */
228 	long getOpenByteCount();
229 
230 	/**
231 	 * Number of bytes cached per repository
232 	 *
233 	 * @return number of bytes cached per repository
234 	 */
235 	Map<String, Long> getOpenByteCountPerRepository();
236 
237 	/**
238 	 * Reset counters. Does not reset open bytes and open files counters.
239 	 */
240 	void resetCounters();
241 }