/*
* @(#) CompositeColumnFamilyStore.java
* Created Aug 18, 2011 by oleg
* (C) ONE, SIA
*/
package org.apache.cassandra.db;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import com.sun.jmx.snmp.tasks.Task;
/**
* This is just mbean proxy to column family mbeans, split by domain, to make their management simpler.
*
* @author Oleg Anastasyev<oa@hq.one.lv>
*/
public class CompositeColumnFamilyStore implements ColumnFamilyStoreMBean
{
private String table;
private String compositeName;
private ArrayList<String> childStores=new ArrayList<String>();
interface Task<V>
{
boolean process(ColumnFamilyStore cfs) throws IOException;
V result();
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getColumnFamilyName()
*/
@Override
public String getColumnFamilyName()
{
return compositeName;
}
private <V> V traverse(Task<V> task) throws IOException
{
Table t = Table.open(table);
for (String cfName : childStores) {
if ( !task.process(t.getColumnFamilyStore(cfName)) )
break;
}
return task.result();
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getMemtableDataSize()
*/
@Override
public int getMemtableDataSize()
{
try {
return traverse(new Task<Integer>()
{
int r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getMemtableDataSize();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Integer result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getMemtableColumnsCount()
*/
@Override
public int getMemtableColumnsCount()
{
try {
return traverse(new Task<Integer>()
{
int r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getMemtableColumnsCount();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Integer result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getMemtableSwitchCount()
*/
@Override
public int getMemtableSwitchCount()
{
try {
return traverse(new Task<Integer>()
{
int r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getMemtableSwitchCount();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Integer result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#forceFlush()
*/
@Override
public Object forceFlush() throws IOException
{
traverse(new Task<Void>()
{
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs) throws IOException
{
cfs.forceFlush();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Void result()
{
return null;
}
});
return null;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getReadCount()
*/
@Override
public long getReadCount()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getReadCount();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getTotalReadLatencyMicros()
*/
@Override
public long getTotalReadLatencyMicros()
{
try {
return traverse(new Task<Long>()
{
long r=0;
int c=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getTotalReadLatencyMicros();
c++;
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
if (c==0) return 0l;
return r/c;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getLifetimeReadLatencyHistogramMicros()
*/
@Override
public long[] getLifetimeReadLatencyHistogramMicros()
{
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentReadLatencyHistogramMicros()
*/
@Override
public long[] getRecentReadLatencyHistogramMicros()
{
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentReadLatencyMicros()
*/
@Override
public double getRecentReadLatencyMicros()
{
try {
return traverse(new Task<Double>()
{
double r=0;
int c=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getTotalReadLatencyMicros();
c++;
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Double result()
{
if (c==0) return 0.0;
return r/c;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getWriteCount()
*/
@Override
public long getWriteCount()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getWriteCount();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getTotalWriteLatencyMicros()
*/
@Override
public long getTotalWriteLatencyMicros()
{
// TODO Auto-generated method stub
return 0;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getLifetimeWriteLatencyHistogramMicros()
*/
@Override
public long[] getLifetimeWriteLatencyHistogramMicros()
{
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentWriteLatencyHistogramMicros()
*/
@Override
public long[] getRecentWriteLatencyHistogramMicros()
{
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentWriteLatencyMicros()
*/
@Override
public double getRecentWriteLatencyMicros()
{
try {
return traverse(new Task<Double>()
{
double r=0;
int c=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
double size = cfs.getRecentWriteLatencyMicros();
if (size>0)
{
r+=size;
c++;
}
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Double result()
{
if (c==0) return 0.0;
return r/c;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getPendingTasks()
*/
@Override
public int getPendingTasks()
{
try {
return traverse(new Task<Integer>()
{
int r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getPendingTasks();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Integer result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getLiveSSTableCount()
*/
@Override
public int getLiveSSTableCount()
{
try {
return traverse(new Task<Integer>()
{
int r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getLiveSSTableCount();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Integer result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getLiveDiskSpaceUsed()
*/
@Override
public long getLiveDiskSpaceUsed()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getLiveDiskSpaceUsed();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getTotalDiskSpaceUsed()
*/
@Override
public long getTotalDiskSpaceUsed()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getTotalDiskSpaceUsed();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#forceMajorCompaction()
*/
@Override
public void forceMajorCompaction()
{
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#invalidateRowCache()
*/
@Override
public void invalidateRowCache()
{
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getMinRowCompactedSize()
*/
@Override
public long getMinRowCompactedSize()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r= Math.min(r, cfs.getMinRowCompactedSize() );
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getMaxRowCompactedSize()
*/
@Override
public long getMaxRowCompactedSize()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r= Math.max(r, cfs.getMinRowCompactedSize() );
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getMeanRowCompactedSize()
*/
@Override
public long getMeanRowCompactedSize()
{
try {
return traverse(new Task<Long>()
{
long r=0;
int c=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
long size = cfs.getMeanRowCompactedSize();
if (size>0)
{
r+=size;
c++;
}
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
if (c==0) return 0l;
return r/c;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getBloomFilterFalsePositives()
*/
@Override
public long getBloomFilterFalsePositives()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getBloomFilterFalsePositives();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterFalsePositives()
*/
@Override
public long getRecentBloomFilterFalsePositives()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getRecentBloomFilterFalsePositives();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getBloomFilterFalseRatio()
*/
@Override
public double getBloomFilterFalseRatio()
{
// TODO Auto-generated method stub
return 0;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterFalseRatio()
*/
@Override
public double getRecentBloomFilterFalseRatio()
{
// TODO Auto-generated method stub
return 0;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#estimateKeys()
*/
@Override
public long estimateKeys()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.estimateKeys();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterNegatives()
*/
@Override
public long getRecentBloomFilterNegatives()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getRecentBloomFilterNegatives();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getBloomFilterNegatives()
*/
@Override
public long getBloomFilterNegatives()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getBloomFilterNegatives();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterColumnNegativeRatio()
*/
@Override
public double getRecentBloomFilterColumnNegativeRatio()
{
// TODO Auto-generated method stub
return 0;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterColumnReads()
*/
@Override
public long getRecentBloomFilterColumnReads()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getRecentBloomFilterColumnReads();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getBloomFilterColumnReads()
*/
@Override
public long getBloomFilterColumnReads()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getBloomFilterColumnReads();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterColumnNegatives()
*/
@Override
public long getRecentBloomFilterColumnNegatives()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getRecentBloomFilterColumnNegatives();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getBloomFilterColumnNegatives()
*/
@Override
public long getBloomFilterColumnNegatives()
{
try {
return traverse(new Task<Long>()
{
long r=0;
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#process(org.apache.cassandra.db.ColumnFamilyStore)
*/
@Override
public boolean process(ColumnFamilyStore cfs)
{
r+=cfs.getBloomFilterColumnNegatives();
return true;
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.CompositeColumnFamilyStore.Task#result()
*/
@Override
public Long result()
{
return r;
}
});
} catch (IOException e) {
return 0;
}
}
/* (non-Javadoc)
* @see org.apache.cassandra.db.ColumnFamilyStoreMBean#getRecentBloomFilterNegativeRatio()
*/
@Override
public double getRecentBloomFilterNegativeRatio()
{
// TODO Auto-generated method stub
return 0;
}
}