public static long decodeTs(Key k) { return decodeTs(k.getTimestamp()); }
@Override public Collection<Mutation> createMutations(CommitData cd) { // roll back locks // TODO let rollback be done lazily? this makes GC more difficult Flutation m; ArrayList<Mutation> mutations = new ArrayList<>(cd.acceptedRows.size()); for (Bytes row : cd.acceptedRows) { m = new Flutation(env, row); for (Entry<Column, Bytes> entry : updates.get(row).entrySet()) { if (isReadLock(entry.getValue())) { m.put(entry.getKey(), ColumnConstants.RLOCK_PREFIX | ReadLockUtil.encodeTs(startTs, true), DelReadLockValue.encodeRollback()); } else { m.put(entry.getKey(), ColumnConstants.DEL_LOCK_PREFIX | startTs, DelLockValue.encodeRollback(false, true)); } } mutations.add(m); } return mutations; } }
public static boolean isDelete(Key k) { return isDelete(k.getTimestamp()); }
if (ReadLockUtil.isDelete(source.getTopKey())) { lastDelete.set(source.getTopKey()); } else { if (lastDelete.equals(source.getTopKey(), PartialKey.ROW_COLFAM_COLQUAL_COLVIS)) { long ts1 = ReadLockUtil.decodeTs(source.getTopKey().getTimestamp() & TIMESTAMP_MASK); long ts2 = ReadLockUtil.decodeTs(lastDelete.getTimestamp() & TIMESTAMP_MASK);
public LockInfo(Entry<Key, Value> kve) { long rawTs = kve.getKey().getTimestamp(); this.entry = kve; if ((rawTs & ColumnConstants.PREFIX_MASK) == ColumnConstants.RLOCK_PREFIX) { this.lockTs = ReadLockUtil.decodeTs(rawTs); ReadLockValue rlv = new ReadLockValue(kve.getValue().get()); this.prow = rlv.getPrimaryRow(); this.pcol = rlv.getPrimaryColumn(); this.transactorId = rlv.getTransactor(); this.isReadLock = true; } else { this.lockTs = kve.getKey().getTimestamp() & ColumnConstants.TIMESTAMP_MASK; LockValue lv = new LockValue(kve.getValue().get()); this.prow = lv.getPrimaryRow(); this.pcol = lv.getPrimaryColumn(); this.transactorId = lv.getTransactor(); this.isReadLock = false; } } }
@Override public Collection<Mutation> createMutations(CommitData cd) { // roll back locks // TODO let rollback be done lazily? this makes GC more difficult Flutation m; ArrayList<Mutation> mutations = new ArrayList<>(cd.acceptedRows.size()); for (Bytes row : cd.acceptedRows) { m = new Flutation(env, row); for (Entry<Column, Bytes> entry : updates.get(row).entrySet()) { if (isReadLock(entry.getValue())) { m.put(entry.getKey(), ColumnType.RLOCK.encode(ReadLockUtil.encodeTs(startTs, true)), DelReadLockValue.encodeRollback()); } else { m.put(entry.getKey(), ColumnType.DEL_LOCK.encode(startTs), DelLockValue.encodeRollback(false, true)); } } mutations.add(m); } return mutations; } }
public LockInfo(Entry<Key, Value> kve) { long rawTs = kve.getKey().getTimestamp(); this.entry = kve; if (ColumnType.from(rawTs) == ColumnType.RLOCK) { this.lockTs = ReadLockUtil.decodeTs(rawTs); ReadLockValue rlv = new ReadLockValue(kve.getValue().get()); this.prow = rlv.getPrimaryRow(); this.pcol = rlv.getPrimaryColumn(); this.transactorId = rlv.getTransactor(); this.isReadLock = true; } else { this.lockTs = kve.getKey().getTimestamp() & ColumnConstants.TIMESTAMP_MASK; LockValue lv = new LockValue(kve.getValue().get()); this.prow = lv.getPrimaryRow(); this.pcol = lv.getPrimaryColumn(); this.transactorId = lv.getTransactor(); this.isReadLock = false; } } }
public static void commitColumn(Environment env, boolean isTrigger, boolean isPrimary, Column col, boolean isWrite, boolean isDelete, boolean isReadlock, long startTs, long commitTs, Set<Column> observedColumns, Mutation m) { if (isReadlock) { Flutation.put(env, m, col, ColumnConstants.RLOCK_PREFIX | ReadLockUtil.encodeTs(startTs, true), DelReadLockValue.encodeCommit(commitTs)); } else if (isWrite) { Flutation.put(env, m, col, ColumnConstants.WRITE_PREFIX | commitTs, WriteValue.encode(startTs, isPrimary, isDelete)); } else { Flutation.put(env, m, col, ColumnConstants.DEL_LOCK_PREFIX | startTs, DelLockValue.encodeCommit(commitTs, isPrimary)); } if (isTrigger) { Flutation.put(env, m, col, ColumnConstants.ACK_PREFIX | startTs, TransactionImpl.EMPTY); } }
private static void rollback(Environment env, long startTs, PrimaryRowColumn prc, List<LockInfo> value, Map<ByteSequence, Mutation> mutations) { for (LockInfo lockInfo : value) { if (isPrimary(prc, lockInfo.entry.getKey())) { continue; } Mutation mut = getMutation(lockInfo.entry.getKey().getRowData(), mutations); Key k = lockInfo.entry.getKey(); if (lockInfo.isReadLock) { mut.put(k.getColumnFamilyData().toArray(), k.getColumnQualifierData().toArray(), k.getColumnVisibilityParsed(), ColumnConstants.RLOCK_PREFIX | ReadLockUtil.encodeTs(lockInfo.lockTs, true), DelReadLockValue.encodeRollback()); } else { mut.put(k.getColumnFamilyData().toArray(), k.getColumnQualifierData().toArray(), k.getColumnVisibilityParsed(), ColumnConstants.DEL_LOCK_PREFIX | lockInfo.lockTs, DelLockValue.encodeRollback(false, true)); } } }
private static void rollback(Environment env, long startTs, PrimaryRowColumn prc, List<LockInfo> value, Map<ByteSequence, Mutation> mutations) { for (LockInfo lockInfo : value) { if (isPrimary(prc, lockInfo.entry.getKey())) { continue; } Mutation mut = getMutation(lockInfo.entry.getKey().getRowData(), mutations); Key k = lockInfo.entry.getKey(); if (lockInfo.isReadLock) { mut.put(k.getColumnFamilyData().toArray(), k.getColumnQualifierData().toArray(), k.getColumnVisibilityParsed(), ColumnType.RLOCK.encode(ReadLockUtil.encodeTs(lockInfo.lockTs, true)), DelReadLockValue.encodeRollback()); } else { mut.put(k.getColumnFamilyData().toArray(), k.getColumnQualifierData().toArray(), k.getColumnVisibilityParsed(), ColumnType.DEL_LOCK.encode(lockInfo.lockTs), DelLockValue.encodeRollback(false, true)); } } }
public static void commitColumn(Environment env, boolean isTrigger, boolean isPrimary, Column col, boolean isWrite, boolean isDelete, boolean isReadlock, long startTs, long commitTs, Set<Column> observedColumns, Mutation m) { if (isReadlock) { Flutation.put(env, m, col, ColumnType.RLOCK.encode(ReadLockUtil.encodeTs(startTs, true)), DelReadLockValue.encodeCommit(commitTs)); } else if (isWrite) { Flutation.put(env, m, col, ColumnType.WRITE.encode(commitTs), WriteValue.encode(startTs, isPrimary, isDelete)); } else { Flutation.put(env, m, col, ColumnType.DEL_LOCK.encode(startTs), DelLockValue.encodeCommit(commitTs, isPrimary)); } if (isTrigger) { Flutation.put(env, m, col, ColumnType.ACK.encode(startTs), TransactionImpl.EMPTY); } }
private ConditionalFlutation prewrite(ConditionalFlutation cm, Bytes row, Column col, Bytes val, Bytes primaryRow, Column primaryColumn, boolean isTriggerRow) { IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); boolean isTrigger = isTriggerRow && col.equals(notification.getColumn()); if (isTrigger) { PrewriteIterator.enableAckCheck(iterConf, notification.getTimestamp()); } if (isReadLock(val)) { PrewriteIterator.setReadlock(iterConf); } Condition cond = new FluoCondition(env, col).setIterators(iterConf); if (cm == null) { cm = new ConditionalFlutation(env, row, cond); } else { cm.addCondition(cond); } if (isWrite(val) && !isDelete(val)) { cm.put(col, ColumnConstants.DATA_PREFIX | startTs, val.toArray()); } if (isReadLock(val)) { cm.put(col, ColumnConstants.RLOCK_PREFIX | ReadLockUtil.encodeTs(startTs, false), ReadLockValue.encode(primaryRow, primaryColumn, getTransactorID())); } else { cm.put(col, ColumnConstants.LOCK_PREFIX | startTs, LockValue.encode(primaryRow, primaryColumn, isWrite(val), isDelete(val), isTriggerRow, getTransactorID())); } return cm; }
private ConditionalFlutation prewrite(ConditionalFlutation cm, Bytes row, Column col, Bytes val, Bytes primaryRow, Column primaryColumn, boolean isTriggerRow) { IteratorSetting iterConf = new IteratorSetting(10, PrewriteIterator.class); PrewriteIterator.setSnaptime(iterConf, startTs); boolean isTrigger = isTriggerRow && col.equals(notification.getColumn()); if (isTrigger) { PrewriteIterator.enableAckCheck(iterConf, notification.getTimestamp()); } if (isReadLock(val)) { PrewriteIterator.setReadlock(iterConf); } Condition cond = new FluoCondition(env, col).setIterators(iterConf); if (cm == null) { cm = new ConditionalFlutation(env, row, cond); } else { cm.addCondition(cond); } if (isWrite(val) && !isDelete(val)) { cm.put(col, ColumnType.DATA.encode(startTs), val.toArray()); } if (isReadLock(val)) { cm.put(col, ColumnType.RLOCK.encode(ReadLockUtil.encodeTs(startTs, false)), ReadLockValue.encode(primaryRow, primaryColumn, getTransactorID())); } else { cm.put(col, ColumnType.LOCK.encode(startTs), LockValue.encode(primaryRow, primaryColumn, isWrite(val), isDelete(val), isTriggerRow, getTransactorID())); } return cm; }