use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.
the class RedissonCasWorkerMap method removeAll.
/**
* @brief Remove worker value from all blob keys.
* @details If the blob is already missing, or the worker doesn't exist, this will be no effect on
* the key.
* @param client Client used for interacting with redis when not using cacheMap.
* @param blobDigests The blob digests to remove the worker from.
* @param workerName The worker name to remove.
*/
@Override
public void removeAll(RedisClient client, Iterable<Digest> blobDigests, String workerName) {
for (Digest blobDigest : blobDigests) {
String key = cacheMapCasKey(blobDigest);
cacheMap.remove(key, workerName);
}
}
use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.
the class RedissonCasWorkerMap method getMap.
/**
* @brief Get all of the key values as a map from the digests given.
* @details If there are no workers for the digest, the key is left out of the returned map.
* @param client Client used for interacting with redis when not using cacheMap.
* @param blobDigests The blob digests to get the key/values for.
* @return The key/value map for digests to workers.
* @note Suggested return identifier: casWorkerMap.
*/
@Override
public Map<Digest, Set<String>> getMap(RedisClient client, Iterable<Digest> blobDigests) {
ImmutableMap.Builder<Digest, Set<String>> blobDigestsWorkers = new ImmutableMap.Builder<>();
for (Digest blobDigest : blobDigests) {
String key = cacheMapCasKey(blobDigest);
Set<String> workers = cacheMap.get(key).readAll();
if (workers.isEmpty()) {
continue;
}
blobDigestsWorkers.put(blobDigest, workers);
}
return blobDigestsWorkers.build();
}
use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.
the class RedissonCasWorkerMap method addAll.
/**
* @brief Update multiple blob entries for a worker.
* @details This may add a new key if the blob did not previously exist, or it will adjust the
* worker values based on the worker name. The expiration time is always refreshed.
* @param client Client used for interacting with redis when not using cacheMap.
* @param blobDigests The blob digests to adjust worker information from.
* @param workerName The worker to add for looking up the blobs.
*/
@Override
public void addAll(RedisClient client, Iterable<Digest> blobDigests, String workerName) {
for (Digest blobDigest : blobDigests) {
String key = cacheMapCasKey(blobDigest);
cacheMap.put(key, workerName);
cacheMap.expireKey(key, keyExpiration_s, TimeUnit.SECONDS);
}
}
use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.
the class RemoteInputStreamFactory method newInput.
@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
public InputStream newInput(Digest blobDigest, long offset, long deadlineAfter, TimeUnit deadlineAfterUnits, RequestMetadata requestMetadata) throws IOException, InterruptedException {
Set<String> remoteWorkers;
Set<String> locationSet;
try {
Set<String> workers = backplane.getWorkers();
if (publicName == null) {
remoteWorkers = workers;
} else {
synchronized (workers) {
remoteWorkers = Sets.difference(workers, ImmutableSet.of(publicName)).immutableCopy();
}
}
locationSet = Sets.newHashSet(Sets.intersection(backplane.getBlobLocationSet(blobDigest), workers));
} catch (IOException e) {
throw Status.fromThrowable(e).asRuntimeException();
}
if (publicName != null && locationSet.remove(publicName)) {
backplane.removeBlobLocation(blobDigest, publicName);
}
List<String> workersList = new ArrayList<>(locationSet);
boolean emptyWorkerList = workersList.isEmpty();
final ListenableFuture<List<String>> populatedWorkerListFuture;
if (emptyWorkerList) {
populatedWorkerListFuture = transform(correctMissingBlob(backplane, remoteWorkers, locationSet, this::workerStub, blobDigest, newDirectExecutorService(), requestMetadata), (foundOnWorkers) -> {
Iterables.addAll(workersList, foundOnWorkers);
return workersList;
}, directExecutor());
} else {
populatedWorkerListFuture = immediateFuture(workersList);
}
SettableFuture<InputStream> inputStreamFuture = SettableFuture.create();
addCallback(populatedWorkerListFuture, new WorkersCallback(rand) {
boolean triedCheck = emptyWorkerList;
@Override
public void onQueue(Deque<String> workers) {
Set<String> locationSet = Sets.newHashSet(workers);
boolean complete = false;
while (!complete && !workers.isEmpty()) {
try {
inputStreamFuture.set(fetchBlobFromRemoteWorker(blobDigest, workers, offset, deadlineAfter, deadlineAfterUnits, requestMetadata));
complete = true;
} catch (IOException e) {
if (workers.isEmpty()) {
if (triedCheck) {
onFailure(e);
return;
}
triedCheck = true;
workersList.clear();
ListenableFuture<List<String>> checkedWorkerListFuture = transform(correctMissingBlob(backplane, remoteWorkers, locationSet, RemoteInputStreamFactory.this::workerStub, blobDigest, newDirectExecutorService(), requestMetadata), (foundOnWorkers) -> {
Iterables.addAll(workersList, foundOnWorkers);
return workersList;
}, directExecutor());
addCallback(checkedWorkerListFuture, this, directExecutor());
complete = true;
}
} catch (InterruptedException e) {
complete = true;
onFailure(e);
}
}
}
@SuppressWarnings("NullableProblems")
@Override
public void onFailure(Throwable t) {
Status status = Status.fromThrowable(t);
if (status.getCode() == Code.NOT_FOUND) {
inputStreamFuture.setException(new NoSuchFileException(DigestUtil.toString(blobDigest)));
} else {
inputStreamFuture.setException(t);
}
}
}, directExecutor());
try {
return inputStreamFuture.get();
} catch (ExecutionException e) {
Throwable cause = e.getCause();
Throwables.throwIfUnchecked(cause);
Throwables.throwIfInstanceOf(cause, IOException.class);
Throwables.throwIfInstanceOf(cause, InterruptedException.class);
throw new UncheckedExecutionException(cause);
}
}
use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.
the class DelegateCASMap method remove.
public V remove(K key) {
Digest valueDigest = digestMap.remove(key);
if (valueDigest == null) {
if (emptyCache.getIfPresent(key) == null) {
return null;
}
emptyCache.invalidate(key);
valueDigest = digestUtil.empty();
}
return expectValueType(valueDigest);
}
Aggregations