blob: 64157a916b00656b3da8afb147f670f2a0e0cc5c [file] [log] [blame]
/*
* Copyright (C) 2012-2012 The Async HBase Authors. All rights reserved.
* This file is part of Async HBase.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of the StumbleUpon nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package org.hbase.async;
import org.jboss.netty.buffer.ChannelBuffer;
import org.hbase.async.generated.ClientPB.MutationProto;
/**
* An intermediate abstract class for all RPC requests that can be batched.
* <p>
* This class is internal only and doesn't provide any user-facing API other
* than guaranteeing that the RPC has a family and a timestamp.
*/
abstract class BatchableRpc extends HBaseRpc
implements HBaseRpc.HasFamily, HBaseRpc.HasTimestamp {
// Attributes should have `protected' visibility, but doing so exposes
// them as part of the public API and in Javadoc, which we don't want.
// So instead we make them package-private so that subclasses can still
// access them directly.
/** Family affected by this RPC. */
/*protected*/ final byte[] family;
/** The timestamp to use for {@link KeyValue}s of this RPC. */
/*protected*/ final long timestamp;
/**
* Explicit row lock to use, if any.
* @see RowLock
*/
/*protected*/ final long lockid;
/**
* Whether or not this batchable RPC can be buffered on the client side.
* Please call {@link #canBuffer} to check if this RPC can be buffered,
* don't test this field directly.
*/
/*protected*/ boolean bufferable = true;
/**
* Whether or not the RegionServer must write to its WAL (Write Ahead Log).
*/
/*protected*/ boolean durable = true;
/**
* Package private constructor.
* @param table The name of the table this RPC is for.
* @param row The name of the row this RPC is for.
* @param family The column family to edit in that table. Subclass must
* validate, this class doesn't perform any validation on the family.
* @param timestamp The timestamp to use for {@link KeyValue}s of this RPC.
* @param lockid Explicit row lock to use, or {@link RowLock#NO_LOCK}.
*/
BatchableRpc(final byte[] table,
final byte[] key, final byte[] family,
final long timestamp, final long lockid) {
super(table, key);
this.family = family;
this.timestamp = timestamp;
this.lockid = lockid;
}
/**
* Sets whether or not this RPC is can be buffered on the client side.
* The default is {@code true}.
* <p>
* Setting this to {@code false} bypasses the client-side buffering, which
* is used to send RPCs in batches for greater throughput, and causes this
* RPC to be sent directly to the server.
* @param bufferable Whether or not this RPC can be buffered (i.e. delayed)
* before being sent out to HBase.
* @see HBaseClient#setFlushInterval
*/
public final void setBufferable(final boolean bufferable) {
this.bufferable = bufferable;
}
/**
* Changes the durability setting of this edit.
* The default is {@code true}.
* Make sure you've read and understood the
* <a href="HBaseClient.html#durability">data durability</a> section before
* setting this to {@code false}.
* @param durable Whether or not this edit should be stored with data
* durability guarantee.
*/
public final void setDurable(final boolean durable) {
this.durable = durable;
}
@Override
public final byte[] family() {
return family;
}
@Override
public final long timestamp() {
return timestamp;
}
// ---------------------- //
// Package private stuff. //
// ---------------------- //
/** Returns whether or not it's OK to buffer this RPC on the client side. */
final boolean canBuffer() {
// Don't buffer edits that have a row-lock, we want those to
// complete ASAP so as to not hold the lock for too long.
return lockid == RowLock.NO_LOCK && bufferable;
}
/**
* Transforms this edit into a MutationProto for HBase 0.95+.
*/
abstract MutationProto toMutationProto();
// ----------------------------------------------- //
// Serialization helpers for HBase 0.94 and before //
// ----------------------------------------------- //
/**
* Serialization version for this RPC.
* Only used when this RPC is serialized as part of a {@link MultiAction}.
* @param server_version What RPC protocol version the server is running.
*/
abstract byte version(final byte server_version);
/** HBase code type for this kind of serialized RPC. */
abstract byte code();
/**
* How many {@link KeyValue}s will be serialized by {@link #serializePayload}.
*/
abstract int numKeyValues();
/**
* An estimate of the number of bytes needed for {@link #serializePayload}.
* The estimate is conservative.
*/
abstract int payloadSize();
/**
* Serialize the part of this RPC for a {@link MultiAction}.
*/
abstract void serializePayload(final ChannelBuffer buf);
}