Exemplo n.º 1
0
        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);
        }