Search in sources :

Example 6 with Token

use of com.cinchapi.concourse.server.concurrent.Token in project concourse by cinchapi.

the class Engine method set.

@Override
public void set(String key, TObject value, long record) {
    Token sharedToken = Token.shareable(record);
    Token writeToken = Token.wrap(key, record);
    RangeToken rangeToken = RangeToken.forWriting(Text.wrap(key), Value.wrap(value));
    Lock shared = lockService.getWriteLock(sharedToken);
    Lock write = lockService.getWriteLock(writeToken);
    Lock range = rangeLockService.getWriteLock(rangeToken);
    shared.lock();
    write.lock();
    range.lock();
    try {
        super.set(key, value, record);
        notifyVersionChange(writeToken);
        notifyVersionChange(sharedToken);
        notifyVersionChange(rangeToken);
    } finally {
        shared.unlock();
        write.unlock();
        range.unlock();
    }
}
Also used : RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) Token(com.cinchapi.concourse.server.concurrent.Token) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) PriorityReadWriteLock(com.cinchapi.concourse.server.concurrent.PriorityReadWriteLock) Lock(java.util.concurrent.locks.Lock)

Example 7 with Token

use of com.cinchapi.concourse.server.concurrent.Token in project concourse by cinchapi.

the class Engine method add.

@Override
public boolean add(String key, TObject value, long record) {
    Token sharedToken = Token.shareable(record);
    Token writeToken = Token.wrap(key, record);
    RangeToken rangeToken = RangeToken.forWriting(Text.wrap(key), Value.wrap(value));
    Lock shared = lockService.getWriteLock(sharedToken);
    Lock write = lockService.getWriteLock(writeToken);
    Lock range = rangeLockService.getWriteLock(rangeToken);
    shared.lock();
    write.lock();
    range.lock();
    try {
        return addUnlocked(Write.add(key, value, record), Sync.YES, sharedToken, writeToken, rangeToken);
    } finally {
        shared.unlock();
        write.unlock();
        range.unlock();
    }
}
Also used : RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) Token(com.cinchapi.concourse.server.concurrent.Token) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) PriorityReadWriteLock(com.cinchapi.concourse.server.concurrent.PriorityReadWriteLock) Lock(java.util.concurrent.locks.Lock)

Example 8 with Token

use of com.cinchapi.concourse.server.concurrent.Token in project concourse by cinchapi.

the class Engine method accept.

/**
 * <p>
 * The Engine is the destination for Transaction commits, which means that
 * this method will accept Writes from Transactions and create new Writes
 * within the Engine BufferedStore (e.g. a new Write will be created in the
 * Buffer and eventually transported to the Database). Creating a new Write
 * does associate a new timestamp with the transactional data, but this is
 * the desired behaviour because data from a Transaction should always have
 * a post commit timestamp.
 * </p>
 * <p>
 * It is also worth calling out the fact that this method does not have any
 * locks to prevent multiple transactions from concurrently invoking meaning
 * that two transactions that don't have any overlapping reads/writes
 * (meaning they don't touch any of the same data) can commit at the same
 * time and its possible that their writes will be interleaved since calls
 * to this method don't globally lock. This is <em>okay</em> and does not
 * violate ACID because the <strong>observed</strong> state of the system
 * will be the same as if the transactions transported all their Writes
 * serially.
 * </p>
 */
@Override
@DoNotInvoke
public void accept(Write write, boolean sync) {
    checkArgument(write.getType() != Action.COMPARE);
    String key = write.getKey().toString();
    TObject value = write.getValue().getTObject();
    long record = write.getRecord().longValue();
    Token sharedToken = Token.shareable(record);
    Token writeToken = Token.wrap(key, record);
    RangeToken rangeToken = RangeToken.forWriting(Text.wrap(key), Value.wrap(value));
    boolean accepted;
    if (write.getType() == Action.ADD) {
        accepted = addUnlocked(write, sync ? Sync.YES : Sync.NO, sharedToken, writeToken, rangeToken);
    } else {
        accepted = removeUnlocked(write, sync ? Sync.YES : Sync.NO, sharedToken, writeToken, rangeToken);
    }
    if (!accepted) {
        Logger.warn("Write {} was rejected by the Engine " + "because it was previously accepted " + "but not offset. This implies that a " + "premature shutdown occurred and the parent" + "Transaction is attempting to restore " + "itself from backup and finish committing.", write);
    } else {
        Logger.debug("'{}' was accepted by the Engine", write);
    }
}
Also used : TObject(com.cinchapi.concourse.thrift.TObject) RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) Token(com.cinchapi.concourse.server.concurrent.Token) DoNotInvoke(com.cinchapi.concourse.annotate.DoNotInvoke)

Example 9 with Token

use of com.cinchapi.concourse.server.concurrent.Token in project concourse by cinchapi.

the class Engine method remove.

@Override
public boolean remove(String key, TObject value, long record) {
    Token sharedToken = Token.shareable(record);
    Token writeToken = Token.wrap(key, record);
    RangeToken rangeToken = RangeToken.forWriting(Text.wrap(key), Value.wrap(value));
    Lock shared = lockService.getWriteLock(sharedToken);
    Lock write = lockService.getWriteLock(writeToken);
    Lock range = rangeLockService.getWriteLock(rangeToken);
    shared.lock();
    write.lock();
    range.lock();
    try {
        return removeUnlocked(Write.remove(key, value, record), Sync.YES, sharedToken, writeToken, rangeToken);
    } finally {
        shared.unlock();
        write.unlock();
        range.unlock();
    }
}
Also used : RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) Token(com.cinchapi.concourse.server.concurrent.Token) ReentrantReadWriteLock(java.util.concurrent.locks.ReentrantReadWriteLock) PriorityReadWriteLock(com.cinchapi.concourse.server.concurrent.PriorityReadWriteLock) Lock(java.util.concurrent.locks.Lock)

Example 10 with Token

use of com.cinchapi.concourse.server.concurrent.Token in project concourse by cinchapi.

the class AtomicOperation method chronologize.

@Override
public final Map<Long, Set<TObject>> chronologize(String key, long record, long start, long end) throws AtomicStateException {
    checkState();
    long now = Time.now();
    if (start > now || end > now) {
        // Must perform a locking read to prevent a non-repeatable read if
        // writes occur between the present and the future timestamp(s)
        Token token = Token.wrap(key, record);
        source.addVersionChangeListener(token, this);
        reads2Lock.add(token);
        return super.chronologize(key, record, start, end);
    } else {
        return super.chronologize(key, record, start, end);
    }
}
Also used : RangeToken(com.cinchapi.concourse.server.concurrent.RangeToken) Token(com.cinchapi.concourse.server.concurrent.Token)

Aggregations

Token (com.cinchapi.concourse.server.concurrent.Token)18 RangeToken (com.cinchapi.concourse.server.concurrent.RangeToken)17 PriorityReadWriteLock (com.cinchapi.concourse.server.concurrent.PriorityReadWriteLock)3 Lock (java.util.concurrent.locks.Lock)3 ReentrantReadWriteLock (java.util.concurrent.locks.ReentrantReadWriteLock)3 DoNotInvoke (com.cinchapi.concourse.annotate.DoNotInvoke)1 LockType (com.cinchapi.concourse.server.concurrent.LockType)1 Text (com.cinchapi.concourse.server.model.Text)1 Value (com.cinchapi.concourse.server.model.Value)1 TObject (com.cinchapi.concourse.thrift.TObject)1 Range (com.google.common.collect.Range)1 RangeSet (com.google.common.collect.RangeSet)1 TreeRangeSet (com.google.common.collect.TreeRangeSet)1