use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testOffline.
@Test
public void testOffline() throws Exception {
String table = getUniqueNames(1)[0];
Connector conn = getConnector();
conn.tableOperations().create(table);
try (ConditionalWriter cw = conn.createConditionalWriter(table, new ConditionalWriterConfig())) {
conn.tableOperations().offline(table, true);
ConditionalMutation cm1 = new ConditionalMutation("r1", new Condition("tx", "seq"));
cm1.put("tx", "seq", "1");
cm1.put("data", "x", "a");
Result result = cw.write(cm1);
try {
Status status = result.getStatus();
Assert.fail("Expected exception writing conditional mutation to offline table. Got status: " + status);
} catch (AccumuloException ae) {
Assert.assertEquals(TableOfflineException.class, ae.getCause().getClass());
}
try {
conn.createConditionalWriter(table, new ConditionalWriterConfig());
Assert.fail("Expected exception creating conditional writer to offline table");
} catch (TableOfflineException e) {
}
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project incubator-rya by apache.
the class AccumuloRyaInstanceDetailsRepository method update.
@Override
public void update(final RyaDetails oldDetails, final RyaDetails newDetails) throws NotInitializedException, ConcurrentUpdateException, RyaDetailsRepositoryException {
// Preconditions.
requireNonNull(oldDetails);
requireNonNull(newDetails);
if (!newDetails.getRyaInstanceName().equals(instanceName)) {
throw new RyaDetailsRepositoryException("The instance name that was in the provided 'newDetails' does not match " + "the instance name that this repository is connected to. Make sure you're connected to the" + "correct Rya instance.");
}
if (!isInitialized()) {
throw new NotInitializedException("Could not update the details for the Rya instanced named '" + instanceName + "' because it has not been initialized yet.");
}
// Use a conditional writer so that we can detect when the old details
// are no longer the currently stored ones.
ConditionalWriter writer = null;
try {
// Setup the condition that ensures the details have not changed since the edits were made.
final byte[] oldDetailsBytes = serializer.serialize(oldDetails);
final Condition condition = new Condition(COL_FAMILY, COL_QUALIFIER);
condition.setValue(oldDetailsBytes);
// Create the mutation that only performs the update if the details haven't changed.
final ConditionalMutation mutation = new ConditionalMutation(ROW_ID);
mutation.addCondition(condition);
final byte[] newDetailsBytes = serializer.serialize(newDetails);
mutation.put(COL_FAMILY, COL_QUALIFIER, new Value(newDetailsBytes));
// Do the write.
writer = connector.createConditionalWriter(detailsTableName, new ConditionalWriterConfig());
final Result result = writer.write(mutation);
switch(result.getStatus()) {
case REJECTED:
case VIOLATED:
throw new ConcurrentUpdateException("Could not update the details for the Rya instance named '" + instanceName + "' because the old value is out of date.");
case UNKNOWN:
case INVISIBLE_VISIBILITY:
throw new RyaDetailsRepositoryException("Could not update the details for the Rya instance named '" + instanceName + "'.");
}
} catch (final TableNotFoundException | AccumuloException | AccumuloSecurityException e) {
throw new RyaDetailsRepositoryException("Could not update the details for the Rya instance named '" + instanceName + "'.");
} finally {
if (writer != null) {
writer.close();
}
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testSameRow.
@Test
public void testSameRow() throws Exception {
// test multiple mutations for same row in same batch
Connector conn = getConnector();
String tableName = getUniqueNames(1)[0];
conn.tableOperations().create(tableName);
try (ConditionalWriter cw = conn.createConditionalWriter(tableName, new ConditionalWriterConfig())) {
ConditionalMutation cm1 = new ConditionalMutation("r1", new Condition("tx", "seq"));
cm1.put("tx", "seq", "1");
cm1.put("data", "x", "a");
Assert.assertEquals(Status.ACCEPTED, cw.write(cm1).getStatus());
ConditionalMutation cm2 = new ConditionalMutation("r1", new Condition("tx", "seq").setValue("1"));
cm2.put("tx", "seq", "2");
cm2.put("data", "x", "b");
ConditionalMutation cm3 = new ConditionalMutation("r1", new Condition("tx", "seq").setValue("1"));
cm3.put("tx", "seq", "2");
cm3.put("data", "x", "c");
ConditionalMutation cm4 = new ConditionalMutation("r1", new Condition("tx", "seq").setValue("1"));
cm4.put("tx", "seq", "2");
cm4.put("data", "x", "d");
Iterator<Result> results = cw.write(Arrays.asList(cm2, cm3, cm4).iterator());
int accepted = 0;
int rejected = 0;
int total = 0;
while (results.hasNext()) {
Status status = results.next().getStatus();
if (status == Status.ACCEPTED)
accepted++;
if (status == Status.REJECTED)
rejected++;
total++;
}
Assert.assertEquals("Expected one accepted result", 1, accepted);
Assert.assertEquals("Expected two rejected results", 2, rejected);
Assert.assertEquals("Expected three total results", 3, total);
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testError.
@Test
public void testError() throws Exception {
String table = getUniqueNames(1)[0];
Connector conn = getConnector();
conn.tableOperations().create(table);
try (ConditionalWriter cw = conn.createConditionalWriter(table, new ConditionalWriterConfig())) {
IteratorSetting iterSetting = new IteratorSetting(5, BadIterator.class);
ConditionalMutation cm1 = new ConditionalMutation("r1", new Condition("tx", "seq").setIterators(iterSetting));
cm1.put("tx", "seq", "1");
cm1.put("data", "x", "a");
Result result = cw.write(cm1);
try {
Status status = result.getStatus();
Assert.fail("Expected exception using iterator which throws an error, Got status: " + status);
} catch (AccumuloException ae) {
}
}
}
use of org.apache.accumulo.core.client.ConditionalWriter.Result in project accumulo by apache.
the class ConditionalWriterIT method testBigBatch.
@Test
public void testBigBatch() throws Exception {
Connector conn = getConnector();
String tableName = getUniqueNames(1)[0];
conn.tableOperations().create(tableName);
conn.tableOperations().addSplits(tableName, nss("2", "4", "6"));
sleepUninterruptibly(2, TimeUnit.SECONDS);
int num = 100;
ArrayList<byte[]> rows = new ArrayList<>(num);
ArrayList<ConditionalMutation> cml = new ArrayList<>(num);
Random r = new Random();
byte[] e = new byte[0];
for (int i = 0; i < num; i++) {
rows.add(FastFormat.toZeroPaddedString(abs(r.nextLong()), 16, 16, e));
}
for (int i = 0; i < num; i++) {
ConditionalMutation cm = new ConditionalMutation(rows.get(i), new Condition("meta", "seq"));
cm.put("meta", "seq", "1");
cm.put("meta", "tx", UUID.randomUUID().toString());
cml.add(cm);
}
try (ConditionalWriter cw = conn.createConditionalWriter(tableName, new ConditionalWriterConfig())) {
Iterator<Result> results = cw.write(cml.iterator());
int count = 0;
// TODO check got each row back
while (results.hasNext()) {
Result result = results.next();
Assert.assertEquals(Status.ACCEPTED, result.getStatus());
count++;
}
Assert.assertEquals("Did not receive the expected number of results", num, count);
ArrayList<ConditionalMutation> cml2 = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
ConditionalMutation cm = new ConditionalMutation(rows.get(i), new Condition("meta", "seq").setValue("1"));
cm.put("meta", "seq", "2");
cm.put("meta", "tx", UUID.randomUUID().toString());
cml2.add(cm);
}
count = 0;
results = cw.write(cml2.iterator());
while (results.hasNext()) {
Result result = results.next();
Assert.assertEquals(Status.ACCEPTED, result.getStatus());
count++;
}
Assert.assertEquals("Did not receive the expected number of results", num, count);
}
}
Aggregations