use of com.cinchapi.concourse.server.storage.AtomicOperation in project concourse by cinchapi.
the class ConcourseServer method consolidateRecords.
@Override
@TranslateClientExceptions
@VerifyAccessToken
@VerifyWritePermission
public boolean consolidateRecords(List<Long> records, AccessToken creds, TransactionToken transaction, String environment) throws TException {
Set<Long> $records = Sets.newLinkedHashSet(records);
if ($records.size() >= 2) {
AtomicSupport store = getStore(transaction, environment);
AtomicOperation atomic = store.startAtomicOperation();
try {
Iterator<Long> it = $records.iterator();
long destination = it.next();
while (it.hasNext()) {
// 1. Copy all data from the #source to the #destination
long source = it.next();
Map<String, Set<TObject>> data = store.select(source);
for (Entry<String, Set<TObject>> entry : data.entrySet()) {
String key = entry.getKey();
for (TObject value : entry.getValue()) {
if (!atomic.verify(key, value, destination) && !atomic.add(key, value, destination)) {
return false;
}
}
}
// 2. Replace all incoming links to #source with links to
// #destination
Map<String, Set<Long>> incoming = Operations.traceRecordAtomic(source, Time.NONE, atomic);
for (Entry<String, Set<Long>> entry : incoming.entrySet()) {
String key = entry.getKey();
for (long record : entry.getValue()) {
if (!atomic.remove(key, Convert.javaToThrift(Link.to(source)), record)) {
return false;
}
if (!atomic.add(key, Convert.javaToThrift(Link.to(destination)), record)) {
return false;
}
}
}
// 3. Clear the #source
Operations.clearRecordAtomic(source, atomic);
}
return atomic.commit(CommitVersions.next());
} catch (TransactionStateException e) {
throw new TransactionException();
} catch (AtomicStateException e) {
return false;
}
} else {
// don't return a truthy value.
return false;
}
}
use of com.cinchapi.concourse.server.storage.AtomicOperation in project concourse by cinchapi.
the class OperationsTest method testTraceRecordsAtomic.
@Test
public void testTraceRecordsAtomic() {
AtomicSupport store = getStore();
try {
setupGraph(store);
AtomicOperation atomic = store.startAtomicOperation();
Map<Long, Map<String, Set<Long>>> incoming = Operations.traceRecordsAtomic(ImmutableList.of(1L, 2L, 3L), Time.NONE, atomic);
Assert.assertEquals(ImmutableMap.of(2L, ImmutableMap.of("foo", ImmutableSet.of(1L, 4L), "bar", ImmutableSet.of(3L), "baz", ImmutableSet.of(3L)), 1L, ImmutableMap.of("bar", ImmutableSet.of(2L), "baz", ImmutableSet.of(3L), "foo", ImmutableSet.of(4L)), 3L, ImmutableMap.of("baz", ImmutableSet.of(1L, 4L), "foo", ImmutableSet.of(2L), "bar", ImmutableSet.of(4L))), incoming);
} finally {
store.stop();
}
}
Aggregations