/// <inheritdoc /> public IEnumerable <Task <Possible <PublishedEntryRef, Failure> > > ListPublishedEntriesByWeakFingerprint(WeakContentFingerprint weak) { WeakFingerprintHash cacheCoreWeakFingerprint = new WeakFingerprintHash(new Hash(weak.Hash)); // TODO: We assume that everything up until the first sentinel is local. This is fine for a simple 'vertical' aggregator // of a local and remote cache, but isn't general. PublishedEntryRefLocality currentLocality = PublishedEntryRefLocality.Local; foreach (Task <Possible <StrongFingerprint, Failure> > entryPromise in m_cache.EnumerateStrongFingerprints(cacheCoreWeakFingerprint)) { if (entryPromise.IsCompleted && entryPromise.Result.Succeeded && entryPromise.Result.Result is StrongFingerprintSentinel) { currentLocality = PublishedEntryRefLocality.Remote; continue; } yield return(AdaptPublishedEntry(entryPromise, currentLocality)); } }
private static async Task <Possible <PublishedEntryRef, Failure> > AdaptPublishedEntry(Task <Possible <StrongFingerprint, Failure> > cacheCoreEntryPromise, PublishedEntryRefLocality locality) { Possible <StrongFingerprint, Failure> maybeFingerprint = await cacheCoreEntryPromise; if (maybeFingerprint.Succeeded) { StrongFingerprint fingerprint = maybeFingerprint.Result; if (fingerprint is StrongFingerprintSentinel) { return(PublishedEntryRef.Ignore); } return(new PublishedEntryRef( pathSetHash: ContentHashingUtilities.CreateFrom(fingerprint.CasElement.ToArray()), strongFingerprint: new StrongContentFingerprint(FingerprintUtilities.CreateFrom(fingerprint.HashElement.ToArray())), oringinatingCache: fingerprint.CacheId, locality: locality)); } return(maybeFingerprint.Failure); }