public class MetricInstrumentedStore extends Object implements KeyColumnValueStore
MetricRegistry.name(Class, String...)
,
where methodName is the exact name of the method including capitalization,
and identifier is "time", "calls", or "exceptions".
In addition to the three standard metrics, getSlice
and
getKeys
have some additional metrics related to their return values.
getSlice
carries metrics with the identifiers "entries-returned" and
"entries-histogram". The first is a counter of total Entry objects returned.
The second is a histogram of the size of Entry lists returned.
getKeys
returns a RecordIterator
that manages metrics for its
methods.
This implementation does not catch any exceptions. Exceptions emitted by the backend store implementation are guaranteed to pass through this implementation's methods.
The implementation includes repeated try...catch
boilerplate that
could be reduced by using reflection to determine the method name and by
delegating Metrics object handling to a common helper that takes a Callable
closure, but I'm not sure that the extra complexity and potential performance
hit is worth it.
Modifier and Type | Field and Description |
---|---|
static List<String> |
EVENT_NAMES |
static String |
M_ACQUIRE_LOCK |
static String |
M_CALLS |
static String |
M_CLOSE |
static String |
M_CONTAINS_KEY |
static String |
M_ENTRIES_COUNT |
static String |
M_ENTRIES_HISTO |
static String |
M_EXCEPTIONS |
static String |
M_GET_KEYS |
static String |
M_GET_PART |
static String |
M_GET_SLICE |
static String |
M_ITERATOR |
static String |
M_MUTATE |
static String |
M_TIME |
static List<String> |
OPERATION_NAMES |
NO_ADDITIONS, NO_DELETIONS
Constructor and Description |
---|
MetricInstrumentedStore(KeyColumnValueStore backend,
String metricsStoreName) |
Modifier and Type | Method and Description |
---|---|
void |
acquireLock(StaticBuffer key,
StaticBuffer column,
StaticBuffer expectedValue,
StoreTransaction txh)
Attempts to claim a lock on the value at the specified
key and
column pair. |
void |
close()
Closes this store
|
KeyIterator |
getKeys(KeyRangeQuery query,
StoreTransaction txh)
Returns a
KeyIterator over all keys that fall within the key-range specified by the given query and have one or more columns matching the column-range. |
KeySlicesIterator |
getKeys(MultiSlicesQuery queries,
StoreTransaction txh)
Returns a
KeySlicesIterator over all keys in the store that have one or more columns matching the column-range. |
KeyIterator |
getKeys(SliceQuery query,
StoreTransaction txh)
Returns a
KeyIterator over all keys in the store that have one or more columns matching the column-range. |
Map<SliceQuery,Map<StaticBuffer,EntryList>> |
getMultiSlices(MultiKeysQueryGroups<StaticBuffer,SliceQuery> multiKeysQueryGroups,
StoreTransaction txh)
Retrieves the list of entries (i.e.
|
String |
getName()
Returns the name of this store.
|
EntryList |
getSlice(KeySliceQuery query,
StoreTransaction txh)
Retrieves the list of entries (i.e.
|
Map<StaticBuffer,EntryList> |
getSlice(List<StaticBuffer> keys,
SliceQuery query,
StoreTransaction txh)
Retrieves the list of entries (i.e.
|
void |
mutate(StaticBuffer key,
List<Entry> additions,
List<StaticBuffer> deletions,
StoreTransaction txh)
Verifies acquisition of locks
txh from previous calls to
KeyColumnValueStore.acquireLock(StaticBuffer, StaticBuffer, StaticBuffer, StoreTransaction)
, then writes supplied additions and/or deletions to
key in the underlying data store. |
public static final String M_CONTAINS_KEY
public static final String M_GET_SLICE
public static final String M_MUTATE
public static final String M_ACQUIRE_LOCK
public static final String M_GET_KEYS
public static final String M_GET_PART
public static final String M_CLOSE
public static final String M_CALLS
public static final String M_TIME
public static final String M_EXCEPTIONS
public static final String M_ENTRIES_COUNT
public static final String M_ENTRIES_HISTO
public static final String M_ITERATOR
public MetricInstrumentedStore(KeyColumnValueStore backend, String metricsStoreName)
public EntryList getSlice(KeySliceQuery query, StoreTransaction txh) throws BackendException
KeyColumnValueStore
getSlice
in interface KeyColumnValueStore
query
- Query to get results fortxh
- TransactionBackendException
- when columnEnd < columnStartKeySliceQuery
public Map<StaticBuffer,EntryList> getSlice(List<StaticBuffer> keys, SliceQuery query, StoreTransaction txh) throws BackendException
KeyColumnValueStore
SliceQuery
for all
of the given keys together.getSlice
in interface KeyColumnValueStore
keys
- List of keysquery
- Slicequery specifying matching entriestxh
- TransactionBackendException
public Map<SliceQuery,Map<StaticBuffer,EntryList>> getMultiSlices(MultiKeysQueryGroups<StaticBuffer,SliceQuery> multiKeysQueryGroups, StoreTransaction txh) throws BackendException
KeyColumnValueStore
SliceQuery
for all respective given keys together.
SliceQuery
via KeyColumnValueStore.getSlice(List, SliceQuery, StoreTransaction)
.
SliceQuery
) in the
shortest time possible.
getMultiSlices
in interface KeyColumnValueStore
multiKeysQueryGroups
- List of Tuples where key is a List of SliceQuery
queries which has
to be performed and a value is a list of keys for which all the queries have
to be performed.txh
- TransactionSliceQuery
and each of the given key.
EntryList
result should be provided for each of the StaticBuffer
of each of the SliceQuery
.BackendException
public void mutate(StaticBuffer key, List<Entry> additions, List<StaticBuffer> deletions, StoreTransaction txh) throws BackendException
KeyColumnValueStore
txh
from previous calls to
KeyColumnValueStore.acquireLock(StaticBuffer, StaticBuffer, StaticBuffer, StoreTransaction)
, then writes supplied additions
and/or deletions
to
key
in the underlying data store. Deletions are applied strictly
before additions. In other words, if both an addition and deletion are
supplied for the same column, then the column will first be deleted and
then the supplied Entry for the column will be added.
Implementations which don't support locking should skip the initial lock verification step but otherwise behave as described above.
mutate
in interface KeyColumnValueStore
key
- the key under which the columns in additions
and
deletions
will be writtenadditions
- the list of Entry instances representing column-value pairs to
create under key
, or null to add no column-value pairsdeletions
- the list of columns to delete from key
, or null to
delete no columnstxh
- the transaction to usePermanentLockingException
- if locking is supported by the implementation and at least
one lock acquisition attempted by
KeyColumnValueStore.acquireLock(StaticBuffer, StaticBuffer, StaticBuffer, StoreTransaction)
has failedBackendException
public void acquireLock(StaticBuffer key, StaticBuffer column, StaticBuffer expectedValue, StoreTransaction txh) throws BackendException
KeyColumnValueStore
key
and
column
pair. These locks are discretionary.
If locking fails, implementations of this method may, but are not
required to, throw PermanentLockingException
.
This method is not required
to determine whether locking actually succeeded and may return without
throwing an exception even when the lock can't be acquired. Lock
acquisition is only only guaranteed to be verified by the first call to
KeyColumnValueStore.mutate(StaticBuffer, List, List, StoreTransaction)
on any given
txh
.
The expectedValue
must match the actual value present at the
key
and column
pair. If the true value does not match the
expectedValue
, the lock attempt fails and
LockingException
is thrown. This method may check
expectedValue
. The mutate()
mutate is required to check
it.
When this method is called multiple times on the same key
,
column
, and txh
, calls after the first have no effect.
Locks acquired by this method must be automatically released on
transaction commit()
or rollback()
.
Implementations which don't support locking should throw
UnsupportedOperationException
.
acquireLock
in interface KeyColumnValueStore
key
- the key on which to lockcolumn
- the column on which to lockexpectedValue
- the expected value for the specified key-column pair on which
to lock (null means the pair must have no value)txh
- the transaction to usePermanentLockingException
- the lock could not be acquired due to contention with other
transactions or a locking-specific storage problemBackendException
public KeyIterator getKeys(KeyRangeQuery query, StoreTransaction txh) throws BackendException
KeyColumnValueStore
KeyIterator
over all keys that fall within the key-range specified by the given query and have one or more columns matching the column-range.
Calling KeyIterator.getEntries()
returns the list of all entries that match the column-range specified by the given query.
This method is only supported by stores which keep keys in byte-order.
getKeys
in interface KeyColumnValueStore
BackendException
public KeyIterator getKeys(SliceQuery query, StoreTransaction txh) throws BackendException
KeyColumnValueStore
KeyIterator
over all keys in the store that have one or more columns matching the column-range. Calling KeyIterator.getEntries()
returns the list of all entries that match the column-range specified by the given query.
This method is only supported by stores which do not keep keys in byte-order.
getKeys
in interface KeyColumnValueStore
BackendException
public KeySlicesIterator getKeys(MultiSlicesQuery queries, StoreTransaction txh) throws BackendException
KeyColumnValueStore
KeySlicesIterator
over all keys in the store that have one or more columns matching the column-range. Calling KeySlicesIterator.getEntries()
returns the map of all entries that match the column-range specified by the given queries.
This method is mandatory for stores which do not guaranty key orders while running parallel scans.
getKeys
in interface KeyColumnValueStore
BackendException
public String getName()
KeyColumnValueStore
getName
in interface KeyColumnValueStore
KeyColumnValueStoreManager.openDatabase(String)
public void close() throws BackendException
KeyColumnValueStore
close
in interface KeyColumnValueStore
BackendException
Copyright © 2012–2024. All rights reserved.