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; }
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; }
@Override public int compare(Condition c1, Condition c2) { int comp = c1.getFamily().compareTo(c2.getFamily()); if (comp == 0) { comp = c1.getQualifier().compareTo(c2.getQualifier()); if (comp == 0) { comp = c1.getVisibility().compareTo(c2.getVisibility()); if (comp == 0) { Long l1 = c1.getTimestamp(); Long l2 = c2.getTimestamp(); if (l1 == null) { l1 = MAX; } if (l2 == null) { l2 = MAX; } comp = l2.compareTo(l1); } } } return comp; } }
new org.apache.accumulo.core.data.Condition( tcond.column.getColFamily(), tcond.column.getColQualifier()); cond.setVisibility(getCahcedCV(vizMap, tcond.getColumn().getColVisibility())); cond.setValue(tcond.getValue()); cond.setTimestamp(tcond.getTimestamp()); cond.setIterators(getIteratorSettings(tcond.getIterators()) .toArray(new IteratorSetting[tcond.getIterators().size()]));
new ConditionalWriterConfig().setTimeout(3, TimeUnit.SECONDS))) { ConditionalMutation cm1 = new ConditionalMutation("r1", new Condition("tx", "seq")); cm1.put("tx", "seq", "1"); cm1.put("data", "x", "a"); new Condition("tx", "seq").setValue("1").setIterators(is)); cm2.put("tx", "seq", "2"); cm2.put("data", "x", "b"); new Condition("tx", "seq").setValue("1")); cm3.put("tx", "seq", "2"); cm3.put("data", "x", "b");
new Condition("tx", "seq").setVisibility(cvb)); cm0.put("name", "last", cva, "doe"); cm0.put("name", "first", cva, "john"); new Condition("tx", "seq").setVisibility(cvb).setValue("1")); cm1.put("name", "last", cva, "doe"); cm1.put("name", "first", cva, "john"); new Condition("tx", "seq").setVisibility(cvc)); cm2.put("name", "last", cva, "doe"); cm2.put("name", "first", cva, "john"); new Condition("tx", "seq").setVisibility(cvc).setValue("1")); cm3.put("name", "last", cva, "doe"); cm3.put("name", "first", cva, "john"); new Condition("tx", "seq").setVisibility(cvb), new Condition("tx", "seq").setVisibility(cva)); new Condition("tx", "seq").setVisibility(cvb).setValue("1"), new Condition("tx", "seq").setVisibility(cva).setValue("1")); cm5.put("name", "last", cva, "doe"); cm5.put("name", "first", cva, "john"); new Condition("tx", "seq").setVisibility(cvb).setValue("1"), new Condition("tx", "seq").setVisibility(cva)); cm6.put("name", "last", cva, "doe"); cm6.put("name", "first", cva, "john");
@Override public Collection<ConditionalMutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); boolean isTrigger = isTriggerRow(cd.prow) && cd.pcol.equals(notification.getColumn()); Condition lockCheck = new FluoCondition(env, cd.pcol).setIterators(iterConf).setValue(LockValue.encode(cd.prow, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isTrigger, getTransactorID())); final ConditionalMutation delLockMutation = new ConditionalFlutation(env, cd.prow, lockCheck); ColumnUtil.commitColumn(env, isTrigger, true, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isReadLock(cd.pval), startTs, commitTs, observedColumns, delLockMutation); return Collections.singletonList(delLockMutation); }
private void conditionWriteSome(String tableName, int n, ConditionalWriterConfig cfg) throws Exception { Connector c = getConnector(); ConditionalWriter cw = c.createConditionalWriter(tableName, cfg); for (int i = 0; i < n; i++) { ConditionalMutation m = new ConditionalMutation((CharSequence) (i + ""), new Condition("", "")); m.put("", "", "X"); assertEquals(Status.ACCEPTED, cw.write(m).getStatus()); } }
@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) { } } }
new Condition("tx", "seq").setVisibility(cva)); cm0.put("name", "last", cva, "doe"); cm0.put("name", "first", cva, "john"); new Condition("txA", "seq").setVisibility(cva).setValue("1")); cm1.put("name", "last", cva, "Doe"); cm1.put("name", "first", cva, "John"); new Condition("tx", "seqA").setVisibility(cva).setValue("1")); cm2.put("name", "last", cva, "Doe"); cm2.put("name", "first", cva, "John"); new Condition("tx", "seq").setVisibility(cvb).setValue("1")); cm3.put("name", "last", cva, "Doe"); cm3.put("name", "first", cva, "John"); new Condition("tx", "seq").setVisibility(cva).setTimestamp(ts + 1).setValue("1")); cm4.put("name", "last", cva, "Doe"); cm4.put("name", "first", cva, "John"); new Condition("tx", "seq").setVisibility(cva).setTimestamp(ts - 1).setValue("1")); cm5.put("name", "last", cva, "Doe"); cm5.put("name", "first", cva, "John"); new Condition("tx", "seq").setVisibility(cva).setTimestamp(ts).setValue("1")); cm6.put("name", "last", cva, "Doe"); cm6.put("name", "first", cva, "John");
new Condition("count", "comments").setValue("8")); cm6.put("count", "comments", "7"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm6).getStatus()); new Condition("count", "comments").setIterators(aiConfig2).setValue("27")); cm7.put("count", "comments", "8"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm7).getStatus()); new Condition("count", "comments").setIterators(aiConfig2, aiConfig3).setValue("35")); cm8.put("count", "comments", "9"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm8).getStatus()); new Condition("count", "comments").setIterators(aiConfig2).setValue("33")); cm3.put("count", "comments", "3"); new Condition("count", "comments").setIterators(aiConfig3).setValue("14")); cm4.put("count", "comments", "3"); new Condition("count", "comments").setIterators(aiConfig3).setValue("10")); cm5.put("count", "comments", "3");
new Condition("tx", "seq").setVisibility(cvab)); cm0.put("name", "last", cvab, "doe"); cm0.put("name", "first", cvab, "john"); new Condition("tx", "seq").setVisibility(cvab)); cm1.put("name", "last", cvab, "doe"); cm1.put("name", "first", cvab, "jane"); new Condition("tx", "seq").setVisibility(cvab)); cm2.put("name", "last", cvab, "doe"); cm2.put("name", "first", cvab, "jack"); new Condition("tx", "seq").setVisibility(cvab).setValue("1")); cm3.put("name", "last", cvab, "Doe"); cm3.put("tx", "seq", cvab, "2"); new Condition("tx", "seq").setVisibility(cvab)); cm4.put("name", "last", cvab, "Doe"); cm4.put("tx", "seq", cvab, "1"); new Condition("tx", "seq").setVisibility(cvab).setValue("2")); cm5.put("name", "last", cvab, "Doe"); cm5.put("tx", "seq", cvab, "3");
private static boolean rollbackPrimary(Environment env, long startTs, PrimaryRowColumn prc, byte[] lockValue) { // TODO review use of PrewriteIter here IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); ConditionalFlutation delLockMutation = new ConditionalFlutation(env, prc.prow, new FluoCondition(env, prc.pcol).setIterators(iterConf).setValue(lockValue)); delLockMutation.put(prc.pcol, ColumnConstants.DEL_LOCK_PREFIX | prc.startTs, DelLockValue.encodeRollback(true, true)); ConditionalWriter cw = null; cw = env.getSharedResources().getConditionalWriter(); // TODO handle other conditional writer cases try { return cw.write(delLockMutation).getStatus() == Status.ACCEPTED; } catch (AccumuloException e) { throw new RuntimeException(e); } catch (AccumuloSecurityException e) { throw new RuntimeException(e); } }
@Test public void testConstraints() throws Exception { // ensure constraint violations are properly reported Connector conn = getConnector(); String tableName = getUniqueNames(1)[0]; conn.tableOperations().create(tableName); conn.tableOperations().addConstraint(tableName, AlphaNumKeyConstraint.class.getName()); conn.tableOperations().clone(tableName, tableName + "_clone", true, new HashMap<String,String>(), new HashSet<String>()); Scanner scanner = conn.createScanner(tableName + "_clone", new Authorizations()); try (ConditionalWriter cw = conn.createConditionalWriter(tableName + "_clone", new ConditionalWriterConfig())) { ConditionalMutation cm0 = new ConditionalMutation("99006+", new Condition("tx", "seq")); cm0.put("tx", "seq", "1"); Assert.assertEquals(Status.VIOLATED, cw.write(cm0).getStatus()); Assert.assertFalse("Should find no results in the table is mutation result was violated", scanner.iterator().hasNext()); ConditionalMutation cm1 = new ConditionalMutation("99006", new Condition("tx", "seq")); cm1.put("tx", "seq", "1"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm1).getStatus()); Assert.assertTrue("Accepted result should be returned when reading table", scanner.iterator().hasNext()); } }
new ConditionalWriterConfig())) { ConditionalMutation cm1 = new ConditionalMutation("r1", new Condition("tx", "seq")); cm1.put("tx", "seq", "1"); cm1.put("data", "x", "a"); new Condition("tx", "seq").setValue("1")); cm2.put("tx", "seq", "2"); cm2.put("data", "x", "b"); new Condition("tx", "seq").setValue("1")); cm3.put("tx", "seq", "2"); cm3.put("data", "x", "c"); new Condition("tx", "seq").setValue("1")); cm4.put("tx", "seq", "2"); cm4.put("data", "x", "d");
new Condition("count", "comments").setValue("3")); cm0.put("count", "comments", "1"); Assert.assertEquals(Status.REJECTED, cw.write(cm0).getStatus()); new Condition("count", "comments").setIterators(iterConfig).setValue("3")); cm1.put("count", "comments", "1"); Assert.assertEquals(Status.ACCEPTED, cw.write(cm1).getStatus()); new Condition("count", "comments").setValue("4")); cm2.put("count", "comments", "1"); Assert.assertEquals(Status.REJECTED, cw.write(cm1).getStatus()); new Condition("count", "comments").setIterators(iterConfig).setValue("4")); cm3.put("count", "comments", "1"); new Condition("count2", "comments").setIterators(iterConfig2).setValue("2")); cm4.put("count2", "comments", "1"); new Condition("count2", "comments").setIterators(iterConfig2, iterConfig3).setValue("2")); cm5.put("count2", "comments", "1");
new Condition("tx", "seq").setVisibility(cvaob)); cm0.put("name+", "last", cvaob, "doe"); cm0.put("name", "first", cvaob, "john"); new Condition("tx", "seq").setVisibility(cvaab)); cm1.put("name", "last", cvaab, "doe"); cm1.put("name", "first", cvaab, "jane"); new Condition("tx", "seq").setVisibility(cvaob)); cm2.put("name", "last", cvaob, "doe"); cm2.put("name", "first", cvaob, "jack"); new Condition("tx", "seq").setVisibility(cvaob).setValue("1")); cm3.put("name", "last", cvaob, "doe"); cm3.put("name", "first", cvaob, "john");
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; }
@Override public Collection<ConditionalMutation> createMutations(CommitData cd) { long commitTs = getStats().getCommitTs(); IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); boolean isTrigger = isTriggerRow(cd.prow) && cd.pcol.equals(notification.getColumn()); Condition lockCheck = new FluoCondition(env, cd.pcol).setIterators(iterConf).setValue(LockValue.encode(cd.prow, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isTrigger, getTransactorID())); final ConditionalMutation delLockMutation = new ConditionalFlutation(env, cd.prow, lockCheck); ColumnUtil.commitColumn(env, isTrigger, true, cd.pcol, isWrite(cd.pval), isDelete(cd.pval), isReadLock(cd.pval), startTs, commitTs, observedColumns, delLockMutation); return Collections.singletonList(delLockMutation); }
ConditionalMutation cm0 = new ConditionalMutation("99006", new Condition("tx", "seq")); cm0.put("name", "last", "doe"); cm0.put("name", "first", "john");