private void RecoverFromPage(long startRecoveryAddress, long fromLogicalAddressInPage, long untilLogicalAddressInPage, long pageLogicalAddress, long pagePhysicalAddress, int version) { var hash = default(long); var tag = default(ushort); var pointer = default(long); var recordStart = default(long); var bucket = default(HashBucket *); var entry = default(HashBucketEntry); var slot = default(int); pointer = fromLogicalAddressInPage; while (pointer < untilLogicalAddressInPage) { recordStart = pagePhysicalAddress + pointer; ref RecordInfo info = ref hlog.GetInfo(recordStart); if (info.IsNull()) { pointer += RecordInfo.GetLength(); continue; } if (!info.Invalid) { hash = comparer.GetHashCode64(ref hlog.GetKey(recordStart)); tag = (ushort)((ulong)hash >> Constants.kHashTagShift); entry = default(HashBucketEntry); FindOrCreateTag(hash, tag, ref bucket, ref slot, ref entry, hlog.BeginAddress); if (info.Version <= version) { entry.Address = pageLogicalAddress + pointer; entry.Tag = tag; entry.Pending = false; entry.Tentative = false; bucket->bucket_entries[slot] = entry.word; } else { info.Invalid = true; if (info.PreviousAddress < startRecoveryAddress) { entry.Address = info.PreviousAddress; entry.Tag = tag; entry.Pending = false; entry.Tentative = false; bucket->bucket_entries[slot] = entry.word; } } } pointer += hlog.GetRecordSize(recordStart); }