Example #1
0
 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);
		}