private async Task <Slice> GetPreviousNodeAsync(IFdbTransaction trans, int level, Slice key) { // GetPreviousNodeAsync looks for the previous node on a level, but "doesn't care" // about the contents of that node. It therefore uses a non-isolated (snaphot) // read and explicitly adds a conflict range that is exclusive of the actual, // found previous node. This allows an increment of that node not to trigger // a transaction conflict. We also add a conflict key on the found previous // key in level 0. This allows detection of erasures. var k = this.Subspace.Encode(level, key); //Console.WriteLine(k); //Console.WriteLine("GetPreviousNode(" + level + ", " + key + ")"); //Console.WriteLine(KeySelector.LastLessThan(k) + " <= x < " + KeySelector.FirstGreaterOrEqual(k)); var kv = await trans .Snapshot .GetRange( KeySelector.LastLessThan(k), KeySelector.FirstGreaterOrEqual(k) ) .FirstAsync() .ConfigureAwait(false); //Console.WriteLine("Found " + FdbKey.Dump(kv.Key)); var prevKey = this.Subspace.DecodeLast <Slice>(kv.Key); trans.AddReadConflictRange(kv.Key + FdbKey.MinValue, k); trans.AddReadConflictKey(this.Subspace.Encode(0, prevKey)); return(prevKey); }
private async Task<Slice> GetPreviousNodeAsync(IFdbTransaction trans, int level, Slice key) { // GetPreviousNodeAsync looks for the previous node on a level, but "doesn't care" // about the contents of that node. It therefore uses a non-isolated (snaphot) // read and explicitly adds a conflict range that is exclusive of the actual, // found previous node. This allows an increment of that node not to trigger // a transaction conflict. We also add a conflict key on the found previous // key in level 0. This allows detection of erasures. var k = this.Subspace.Pack(level, key); //Console.WriteLine(k); //Console.WriteLine("GetPreviousNode(" + level + ", " + key + ")"); //Console.WriteLine(FdbKeySelector.LastLessThan(k) + " <= x < " + FdbKeySelector.FirstGreaterOrEqual(k)); var kv = await trans .Snapshot .GetRange( FdbKeySelector.LastLessThan(k), FdbKeySelector.FirstGreaterOrEqual(k) ) .FirstAsync() .ConfigureAwait(false); //Console.WriteLine("Found " + FdbKey.Dump(kv.Key)); var prevKey = this.Subspace.UnpackLast<Slice>(kv.Key); trans.AddReadConflictRange(kv.Key + FdbKey.MinValue, k); trans.AddReadConflictKey(this.Subspace.Pack(0, prevKey)); return prevKey; }