@Override public boolean processResults(CommitData cd, Iterator<Result> results) throws Exception { while (results.hasNext()) { Result result = results.next(); // TODO handle unknown? Bytes row = Bytes.of(result.getMutation().getRow()); if (result.getStatus() == Status.ACCEPTED) { cd.acceptedRows.add(row); } else { cd.addToRejected(row, updates.get(row).keySet()); } } return cd.getRejected().isEmpty(); }
ConditionalMutation toMutation() { Condition cond = new Condition("meta", "seq"); if (seq >= 0) cond.setValue(seq + ""); ConditionalMutation cm = new ConditionalMutation(row, cond); cm.put("meta", "seq", (seq + 1) + ""); cm.put("meta", "sum", (sum) + ""); for (int i = 0; i < data.length; i++) { cm.put("data", i + "", data[i] + ""); } return cm; }
@Override public Iterator<Result> write(Iterator<ConditionalMutation> mutations) { BlockingQueue<Result> resultQueue = new LinkedBlockingQueue<>(); List<QCMutation> mutationList = new ArrayList<>(); int count = 0; long entryTime = System.currentTimeMillis(); mloop: while (mutations.hasNext()) { ConditionalMutation mut = mutations.next(); count++; if (mut.getConditions().size() == 0) throw new IllegalArgumentException( "ConditionalMutation had no conditions " + new String(mut.getRow(), UTF_8)); for (Condition cond : mut.getConditions()) { if (!isVisible(cond.getVisibility())) { resultQueue.add(new Result(Status.INVISIBLE_VISIBILITY, mut, null)); continue mloop; } } // copy the mutations so that even if caller changes it, it will not matter mutationList.add(new QCMutation(mut, resultQueue, entryTime)); } queue(mutationList); return new RQIterator(resultQueue, count); }
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvaob)); cm0.put("name+", "last", cvaob, "doe"); cm0.put("name", "first", cvaob, "john"); cm0.put("tx", "seq", cvaob, "1"); mutations.add(cm0); ConditionalMutation cm1 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvaab)); cm1.put("name", "last", cvaab, "doe"); cm1.put("name", "first", cvaab, "jane"); cm1.put("tx", "seq", cvaab, "1"); mutations.add(cm1); ConditionalMutation cm2 = new ConditionalMutation("19059", new Condition("tx", "seq").setVisibility(cvaob)); cm2.put("name", "last", cvaob, "doe"); cm2.put("name", "first", cvaob, "jack"); cm2.put("tx", "seq", cvaob, "1"); mutations.add(cm2); ConditionalMutation cm3 = new ConditionalMutation("90909", new Condition("tx", "seq").setVisibility(cvaob).setValue("1")); cm3.put("name", "last", cvaob, "doe"); cm3.put("name", "first", cvaob, "john"); cm3.put("tx", "seq", cvaob, "2"); mutations.add(cm3); while (results.hasNext()) {
/** * Creates a {@link ConditionalMutation} that only updates the cardinality * of the PCJ table if the old value has not changed by the time this mutation * is committed to Accumulo. * * @param current - The current cardinality value. * @param delta - How much the cardinality will change. * @return The mutation that will perform the conditional update. */ private static ConditionalMutation makeUpdateCardinalityMutation(final long current, final long delta) { // Try to update the cardinality by the delta. final ConditionalMutation mutation = new ConditionalMutation(PCJ_METADATA_ROW_ID); final Condition lastCardinalityStillCurrent = new Condition( PCJ_METADATA_FAMILY, PCJ_METADATA_CARDINALITY); // Require the old cardinality to be the value we just read. final byte[] currentCardinalityBytes = longLexicoder.encode( current ); lastCardinalityStillCurrent.setValue( currentCardinalityBytes ); mutation.addCondition(lastCardinalityStillCurrent); // If that is the case, then update to the new value. final Value newCardinality = new Value( longLexicoder.encode(current + delta) ); mutation.put(PCJ_METADATA_FAMILY, PCJ_METADATA_CARDINALITY, newCardinality); return mutation; }
ConditionalMutation m = new ConditionalMutation(Utils.getBank(i)); int acceptedCount = 0; for (int j = 0; j < numAccts; j++) { String cf = Utils.getAccount(j); m.addCondition(new Condition(cf, "seq")); m.put(cf, "bal", "100"); m.put(cf, "seq", Utils.getSeq(0)); m = new ConditionalMutation(Utils.getBank(i)); if (m.getConditions().size() > 0) { Status status = cw.write(m).getStatus(); while (status == Status.UNKNOWN)
ConditionalMutation cmut = new ConditionalMutation(ByteBufferUtil.toBytes(cu.getKey())); cmut.addCondition(cond); ByteBuffer row = ByteBuffer.wrap(result.getMutation().getRow()); ConditionalStatus status = ConditionalStatus.valueOf(result.getStatus().name()); resultMap.put(row, status);
ByteBuffer key = ByteBuffer.wrap(mutation.getRow()); ConditionalUpdates update = updates.get(key); updates.put(key, update); mutationMap.put(key, mutation); update.setConditions(ThriftHelper.toThriftCondition(mutation.getConditions())); List<ColumnUpdate> tupdates = new LinkedList<ColumnUpdate>(); ThriftHelper.addThriftColumnUpdates(tupdates, mutation.getUpdates()); update.setUpdates(tupdates);
private boolean checkForAckCollision(ConditionalMutation cm) { Bytes row = Bytes.of(cm.getRow()); List<ColumnUpdate> updates = cm.getUpdates();
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq")); cm0.put("name", "last", "doe"); cm0.put("name", "first", "john"); cm0.put("tx", "seq", "1"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm0).getStatus()); Assert.assertEquals(Status.REJECTED, cw.write(cm0).getStatus()); ConditionalMutation cm1 = new ConditionalMutation("99006", new Condition("tx", "seq").setValue("1")); cm1.put("name", "last", "Doe"); cm1.put("tx", "seq", "2"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm1).getStatus()); ConditionalMutation cm2 = new ConditionalMutation("99006", new Condition("tx", "seq").setValue("1")); cm2.put("name", "last", "DOE"); cm2.put("tx", "seq", "2"); Assert.assertEquals(Status.REJECTED, cw.write(cm2).getStatus()); ConditionalMutation cm3 = new ConditionalMutation("99006", new Condition("txtypo", "seq").setValue("1")); cm3.put("name", "last", "deo"); cm3.put("tx", "seq", "2"); Assert.assertEquals(Status.REJECTED, cw.write(cm3).getStatus()); ConditionalMutation cm4 = new ConditionalMutation("99006", new Condition("tx", "seq").setValue("2"), new Condition("name", "last").setValue("doe")); cm4.put("name", "last", "deo"); cm4.put("tx", "seq", "3");
private List<TCondition> convertConditions(ConditionalMutation cm, CompressedIterators compressedIters) { List<TCondition> conditions = new ArrayList<>(cm.getConditions().size()); // sort conditions inorder to get better lookup performance. Sort on client side so tserver does // not have to do it. Condition[] ca = cm.getConditions().toArray(new Condition[cm.getConditions().size()]); Arrays.sort(ca, CONDITION_COMPARATOR); for (Condition cond : ca) { long ts = 0; boolean hasTs = false; if (cond.getTimestamp() != null) { ts = cond.getTimestamp(); hasTs = true; } ByteBuffer iters = compressedIters.compress(cond.getIterators()); TCondition tc = new TCondition(ByteBufferUtil.toByteBuffers(cond.getFamily()), ByteBufferUtil.toByteBuffers(cond.getQualifier()), ByteBufferUtil.toByteBuffers(cond.getVisibility()), ts, hasTs, ByteBufferUtil.toByteBuffers(cond.getValue()), iters); conditions.add(tc); } return conditions; }
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvab)); cm0.put("name", "last", cvab, "doe"); cm0.put("name", "first", cvab, "john"); cm0.put("tx", "seq", cvab, "1"); mutations.add(cm0); ConditionalMutation cm1 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvab)); cm1.put("name", "last", cvab, "doe"); cm1.put("name", "first", cvab, "jane"); cm1.put("tx", "seq", cvab, "1"); mutations.add(cm1); ConditionalMutation cm2 = new ConditionalMutation("19059", new Condition("tx", "seq").setVisibility(cvab)); cm2.put("name", "last", cvab, "doe"); cm2.put("name", "first", cvab, "jack"); cm2.put("tx", "seq", cvab, "1"); mutations.add(cm2); ConditionalMutation cm3 = new ConditionalMutation("99006", new Condition("tx", "seq").setVisibility(cvab).setValue("1")); cm3.put("name", "last", cvab, "Doe"); cm3.put("tx", "seq", cvab, "2"); mutations.add(cm3); ConditionalMutation cm4 = new ConditionalMutation("59056", new Condition("tx", "seq").setVisibility(cvab));
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));
private boolean checkForAckCollision(ConditionalMutation cm) { Bytes row = Bytes.of(cm.getRow()); List<ColumnUpdate> updates = cm.getUpdates();
private List<TCondition> convertConditions(ConditionalMutation cm, CompressedIterators compressedIters) { List<TCondition> conditions = new ArrayList<>(cm.getConditions().size()); // sort conditions inorder to get better lookup performance. Sort on client side so tserver does // not have to do it. Condition[] ca = cm.getConditions().toArray(new Condition[cm.getConditions().size()]); Arrays.sort(ca, CONDITION_COMPARATOR); for (Condition cond : ca) { long ts = 0; boolean hasTs = false; if (cond.getTimestamp() != null) { ts = cond.getTimestamp(); hasTs = true; } ByteBuffer iters = compressedIters.compress(cond.getIterators()); TCondition tc = new TCondition(ByteBufferUtil.toByteBuffers(cond.getFamily()), ByteBufferUtil.toByteBuffers(cond.getQualifier()), ByteBufferUtil.toByteBuffers(cond.getVisibility()), ts, hasTs, ByteBufferUtil.toByteBuffers(cond.getValue()), iters); conditions.add(tc); } return conditions; }
@Test(expected = IllegalArgumentException.class) public void testNoConditions() throws AccumuloException, AccumuloSecurityException, TableExistsException, TableNotFoundException { String table = getUniqueNames(1)[0]; Connector conn = getConnector(); conn.tableOperations().create(table); try ( ConditionalWriter cw = conn.createConditionalWriter(table, new ConditionalWriterConfig())) { ConditionalMutation cm1 = new ConditionalMutation("r1"); cm1.put("tx", "seq", "1"); cm1.put("data", "x", "a"); cw.write(cm1); } }
ConditionalMutation cm6 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setValue("8")); cm6.put("count", "comments", "7"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm6).getStatus()); ConditionalMutation cm7 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2).setValue("27")); cm7.put("count", "comments", "8"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm7).getStatus()); ConditionalMutation cm8 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2, aiConfig3).setValue("35")); cm8.put("count", "comments", "9"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm8).getStatus()); ConditionalMutation cm3 = new ConditionalMutation("ACCUMULO-1000", new Condition("count", "comments").setIterators(aiConfig2).setValue("33")); cm3.put("count", "comments", "3"); ConditionalMutation cm4 = new ConditionalMutation("ACCUMULO-1001", new Condition("count", "comments").setIterators(aiConfig3).setValue("14")); cm4.put("count", "comments", "3"); ConditionalMutation cm5 = new ConditionalMutation("ACCUMULO-1002", new Condition("count", "comments").setIterators(aiConfig3).setValue("10")); cm5.put("count", "comments", "3"); String k = new String(result.getMutation().getRow()); Assert.assertFalse("Did not expect to see multiple resultus for the row: " + k,
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));
private boolean checkForAckCollision(ConditionalMutation cm) { Bytes row = Bytes.of(cm.getRow()); List<ColumnUpdate> updates = cm.getUpdates();
@Override public boolean processResults(CommitData cd, Iterator<Result> results) throws Exception { while (results.hasNext()) { Result result = results.next(); // TODO handle unknown? Bytes row = Bytes.of(result.getMutation().getRow()); if (result.getStatus() == Status.ACCEPTED) { cd.acceptedRows.add(row); } else { cd.addToRejected(row, updates.get(row).keySet()); } } return cd.getRejected().size() == 0; }