blob: 5538024a0cbbf72a525639f74ccebc83a25012fd [file] [log] [blame]
// Copyright (C) 2009 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.server.ssh;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Statistics;
import net.sf.ehcache.config.CacheConfiguration;
import org.spearce.jgit.lib.WindowCacheStatAccessor;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
/** Show the current cache states. */
class AdminShowCaches extends AbstractCommand {
PrintWriter p;
@Override
protected void run() throws Failure, UnsupportedEncodingException {
assertIsAdministrator();
p = toPrintWriter(out);
for (final Ehcache cache : getGerritServer().getAllCaches()) {
final CacheConfiguration cfg = cache.getCacheConfiguration();
final boolean useDisk = cfg.isDiskPersistent() || cfg.isOverflowToDisk();
final Statistics stat = cache.getStatistics();
p.print("cache \"" + cache.getName() + "\"");
if (useDisk) {
p.print(" (memory, disk)");
}
p.println(":");
fItemCount("items", stat.getObjectCount());
if (useDisk) {
fItemCount("items.memory", stat.getMemoryStoreObjectCount());
fItemCount("items.disk", stat.getDiskStoreObjectCount());
}
fItemCount("evictions", stat.getEvictionCount());
final long total = stat.getCacheHits() + stat.getCacheMisses();
fTimeInterval("ttl.idle", cfg.getTimeToIdleSeconds());
fTimeInterval("ttl.live", cfg.getTimeToLiveSeconds());
fMilliseconds("avg.get", stat.getAverageGetTime());
fPercent("hit%", stat.getCacheHits(), total);
if (useDisk) {
fPercent("hit%.memory", stat.getInMemoryHits(), total);
fPercent("hit%.disk", stat.getOnDiskHits(), total);
}
p.println();
}
final Runtime r = Runtime.getRuntime();
final long mMax = r.maxMemory();
final long mFree = r.freeMemory();
final long mTotal = r.totalMemory();
final long mInuse = mTotal - mFree;
final int jgitBytes = WindowCacheStatAccessor.getOpenBytes();
p.println("JGit Buffer Cache:");
fItemCount("open files", WindowCacheStatAccessor.getOpenFiles());
fByteCount("loaded", jgitBytes);
fPercent("mem%", jgitBytes, mTotal);
p.println();
p.println("JVM Heap:");
fByteCount("max", mMax);
fByteCount("inuse", mInuse);
fPercent("mem%", mInuse, mTotal);
p.println();
p.flush();
}
private void fItemCount(final String name, final long value) {
p.println(String.format(" %1$-12s: %2$15d", name, value));
}
private void fByteCount(final String name, double value) {
String suffix = "bytes";
if (value > 1024) {
value /= 1024;
suffix = "kb";
}
if (value > 1024) {
value /= 1024;
suffix = "mb";
}
if (value > 1024) {
value /= 1024;
suffix = "gb";
}
p.println(String.format(" %1$-12s: %2$6.2f %3$s", name, value, suffix));
}
private void fMilliseconds(final String name, final float ms) {
p.println(String.format(" %1$-12s: %2$6.2f ms", name, ms));
}
private void fTimeInterval(final String name, double ttl) {
if (ttl == 0) {
p.println(String.format(" %1$-12s: inf", name));
return;
}
String suffix = "secs";
if (ttl > 60) {
ttl /= 60;
suffix = "mins";
}
if (ttl > 60) {
ttl /= 60;
suffix = "hrs";
}
if (ttl > 24) {
ttl /= 24;
suffix = "days";
}
p.println(String.format(" %1$-12s: %2$6.2f %3$s", name, ttl, suffix));
}
private void fPercent(final String name, final long value, final long total) {
final long pcent = 0 < total ? (100 * value) / total : 0;
p.println(String.format(" %1$-12s: %2$3d%%", name, (int) pcent));
}
}