internal bool GetLogicalAddress(Key *key, out long logicalAddress) { var bucket = default(HashBucket *); var slot = default(int); logicalAddress = Constants.kInvalidAddress; var physicalAddress = default(long); var info = default(RecordInfo *); var hash = Key.GetHashCode(key); var tag = (ushort)((ulong)hash >> Constants.kHashTagShift); var entry = default(HashBucketEntry); var tagExists = FindTag(hash, tag, ref bucket, ref slot, ref entry); if (tagExists) { logicalAddress = entry.word & Constants.kAddressMask; Debug.Assert(logicalAddress != 0); if (logicalAddress >= hlog.HeadAddress) { physicalAddress = hlog.GetPhysicalAddress(logicalAddress); if (!Key.Equals(key, Layout.GetKey(physicalAddress))) { logicalAddress = Layout.GetInfo(physicalAddress)->PreviousAddress; TraceBackForKeyMatch(key, logicalAddress, hlog.HeadAddress, out logicalAddress, out physicalAddress); } } } if (logicalAddress < hlog.HeadAddress && logicalAddress != Constants.kInvalidAddress) { return(false); } return(true); }