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