use of io.cdap.cdap.api.dataset.DataSetException in project cdap by cdapio.
the class BufferingTable method scan.
@ReadOnly
@Override
public Scanner scan(Scan scan) {
ensureTransactionIsStarted();
NavigableMap<byte[], NavigableMap<byte[], Update>> bufferMap = scanBuffer(scan);
try {
return new BufferingScanner(bufferMap, scanPersisted(scan));
} catch (Exception e) {
LOG.debug("scan failed for table: " + getTransactionAwareName() + ", scan: " + scan.toString(), e);
throw new DataSetException("scan failed", e);
}
}
use of io.cdap.cdap.api.dataset.DataSetException in project cdap by cdapio.
the class BufferingTable method get.
@ReadOnly
@Override
public Row get(byte[] row, byte[][] columns) {
ensureTransactionIsStarted();
reportRead(1);
try {
return new Result(row, getRowMap(row, columns));
} catch (Exception e) {
LOG.debug("get failed for table: " + getTransactionAwareName() + ", row: " + Bytes.toStringBinary(row), e);
throw new DataSetException("get failed", e);
}
}
use of io.cdap.cdap.api.dataset.DataSetException in project cdap by cdapio.
the class BufferingTable method internalIncrementAndGet.
@ReadWrite
protected Row internalIncrementAndGet(byte[] row, byte[][] columns, long[] amounts) {
// Logic:
// * fetching current values
// * updating values
// * updating in-memory store
// * returning updated values as result
// NOTE: there is more efficient way to do it, but for now we want more simple implementation, not over-optimizing
Map<byte[], byte[]> rowMap;
try {
rowMap = getRowMap(row, columns);
reportRead(1);
} catch (Exception e) {
LOG.debug("incrementAndGet failed for table: " + getTransactionAwareName() + ", row: " + Bytes.toStringBinary(row), e);
throw new DataSetException("incrementAndGet failed", e);
}
byte[][] updatedValues = new byte[columns.length][];
NavigableMap<byte[], byte[]> result = Maps.newTreeMap(Bytes.BYTES_COMPARATOR);
for (int i = 0; i < columns.length; i++) {
byte[] column = columns[i];
byte[] val = rowMap.get(column);
// converting to long
long longVal;
if (val == null) {
longVal = 0L;
} else {
if (val.length != Bytes.SIZEOF_LONG) {
throw new NumberFormatException("Attempted to increment a value that is not convertible to long," + " row: " + Bytes.toStringBinary(row) + " column: " + Bytes.toStringBinary(column));
}
longVal = Bytes.toLong(val);
}
longVal += amounts[i];
updatedValues[i] = Bytes.toBytes(longVal);
result.put(column, updatedValues[i]);
}
putInternal(row, columns, updatedValues);
reportWrite(1, getSize(row) + getSize(columns) + getSize(amounts));
return new Result(row, result);
}
use of io.cdap.cdap.api.dataset.DataSetException in project cdap by cdapio.
the class BufferingTable method delete.
/**
* NOTE: Depending on the use-case, calling this method may be much less efficient than calling same method
* with columns as parameters because it will require a round trip to persistent store.
*/
@WriteOnly
@Override
public void delete(byte[] row) {
ensureTransactionIsStarted();
// this is going to be expensive, but the only we can do as delete implementation act on per-column level
try {
Map<byte[], byte[]> rowMap = getRowMap(row);
delete(row, rowMap.keySet().toArray(new byte[rowMap.keySet().size()][]));
// "0" because we don't know what gets deleted
reportWrite(1, 0);
} catch (Exception e) {
LOG.debug("delete failed for table: " + getTransactionAwareName() + ", row: " + Bytes.toStringBinary(row), e);
throw new DataSetException("delete failed", e);
}
}
use of io.cdap.cdap.api.dataset.DataSetException in project cdap by cdapio.
the class BufferingTable method compareAndSwap.
@ReadWrite
@Override
public boolean compareAndSwap(byte[] row, byte[] column, byte[] expectedValue, byte[] newValue) {
ensureTransactionIsStarted();
// TODO: add support for empty values; see https://issues.cask.co/browse/TEPHRA-45 for details.
if (newValue != null && newValue.length == 0) {
warnAboutEmptyValue(column);
}
// NOTE: there is more efficient way to do it, but for now we want more simple implementation, not over-optimizing
byte[][] columns = new byte[][] { column };
try {
byte[] currentValue = getRowMap(row, columns).get(column);
reportRead(1);
if (Arrays.equals(expectedValue, currentValue)) {
putInternal(row, columns, new byte[][] { newValue });
reportWrite(1, getSize(row) + getSize(column) + getSize(newValue));
return true;
}
} catch (Exception e) {
LOG.debug("compareAndSwap failed for table: " + getTransactionAwareName() + ", row: " + Bytes.toStringBinary(row), e);
throw new DataSetException("compareAndSwap failed", e);
}
return false;
}
Aggregations