public static void Annotate(this IFdbReadOnlyTransaction trans, string format, params object?[] args) { if (trans.IsLogged()) { trans.Annotate(string.Format(CultureInfo.InvariantCulture, format, args)); } }
private static async Task <List <Slice> > GetBoundaryKeysInternalAsync([NotNull] IFdbReadOnlyTransaction trans, Slice begin, Slice end) { Contract.Requires(trans != null && end >= begin); #if TRACE_COUNTING trans.Annotate("Get boundary keys in range {0}", KeyRange.Create(begin, end)); #endif trans.WithReadAccessToSystemKeys(); var results = new List <Slice>(); int iterations = 0; var options = new FdbRangeOptions { Mode = FdbStreamingMode.WantAll }; while (begin < end) { FdbException error = null; Slice lastBegin = begin; try { var chunk = await trans.Snapshot.GetRangeAsync(KeyServers + begin, KeyServers + end, options, iterations).ConfigureAwait(false); ++iterations; if (chunk.Count > 0) { foreach (var kvp in chunk) { results.Add(kvp.Key.Substring(KeyServers.Count)); } begin = chunk.Last.Substring(KeyServers.Count) + 0; } if (!chunk.HasMore) { begin = end; } } catch (FdbException e) { error = e; } if (error != null) { if (error.Code == FdbError.PastVersion && begin != lastBegin) { // if we get a PastVersion and *something* has happened, then we are no longer transactional trans.Reset(); } else { await trans.OnErrorAsync(error.Code).ConfigureAwait(false); } iterations = 0; trans.WithReadAccessToSystemKeys(); } } #if TRACE_COUNTING if (results.Count == 0) { trans.Annotate("There is no chunk boundary in range {0}", KeyRange.Create(begin, end)); } else { trans.Annotate("Found {0} boundaries in {1} iteration(s)", results.Count, iterations); } #endif return(results); }
/// <summary>Finds a node subspace, given its path, by walking the tree from the root.</summary> /// <returns>Node if it was found, or null</returns> private async Task<Node> FindAsync(IFdbReadOnlyTransaction tr, IFdbTuple path) { Contract.Requires(tr != null && path != null); // look for the node by traversing from the root down. Stop when crossing a partition... var n = this.RootNode; int i = 0; Slice layer = Slice.Nil; while (i < path.Count) { if (FdbDirectoryLayer.AnnotateTransactions) tr.Annotate("Looking for child {0} under node {1}...", path.Get<string>(i), n.Key); n = NodeWithPrefix(await tr.GetAsync(GetSubDirKey(n, path.Get<string>(i))).ConfigureAwait(false)); if (n == null) { return new Node(null, path.Substring(0, i + 1), path, Slice.Empty); } if (FdbDirectoryLayer.AnnotateTransactions) tr.Annotate("Reading Layer value for subfolder {0} found at {1}", path, n.Key); layer = await tr.GetAsync(n.Pack(LayerSuffix)).ConfigureAwait(false); if (layer == FdbDirectoryPartition.LayerId) { // stop when reaching a partition return new Node(n, path.Substring(0, i + 1), path, FdbDirectoryPartition.LayerId); } ++i; } return new Node(n, path, path, layer); }