/**
* Copyright © 2011-2012 Akiban Technologies, Inc. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* This program may also be available under different license terms.
* For more information, see www.akiban.com or contact licensing@akiban.com.
*
* Contributors:
* Akiban Technologies, Inc.
*/
package com.persistit;
import java.rmi.RemoteException;
import com.persistit.Management.BufferPoolInfo;
import com.persistit.mxbeans.BufferPoolMXBean;
import com.persistit.mxbeans.Description;
/**
* MXBean that exposes information about a {@link BufferPool}.
* @author peter
*
*/
class BufferPoolMXBeanImpl implements BufferPoolMXBean {
private final static long MAX_STALE = 5000;
private final Persistit _persistit;
private final int _bufferSize;
private BufferPoolInfo _recent;
static String mbeanName(final int bufferPoolSize) {
return MXBEAN_NAME + "." + bufferPoolSize;
}
BufferPoolMXBeanImpl(final Persistit persistit, final int bufferSize) {
_persistit = persistit;
_bufferSize = bufferSize;
_recent = new BufferPoolInfo();
}
private BufferPoolInfo recent() {
long now = System.currentTimeMillis();
if (_recent.getAcquisitionTime() < now - MAX_STALE) {
try {
BufferPoolInfo[] array = _persistit.getManagement().getBufferPoolInfoArray();
for (BufferPoolInfo info : array) {
if (info.getBufferSize() == _bufferSize) {
_recent = info;
}
}
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (_recent == null) {
_recent = new BufferPoolInfo();
}
return _recent;
}
/**
* Return the size of <code>Buffer</code>s managed by this pool.
*
* @return The size in bytes of each buffer in this pool
*/
@Override
@Description("The size in bytes of each buffer in this pool")
public int getBufferSize() {
return recent().getBufferSize();
}
/**
* Return the count of <code>Buffer</code>s managed by this pool.
*
* @return The count
*/
@Override
@Description("Return the count of Buffer managed by this pool")
public int getBufferCount() {
return recent().getBufferCount();
}
/**
* Return the count of lookup operations for pages images that resulted in a
* physical disk read operation. This number, in comparison with the hit
* counter, indicates how effective the cache is in reducing disk I/O.
*
* @return The get count
*/
@Override
@Description("Count of unsuccessful lookup operations that resulted in physical disks")
public long getMissCount() {
return recent().getMissCount();
}
/**
* Return the count of lookup operations for pages images in this pool for
* which the page image was already found in this <code>BufferPool</code>.
* This number, in comparison with the get counter, indicates how effective
* the cache is in reducing disk I/O.
*
* @return The hit count
*/
@Override
@Description("Count of successful lookup operations")
public long getHitCount() {
return recent().getHitCount();
}
/**
* @return Count of pages newly created in this <code>BufferPool</code>.
*/
@Override
@Description("Count of pages newly created")
public long getNewCount() {
return recent().getNewCount();
}
/**
* Get the count of valid pages evicted from this <code>BufferPool</code> to
* make room for newly read or created pages.
*
* @return The evicted page count
*/
@Override
@Description("Count of pages replaced by other pages")
public long getEvictCount() {
return recent().getEvictCount();
}
/**
* Return count of pages written from this pool.
*
* @return The write count
*/
@Override
@Description("Count of pages written from this BufferPool")
public long getWriteCount() {
return recent().getWriteCount();
}
/**
* Return count of pages forced to be written due to an update after a
* checkpoint
*
* @return The forced checkpoint write count
*/
@Override
@Description("Count of pages forced to be written due to an update after a checkpoint")
public long getForcedCheckpointWriteCount() {
return recent().getForcedCheckpointWriteCount();
}
/**
* Return count of pages forced to be written when dirty on eviction
*
* @return The forced write count
*/
@Override
@Description("Count of pages forced to be written when dirty on eviction")
public long getForcedWriteCount() {
return recent().getForcedWriteCount();
}
/**
* Get the "hit ratio" - the number of hits divided by the number of overall
* gets. A value close to 1.0 indicates that most attempts to find data in
* the <code>BufferPool</code> are successful - i.e., that the cache is
* effectively reducing the need for disk read operations.
*
* @return The ratio
*/
@Override
@Description("Ratio of hits to total page lookup operations")
public double getHitRatio() {
return recent().getHitRatio();
}
/**
* Get the count of valid pages in this pool.
*
* @return The count of valid pages in this pool
*/
@Override
@Description("Count of valid pages in this pool")
public int getValidPageCount() {
return recent().getValidPageCount();
}
/**
* Get the count of dirty pages (pages that contain updates not yet written
* to disk) in this pool.
*
* @return The count of dirty pages in this pool
*/
@Override
@Description("The count of dirty pages in this pool")
public int getDirtyPageCount() {
return recent().getDirtyPageCount();
}
/**
* Get the count of pages on which running threads have reader
* (non-exclusive), but <i>not</i> writer (exclusive) claims in this pool.
*
* @return The count of pages with reader claims
*/
@Override
@Description("The count of pages with reader claims")
public int getReaderClaimedPageCount() {
return recent().getReaderClaimedPageCount();
}
/**
* Get the count of pages on which running threads have writer (exclusive)
* claims in this pool.
*
* @return The count of pages with writer claims
*/
@Override
@Description("The count of pages with writer claims")
public int getWriterClaimedPageCount() {
return recent().getWriterClaimedPageCount();
}
/**
* @return Earliest timestamp of any dirty page in this
* <code>BufferPool</code>.
*/
@Override
@Description("Earliest timestamp of any dirty page in this >BufferPool")
public long getEarliestDirtyTimestamp() {
return recent().getEarliestDirtyTimestamp();
}
}