HBASE-6043 Add Increment Coalescing in thrift.
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1344043 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
369c59223c
commit
cd8f390d90
|
@ -0,0 +1,351 @@
|
|||
package org.apache.hadoop.hbase.thrift;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.apache.hadoop.hbase.KeyValue;
|
||||
import org.apache.hadoop.hbase.client.HTable;
|
||||
import org.apache.hadoop.hbase.thrift.ThriftServerRunner.HBaseHandler;
|
||||
import org.apache.hadoop.hbase.thrift.generated.TIncrement;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
import org.apache.hadoop.metrics.util.MBeanUtil;
|
||||
import org.apache.thrift.TException;
|
||||
|
||||
/**
|
||||
* This class will coalesce increments from a thift server if
|
||||
* hbase.regionserver.thrift.coalesceIncrement is set to true. Turning this
|
||||
* config to true will cause the thrift server to queue increments into an
|
||||
* instance of this class. The thread pool associated with this class will drain
|
||||
* the coalesced increments as the thread is able. This can cause data loss if the
|
||||
* thrift server dies or is shut down before everything in the queue is drained.
|
||||
*
|
||||
*/
|
||||
public class IncrementCoalescer implements IncrementCoalescerMBean {
|
||||
|
||||
/**
|
||||
* Used to identify a cell that will be incremented.
|
||||
*
|
||||
*/
|
||||
static class FullyQualifiedRow {
|
||||
private byte[] table;
|
||||
private byte[] rowKey;
|
||||
private byte[] family;
|
||||
private byte[] qualifier;
|
||||
|
||||
public FullyQualifiedRow(byte[] table, byte[] rowKey, byte[] fam, byte[] qual) {
|
||||
super();
|
||||
this.table = table;
|
||||
this.rowKey = rowKey;
|
||||
this.family = fam;
|
||||
this.qualifier = qual;
|
||||
}
|
||||
|
||||
public byte[] getTable() {
|
||||
return table;
|
||||
}
|
||||
|
||||
public void setTable(byte[] table) {
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
public byte[] getRowKey() {
|
||||
return rowKey;
|
||||
}
|
||||
|
||||
public void setRowKey(byte[] rowKey) {
|
||||
this.rowKey = rowKey;
|
||||
}
|
||||
|
||||
public byte[] getFamily() {
|
||||
return family;
|
||||
}
|
||||
|
||||
public void setFamily(byte[] fam) {
|
||||
this.family = fam;
|
||||
}
|
||||
|
||||
public byte[] getQualifier() {
|
||||
return qualifier;
|
||||
}
|
||||
|
||||
public void setQualifier(byte[] qual) {
|
||||
this.qualifier = qual;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + Arrays.hashCode(family);
|
||||
result = prime * result + Arrays.hashCode(qualifier);
|
||||
result = prime * result + Arrays.hashCode(rowKey);
|
||||
result = prime * result + Arrays.hashCode(table);
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj) return true;
|
||||
if (obj == null) return false;
|
||||
if (getClass() != obj.getClass()) return false;
|
||||
FullyQualifiedRow other = (FullyQualifiedRow) obj;
|
||||
if (!Arrays.equals(family, other.family)) return false;
|
||||
if (!Arrays.equals(qualifier, other.qualifier)) return false;
|
||||
if (!Arrays.equals(rowKey, other.rowKey)) return false;
|
||||
if (!Arrays.equals(table, other.table)) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class DaemonThreadFactory implements ThreadFactory {
|
||||
static final AtomicInteger poolNumber = new AtomicInteger(1);
|
||||
final ThreadGroup group;
|
||||
final AtomicInteger threadNumber = new AtomicInteger(1);
|
||||
final String namePrefix;
|
||||
|
||||
DaemonThreadFactory() {
|
||||
SecurityManager s = System.getSecurityManager();
|
||||
group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
|
||||
namePrefix = "ICV-" + poolNumber.getAndIncrement() + "-thread-";
|
||||
}
|
||||
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
|
||||
if (!t.isDaemon()) t.setDaemon(true);
|
||||
if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY);
|
||||
return t;
|
||||
}
|
||||
}
|
||||
|
||||
private final AtomicLong failedIncrements = new AtomicLong();
|
||||
private final AtomicLong successfulCoalescings = new AtomicLong();
|
||||
private final AtomicLong totalIncrements = new AtomicLong();
|
||||
private final ConcurrentMap<FullyQualifiedRow, Long> countersMap =
|
||||
new ConcurrentHashMap<FullyQualifiedRow, Long>(100000, 0.75f, 1500);
|
||||
private final ThreadPoolExecutor pool;
|
||||
private final HBaseHandler handler;
|
||||
|
||||
private int maxQueueSize = 500000;
|
||||
private static final int CORE_POOL_SIZE = 1;
|
||||
|
||||
protected final Log LOG = LogFactory.getLog(this.getClass().getName());
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public IncrementCoalescer(HBaseHandler hand) {
|
||||
this.handler = hand;
|
||||
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
|
||||
pool =
|
||||
new ThreadPoolExecutor(CORE_POOL_SIZE, CORE_POOL_SIZE, 50, TimeUnit.MILLISECONDS, queue,
|
||||
new DaemonThreadFactory());
|
||||
|
||||
MBeanUtil.registerMBean("thrift", "Thrift", this);
|
||||
}
|
||||
|
||||
public boolean queueIncrement(TIncrement inc) throws TException {
|
||||
if (!canQueue()) {
|
||||
failedIncrements.incrementAndGet();
|
||||
return false;
|
||||
}
|
||||
return internalQueueTincrement(inc);
|
||||
}
|
||||
|
||||
public boolean queueIncrements(List<TIncrement> incs) throws TException {
|
||||
if (!canQueue()) {
|
||||
failedIncrements.incrementAndGet();
|
||||
return false;
|
||||
}
|
||||
|
||||
for (TIncrement tinc : incs) {
|
||||
internalQueueTincrement(tinc);
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
private boolean internalQueueTincrement(TIncrement inc) throws TException {
|
||||
byte[][] famAndQf = KeyValue.parseColumn(inc.getColumn());
|
||||
if (famAndQf.length < 1) return false;
|
||||
byte[] qual = famAndQf.length == 1 ? new byte[0] : famAndQf[1];
|
||||
|
||||
return internalQueueIncrement(inc.getTable(), inc.getRow(), famAndQf[0], qual,
|
||||
inc.getAmmount());
|
||||
|
||||
}
|
||||
|
||||
private boolean internalQueueIncrement(byte[] tableName, byte[] rowKey, byte[] fam,
|
||||
byte[] qual, long ammount) throws TException {
|
||||
int countersMapSize = countersMap.size();
|
||||
|
||||
|
||||
//Make sure that the number of threads is scaled.
|
||||
dynamicallySetCoreSize(countersMapSize);
|
||||
|
||||
totalIncrements.incrementAndGet();
|
||||
|
||||
FullyQualifiedRow key = new FullyQualifiedRow(tableName, rowKey, fam, qual);
|
||||
|
||||
long currentAmount = ammount;
|
||||
// Spin until able to insert the value back without collisions
|
||||
while (true) {
|
||||
Long value = countersMap.remove(key);
|
||||
if (value == null) {
|
||||
// There was nothing there, create a new value
|
||||
value = new Long(currentAmount);
|
||||
} else {
|
||||
value += currentAmount;
|
||||
successfulCoalescings.incrementAndGet();
|
||||
}
|
||||
// Try to put the value, only if there was none
|
||||
Long oldValue = countersMap.putIfAbsent(key, value);
|
||||
if (oldValue == null) {
|
||||
// We were able to put it in, we're done
|
||||
break;
|
||||
}
|
||||
// Someone else was able to put a value in, so let's remember our
|
||||
// current value (plus what we picked up) and retry to add it in
|
||||
currentAmount = value;
|
||||
}
|
||||
|
||||
// We limit the size of the queue simply because all we need is a
|
||||
// notification that something needs to be incremented. No need
|
||||
// for millions of callables that mean the same thing.
|
||||
if (pool.getQueue().size() <= 1000) {
|
||||
// queue it up
|
||||
Callable<Integer> callable = createIncCallable();
|
||||
pool.submit(callable);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean canQueue() {
|
||||
return countersMap.size() < maxQueueSize;
|
||||
}
|
||||
|
||||
private Callable<Integer> createIncCallable() {
|
||||
return new Callable<Integer>() {
|
||||
@Override
|
||||
public Integer call() throws Exception {
|
||||
int failures = 0;
|
||||
Set<FullyQualifiedRow> keys = countersMap.keySet();
|
||||
for (FullyQualifiedRow row : keys) {
|
||||
Long counter = countersMap.remove(row);
|
||||
if (counter == null) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
HTable table = handler.getTable(row.getTable());
|
||||
if (failures > 2) {
|
||||
throw new IOException("Auto-Fail rest of ICVs");
|
||||
}
|
||||
table.incrementColumnValue(row.getRowKey(), row.getFamily(), row.getQualifier(),
|
||||
counter);
|
||||
} catch (IOException e) {
|
||||
// log failure of increment
|
||||
failures++;
|
||||
LOG.error("FAILED_ICV: " + Bytes.toString(row.getTable()) + ", "
|
||||
+ Bytes.toStringBinary(row.getRowKey()) + ", "
|
||||
+ Bytes.toStringBinary(row.getFamily()) + ", "
|
||||
+ Bytes.toStringBinary(row.getQualifier()) + ", " + counter);
|
||||
}
|
||||
|
||||
}
|
||||
return failures;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* This method samples the incoming requests and, if selected, will check if
|
||||
* the corePoolSize should be changed.
|
||||
* @param countersMapSize
|
||||
*/
|
||||
private void dynamicallySetCoreSize(int countersMapSize) {
|
||||
// Here we are using countersMapSize as a random number, meaning this
|
||||
// could be a Random object
|
||||
if (countersMapSize % 10 != 0) {
|
||||
return;
|
||||
}
|
||||
double currentRatio = (double) countersMapSize / (double) maxQueueSize;
|
||||
int newValue = 1;
|
||||
if (currentRatio < 0.1) {
|
||||
// it's 1
|
||||
} else if (currentRatio < 0.3) {
|
||||
newValue = 2;
|
||||
} else if (currentRatio < 0.5) {
|
||||
newValue = 4;
|
||||
} else if (currentRatio < 0.7) {
|
||||
newValue = 8;
|
||||
} else if (currentRatio < 0.9) {
|
||||
newValue = 14;
|
||||
} else {
|
||||
newValue = 22;
|
||||
}
|
||||
if (pool.getCorePoolSize() != newValue) {
|
||||
pool.setCorePoolSize(newValue);
|
||||
}
|
||||
}
|
||||
|
||||
// MBean get/set methods
|
||||
public int getQueueSize() {
|
||||
return pool.getQueue().size();
|
||||
}
|
||||
public int getMaxQueueSize() {
|
||||
return this.maxQueueSize;
|
||||
}
|
||||
public void setMaxQueueSize(int newSize) {
|
||||
this.maxQueueSize = newSize;
|
||||
}
|
||||
|
||||
public long getPoolCompletedTaskCount() {
|
||||
return pool.getCompletedTaskCount();
|
||||
}
|
||||
public long getPoolTaskCount() {
|
||||
return pool.getTaskCount();
|
||||
}
|
||||
public int getPoolLargestPoolSize() {
|
||||
return pool.getLargestPoolSize();
|
||||
}
|
||||
public int getCorePoolSize() {
|
||||
return pool.getCorePoolSize();
|
||||
}
|
||||
public void setCorePoolSize(int newCoreSize) {
|
||||
pool.setCorePoolSize(newCoreSize);
|
||||
}
|
||||
public int getMaxPoolSize() {
|
||||
return pool.getMaximumPoolSize();
|
||||
}
|
||||
public void setMaxPoolSize(int newMaxSize) {
|
||||
pool.setMaximumPoolSize(newMaxSize);
|
||||
}
|
||||
public long getFailedIncrements() {
|
||||
return failedIncrements.get();
|
||||
}
|
||||
|
||||
public long getSuccessfulCoalescings() {
|
||||
return successfulCoalescings.get();
|
||||
}
|
||||
|
||||
public long getTotalIncrements() {
|
||||
return totalIncrements.get();
|
||||
}
|
||||
|
||||
public long getCountersMapSize() {
|
||||
return countersMap.size();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
package org.apache.hadoop.hbase.thrift;
|
||||
|
||||
public interface IncrementCoalescerMBean {
|
||||
public int getQueueSize();
|
||||
|
||||
public int getMaxQueueSize();
|
||||
|
||||
public void setMaxQueueSize(int newSize);
|
||||
|
||||
public long getPoolCompletedTaskCount();
|
||||
|
||||
public long getPoolTaskCount();
|
||||
|
||||
public int getPoolLargestPoolSize();
|
||||
|
||||
public int getCorePoolSize();
|
||||
|
||||
public void setCorePoolSize(int newCoreSize);
|
||||
|
||||
public int getMaxPoolSize();
|
||||
|
||||
public void setMaxPoolSize(int newMaxSize);
|
||||
|
||||
public long getFailedIncrements();
|
||||
|
||||
public long getSuccessfulCoalescings();
|
||||
|
||||
public long getTotalIncrements();
|
||||
|
||||
public long getCountersMapSize();
|
||||
}
|
|
@ -0,0 +1,715 @@
|
|||
/**
|
||||
* Autogenerated by Thrift Compiler (0.8.0)
|
||||
*
|
||||
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
|
||||
* @generated
|
||||
*/
|
||||
package org.apache.hadoop.hbase.thrift.generated;
|
||||
|
||||
import org.apache.thrift.scheme.IScheme;
|
||||
import org.apache.thrift.scheme.SchemeFactory;
|
||||
import org.apache.thrift.scheme.StandardScheme;
|
||||
|
||||
import org.apache.thrift.scheme.TupleScheme;
|
||||
import org.apache.thrift.protocol.TTupleProtocol;
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.EnumMap;
|
||||
import java.util.Set;
|
||||
import java.util.HashSet;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Collections;
|
||||
import java.util.BitSet;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Arrays;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* For increments that are not incrementColumnValue
|
||||
* equivalents.
|
||||
*/
|
||||
public class TIncrement implements org.apache.thrift.TBase<TIncrement, TIncrement._Fields>, java.io.Serializable, Cloneable {
|
||||
private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("TIncrement");
|
||||
|
||||
private static final org.apache.thrift.protocol.TField TABLE_FIELD_DESC = new org.apache.thrift.protocol.TField("table", org.apache.thrift.protocol.TType.STRING, (short)1);
|
||||
private static final org.apache.thrift.protocol.TField ROW_FIELD_DESC = new org.apache.thrift.protocol.TField("row", org.apache.thrift.protocol.TType.STRING, (short)2);
|
||||
private static final org.apache.thrift.protocol.TField COLUMN_FIELD_DESC = new org.apache.thrift.protocol.TField("column", org.apache.thrift.protocol.TType.STRING, (short)3);
|
||||
private static final org.apache.thrift.protocol.TField AMMOUNT_FIELD_DESC = new org.apache.thrift.protocol.TField("ammount", org.apache.thrift.protocol.TType.I64, (short)4);
|
||||
|
||||
private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
|
||||
static {
|
||||
schemes.put(StandardScheme.class, new TIncrementStandardSchemeFactory());
|
||||
schemes.put(TupleScheme.class, new TIncrementTupleSchemeFactory());
|
||||
}
|
||||
|
||||
public ByteBuffer table; // required
|
||||
public ByteBuffer row; // required
|
||||
public ByteBuffer column; // required
|
||||
public long ammount; // required
|
||||
|
||||
/** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
|
||||
public enum _Fields implements org.apache.thrift.TFieldIdEnum {
|
||||
TABLE((short)1, "table"),
|
||||
ROW((short)2, "row"),
|
||||
COLUMN((short)3, "column"),
|
||||
AMMOUNT((short)4, "ammount");
|
||||
|
||||
private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();
|
||||
|
||||
static {
|
||||
for (_Fields field : EnumSet.allOf(_Fields.class)) {
|
||||
byName.put(field.getFieldName(), field);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the _Fields constant that matches fieldId, or null if its not found.
|
||||
*/
|
||||
public static _Fields findByThriftId(int fieldId) {
|
||||
switch(fieldId) {
|
||||
case 1: // TABLE
|
||||
return TABLE;
|
||||
case 2: // ROW
|
||||
return ROW;
|
||||
case 3: // COLUMN
|
||||
return COLUMN;
|
||||
case 4: // AMMOUNT
|
||||
return AMMOUNT;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the _Fields constant that matches fieldId, throwing an exception
|
||||
* if it is not found.
|
||||
*/
|
||||
public static _Fields findByThriftIdOrThrow(int fieldId) {
|
||||
_Fields fields = findByThriftId(fieldId);
|
||||
if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
|
||||
return fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the _Fields constant that matches name, or null if its not found.
|
||||
*/
|
||||
public static _Fields findByName(String name) {
|
||||
return byName.get(name);
|
||||
}
|
||||
|
||||
private final short _thriftId;
|
||||
private final String _fieldName;
|
||||
|
||||
_Fields(short thriftId, String fieldName) {
|
||||
_thriftId = thriftId;
|
||||
_fieldName = fieldName;
|
||||
}
|
||||
|
||||
public short getThriftFieldId() {
|
||||
return _thriftId;
|
||||
}
|
||||
|
||||
public String getFieldName() {
|
||||
return _fieldName;
|
||||
}
|
||||
}
|
||||
|
||||
// isset id assignments
|
||||
private static final int __AMMOUNT_ISSET_ID = 0;
|
||||
private BitSet __isset_bit_vector = new BitSet(1);
|
||||
public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
|
||||
static {
|
||||
Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
|
||||
tmpMap.put(_Fields.TABLE, new org.apache.thrift.meta_data.FieldMetaData("table", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , "Text")));
|
||||
tmpMap.put(_Fields.ROW, new org.apache.thrift.meta_data.FieldMetaData("row", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , "Text")));
|
||||
tmpMap.put(_Fields.COLUMN, new org.apache.thrift.meta_data.FieldMetaData("column", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING , "Text")));
|
||||
tmpMap.put(_Fields.AMMOUNT, new org.apache.thrift.meta_data.FieldMetaData("ammount", org.apache.thrift.TFieldRequirementType.DEFAULT,
|
||||
new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
|
||||
metaDataMap = Collections.unmodifiableMap(tmpMap);
|
||||
org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(TIncrement.class, metaDataMap);
|
||||
}
|
||||
|
||||
public TIncrement() {
|
||||
}
|
||||
|
||||
public TIncrement(
|
||||
ByteBuffer table,
|
||||
ByteBuffer row,
|
||||
ByteBuffer column,
|
||||
long ammount)
|
||||
{
|
||||
this();
|
||||
this.table = table;
|
||||
this.row = row;
|
||||
this.column = column;
|
||||
this.ammount = ammount;
|
||||
setAmmountIsSet(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs a deep copy on <i>other</i>.
|
||||
*/
|
||||
public TIncrement(TIncrement other) {
|
||||
__isset_bit_vector.clear();
|
||||
__isset_bit_vector.or(other.__isset_bit_vector);
|
||||
if (other.isSetTable()) {
|
||||
this.table = other.table;
|
||||
}
|
||||
if (other.isSetRow()) {
|
||||
this.row = other.row;
|
||||
}
|
||||
if (other.isSetColumn()) {
|
||||
this.column = other.column;
|
||||
}
|
||||
this.ammount = other.ammount;
|
||||
}
|
||||
|
||||
public TIncrement deepCopy() {
|
||||
return new TIncrement(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
this.table = null;
|
||||
this.row = null;
|
||||
this.column = null;
|
||||
setAmmountIsSet(false);
|
||||
this.ammount = 0;
|
||||
}
|
||||
|
||||
public byte[] getTable() {
|
||||
setTable(org.apache.thrift.TBaseHelper.rightSize(table));
|
||||
return table == null ? null : table.array();
|
||||
}
|
||||
|
||||
public ByteBuffer bufferForTable() {
|
||||
return table;
|
||||
}
|
||||
|
||||
public TIncrement setTable(byte[] table) {
|
||||
setTable(table == null ? (ByteBuffer)null : ByteBuffer.wrap(table));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TIncrement setTable(ByteBuffer table) {
|
||||
this.table = table;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void unsetTable() {
|
||||
this.table = null;
|
||||
}
|
||||
|
||||
/** Returns true if field table is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSetTable() {
|
||||
return this.table != null;
|
||||
}
|
||||
|
||||
public void setTableIsSet(boolean value) {
|
||||
if (!value) {
|
||||
this.table = null;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getRow() {
|
||||
setRow(org.apache.thrift.TBaseHelper.rightSize(row));
|
||||
return row == null ? null : row.array();
|
||||
}
|
||||
|
||||
public ByteBuffer bufferForRow() {
|
||||
return row;
|
||||
}
|
||||
|
||||
public TIncrement setRow(byte[] row) {
|
||||
setRow(row == null ? (ByteBuffer)null : ByteBuffer.wrap(row));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TIncrement setRow(ByteBuffer row) {
|
||||
this.row = row;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void unsetRow() {
|
||||
this.row = null;
|
||||
}
|
||||
|
||||
/** Returns true if field row is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSetRow() {
|
||||
return this.row != null;
|
||||
}
|
||||
|
||||
public void setRowIsSet(boolean value) {
|
||||
if (!value) {
|
||||
this.row = null;
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] getColumn() {
|
||||
setColumn(org.apache.thrift.TBaseHelper.rightSize(column));
|
||||
return column == null ? null : column.array();
|
||||
}
|
||||
|
||||
public ByteBuffer bufferForColumn() {
|
||||
return column;
|
||||
}
|
||||
|
||||
public TIncrement setColumn(byte[] column) {
|
||||
setColumn(column == null ? (ByteBuffer)null : ByteBuffer.wrap(column));
|
||||
return this;
|
||||
}
|
||||
|
||||
public TIncrement setColumn(ByteBuffer column) {
|
||||
this.column = column;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void unsetColumn() {
|
||||
this.column = null;
|
||||
}
|
||||
|
||||
/** Returns true if field column is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSetColumn() {
|
||||
return this.column != null;
|
||||
}
|
||||
|
||||
public void setColumnIsSet(boolean value) {
|
||||
if (!value) {
|
||||
this.column = null;
|
||||
}
|
||||
}
|
||||
|
||||
public long getAmmount() {
|
||||
return this.ammount;
|
||||
}
|
||||
|
||||
public TIncrement setAmmount(long ammount) {
|
||||
this.ammount = ammount;
|
||||
setAmmountIsSet(true);
|
||||
return this;
|
||||
}
|
||||
|
||||
public void unsetAmmount() {
|
||||
__isset_bit_vector.clear(__AMMOUNT_ISSET_ID);
|
||||
}
|
||||
|
||||
/** Returns true if field ammount is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSetAmmount() {
|
||||
return __isset_bit_vector.get(__AMMOUNT_ISSET_ID);
|
||||
}
|
||||
|
||||
public void setAmmountIsSet(boolean value) {
|
||||
__isset_bit_vector.set(__AMMOUNT_ISSET_ID, value);
|
||||
}
|
||||
|
||||
public void setFieldValue(_Fields field, Object value) {
|
||||
switch (field) {
|
||||
case TABLE:
|
||||
if (value == null) {
|
||||
unsetTable();
|
||||
} else {
|
||||
setTable((ByteBuffer)value);
|
||||
}
|
||||
break;
|
||||
|
||||
case ROW:
|
||||
if (value == null) {
|
||||
unsetRow();
|
||||
} else {
|
||||
setRow((ByteBuffer)value);
|
||||
}
|
||||
break;
|
||||
|
||||
case COLUMN:
|
||||
if (value == null) {
|
||||
unsetColumn();
|
||||
} else {
|
||||
setColumn((ByteBuffer)value);
|
||||
}
|
||||
break;
|
||||
|
||||
case AMMOUNT:
|
||||
if (value == null) {
|
||||
unsetAmmount();
|
||||
} else {
|
||||
setAmmount((Long)value);
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public Object getFieldValue(_Fields field) {
|
||||
switch (field) {
|
||||
case TABLE:
|
||||
return getTable();
|
||||
|
||||
case ROW:
|
||||
return getRow();
|
||||
|
||||
case COLUMN:
|
||||
return getColumn();
|
||||
|
||||
case AMMOUNT:
|
||||
return Long.valueOf(getAmmount());
|
||||
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
/** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
|
||||
public boolean isSet(_Fields field) {
|
||||
if (field == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
switch (field) {
|
||||
case TABLE:
|
||||
return isSetTable();
|
||||
case ROW:
|
||||
return isSetRow();
|
||||
case COLUMN:
|
||||
return isSetColumn();
|
||||
case AMMOUNT:
|
||||
return isSetAmmount();
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object that) {
|
||||
if (that == null)
|
||||
return false;
|
||||
if (that instanceof TIncrement)
|
||||
return this.equals((TIncrement)that);
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean equals(TIncrement that) {
|
||||
if (that == null)
|
||||
return false;
|
||||
|
||||
boolean this_present_table = true && this.isSetTable();
|
||||
boolean that_present_table = true && that.isSetTable();
|
||||
if (this_present_table || that_present_table) {
|
||||
if (!(this_present_table && that_present_table))
|
||||
return false;
|
||||
if (!this.table.equals(that.table))
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean this_present_row = true && this.isSetRow();
|
||||
boolean that_present_row = true && that.isSetRow();
|
||||
if (this_present_row || that_present_row) {
|
||||
if (!(this_present_row && that_present_row))
|
||||
return false;
|
||||
if (!this.row.equals(that.row))
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean this_present_column = true && this.isSetColumn();
|
||||
boolean that_present_column = true && that.isSetColumn();
|
||||
if (this_present_column || that_present_column) {
|
||||
if (!(this_present_column && that_present_column))
|
||||
return false;
|
||||
if (!this.column.equals(that.column))
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean this_present_ammount = true;
|
||||
boolean that_present_ammount = true;
|
||||
if (this_present_ammount || that_present_ammount) {
|
||||
if (!(this_present_ammount && that_present_ammount))
|
||||
return false;
|
||||
if (this.ammount != that.ammount)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int compareTo(TIncrement other) {
|
||||
if (!getClass().equals(other.getClass())) {
|
||||
return getClass().getName().compareTo(other.getClass().getName());
|
||||
}
|
||||
|
||||
int lastComparison = 0;
|
||||
TIncrement typedOther = (TIncrement)other;
|
||||
|
||||
lastComparison = Boolean.valueOf(isSetTable()).compareTo(typedOther.isSetTable());
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
if (isSetTable()) {
|
||||
lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.table, typedOther.table);
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
}
|
||||
lastComparison = Boolean.valueOf(isSetRow()).compareTo(typedOther.isSetRow());
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
if (isSetRow()) {
|
||||
lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.row, typedOther.row);
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
}
|
||||
lastComparison = Boolean.valueOf(isSetColumn()).compareTo(typedOther.isSetColumn());
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
if (isSetColumn()) {
|
||||
lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.column, typedOther.column);
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
}
|
||||
lastComparison = Boolean.valueOf(isSetAmmount()).compareTo(typedOther.isSetAmmount());
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
if (isSetAmmount()) {
|
||||
lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.ammount, typedOther.ammount);
|
||||
if (lastComparison != 0) {
|
||||
return lastComparison;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public _Fields fieldForId(int fieldId) {
|
||||
return _Fields.findByThriftId(fieldId);
|
||||
}
|
||||
|
||||
public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
|
||||
schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
|
||||
}
|
||||
|
||||
public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
|
||||
schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder("TIncrement(");
|
||||
boolean first = true;
|
||||
|
||||
sb.append("table:");
|
||||
if (this.table == null) {
|
||||
sb.append("null");
|
||||
} else {
|
||||
sb.append(this.table);
|
||||
}
|
||||
first = false;
|
||||
if (!first) sb.append(", ");
|
||||
sb.append("row:");
|
||||
if (this.row == null) {
|
||||
sb.append("null");
|
||||
} else {
|
||||
sb.append(this.row);
|
||||
}
|
||||
first = false;
|
||||
if (!first) sb.append(", ");
|
||||
sb.append("column:");
|
||||
if (this.column == null) {
|
||||
sb.append("null");
|
||||
} else {
|
||||
sb.append(this.column);
|
||||
}
|
||||
first = false;
|
||||
if (!first) sb.append(", ");
|
||||
sb.append("ammount:");
|
||||
sb.append(this.ammount);
|
||||
first = false;
|
||||
sb.append(")");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void validate() throws org.apache.thrift.TException {
|
||||
// check for required fields
|
||||
}
|
||||
|
||||
private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
|
||||
try {
|
||||
write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
|
||||
} catch (org.apache.thrift.TException te) {
|
||||
throw new java.io.IOException(te);
|
||||
}
|
||||
}
|
||||
|
||||
private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
|
||||
try {
|
||||
// it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
|
||||
__isset_bit_vector = new BitSet(1);
|
||||
read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
|
||||
} catch (org.apache.thrift.TException te) {
|
||||
throw new java.io.IOException(te);
|
||||
}
|
||||
}
|
||||
|
||||
private static class TIncrementStandardSchemeFactory implements SchemeFactory {
|
||||
public TIncrementStandardScheme getScheme() {
|
||||
return new TIncrementStandardScheme();
|
||||
}
|
||||
}
|
||||
|
||||
private static class TIncrementStandardScheme extends StandardScheme<TIncrement> {
|
||||
|
||||
public void read(org.apache.thrift.protocol.TProtocol iprot, TIncrement struct) throws org.apache.thrift.TException {
|
||||
org.apache.thrift.protocol.TField schemeField;
|
||||
iprot.readStructBegin();
|
||||
while (true)
|
||||
{
|
||||
schemeField = iprot.readFieldBegin();
|
||||
if (schemeField.type == org.apache.thrift.protocol.TType.STOP) {
|
||||
break;
|
||||
}
|
||||
switch (schemeField.id) {
|
||||
case 1: // TABLE
|
||||
if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
|
||||
struct.table = iprot.readBinary();
|
||||
struct.setTableIsSet(true);
|
||||
} else {
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
|
||||
}
|
||||
break;
|
||||
case 2: // ROW
|
||||
if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
|
||||
struct.row = iprot.readBinary();
|
||||
struct.setRowIsSet(true);
|
||||
} else {
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
|
||||
}
|
||||
break;
|
||||
case 3: // COLUMN
|
||||
if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
|
||||
struct.column = iprot.readBinary();
|
||||
struct.setColumnIsSet(true);
|
||||
} else {
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
|
||||
}
|
||||
break;
|
||||
case 4: // AMMOUNT
|
||||
if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
|
||||
struct.ammount = iprot.readI64();
|
||||
struct.setAmmountIsSet(true);
|
||||
} else {
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
|
||||
}
|
||||
iprot.readFieldEnd();
|
||||
}
|
||||
iprot.readStructEnd();
|
||||
|
||||
// check for required fields of primitive type, which can't be checked in the validate method
|
||||
struct.validate();
|
||||
}
|
||||
|
||||
public void write(org.apache.thrift.protocol.TProtocol oprot, TIncrement struct) throws org.apache.thrift.TException {
|
||||
struct.validate();
|
||||
|
||||
oprot.writeStructBegin(STRUCT_DESC);
|
||||
if (struct.table != null) {
|
||||
oprot.writeFieldBegin(TABLE_FIELD_DESC);
|
||||
oprot.writeBinary(struct.table);
|
||||
oprot.writeFieldEnd();
|
||||
}
|
||||
if (struct.row != null) {
|
||||
oprot.writeFieldBegin(ROW_FIELD_DESC);
|
||||
oprot.writeBinary(struct.row);
|
||||
oprot.writeFieldEnd();
|
||||
}
|
||||
if (struct.column != null) {
|
||||
oprot.writeFieldBegin(COLUMN_FIELD_DESC);
|
||||
oprot.writeBinary(struct.column);
|
||||
oprot.writeFieldEnd();
|
||||
}
|
||||
oprot.writeFieldBegin(AMMOUNT_FIELD_DESC);
|
||||
oprot.writeI64(struct.ammount);
|
||||
oprot.writeFieldEnd();
|
||||
oprot.writeFieldStop();
|
||||
oprot.writeStructEnd();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class TIncrementTupleSchemeFactory implements SchemeFactory {
|
||||
public TIncrementTupleScheme getScheme() {
|
||||
return new TIncrementTupleScheme();
|
||||
}
|
||||
}
|
||||
|
||||
private static class TIncrementTupleScheme extends TupleScheme<TIncrement> {
|
||||
|
||||
@Override
|
||||
public void write(org.apache.thrift.protocol.TProtocol prot, TIncrement struct) throws org.apache.thrift.TException {
|
||||
TTupleProtocol oprot = (TTupleProtocol) prot;
|
||||
BitSet optionals = new BitSet();
|
||||
if (struct.isSetTable()) {
|
||||
optionals.set(0);
|
||||
}
|
||||
if (struct.isSetRow()) {
|
||||
optionals.set(1);
|
||||
}
|
||||
if (struct.isSetColumn()) {
|
||||
optionals.set(2);
|
||||
}
|
||||
if (struct.isSetAmmount()) {
|
||||
optionals.set(3);
|
||||
}
|
||||
oprot.writeBitSet(optionals, 4);
|
||||
if (struct.isSetTable()) {
|
||||
oprot.writeBinary(struct.table);
|
||||
}
|
||||
if (struct.isSetRow()) {
|
||||
oprot.writeBinary(struct.row);
|
||||
}
|
||||
if (struct.isSetColumn()) {
|
||||
oprot.writeBinary(struct.column);
|
||||
}
|
||||
if (struct.isSetAmmount()) {
|
||||
oprot.writeI64(struct.ammount);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void read(org.apache.thrift.protocol.TProtocol prot, TIncrement struct) throws org.apache.thrift.TException {
|
||||
TTupleProtocol iprot = (TTupleProtocol) prot;
|
||||
BitSet incoming = iprot.readBitSet(4);
|
||||
if (incoming.get(0)) {
|
||||
struct.table = iprot.readBinary();
|
||||
struct.setTableIsSet(true);
|
||||
}
|
||||
if (incoming.get(1)) {
|
||||
struct.row = iprot.readBinary();
|
||||
struct.setRowIsSet(true);
|
||||
}
|
||||
if (incoming.get(2)) {
|
||||
struct.column = iprot.readBinary();
|
||||
struct.setColumnIsSet(true);
|
||||
}
|
||||
if (incoming.get(3)) {
|
||||
struct.ammount = iprot.readI64();
|
||||
struct.setAmmountIsSet(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue