internal override void Visit(UpdateVersionMaxCommitTsRequest req) { VersionEntry verEntry = req.RemoteVerEntry; if (verEntry == null) { ConcurrentDictionary <long, VersionEntry> versionList = null; if (!this.dict.TryGetValue(req.RecordKey, out versionList)) { throw new TransactionException("The specified record does not exist."); } if (!versionList.TryGetValue(req.VersionKey, out verEntry)) { throw new TransactionException("The specified version does not exist."); } } Debug.Assert(verEntry.VersionKey == req.VersionKey); //int ticket = verEntry.EnterQueuedLatch(); verEntry.WriteLock(); Interlocked.Exchange( ref verEntry.MaxCommitTs, Math.Max(req.MaxCommitTs, Interlocked.Read(ref verEntry.MaxCommitTs))); VersionEntry.CopyFromRemote(verEntry, req.LocalVerEntry); //verEntry.ExitQueuedLatch(ticket); verEntry.UnWriteLock(); req.Result = req.LocalVerEntry; req.Finished = true; }
internal override void Visit(ReplaceVersionRequest req) { VersionEntry entry = req.RemoteVerEntry; if (entry == null) { ConcurrentDictionary <long, VersionEntry> versionList = null; if (!this.dict.TryGetValue(req.RecordKey, out versionList)) { throw new TransactionException("The specified record does not exist."); } if (!versionList.TryGetValue(req.VersionKey, out entry)) { throw new TransactionException("The specified version does not exist."); } } Debug.Assert(entry.VersionKey == req.VersionKey); // Debug Assertion // if (!entry.RecordKey.Equals(req.RecordKey)) // { // throw new Exception("Inconsistent record key"); // } //int ticket = entry.EnterQueuedLatch(); entry.WriteLock(); if (Interlocked.Read(ref entry.TxId) == req.SenderId && Interlocked.Read(ref entry.EndTimestamp) == req.ExpectedEndTs) { Interlocked.Exchange(ref entry.BeginTimestamp, req.BeginTs); Interlocked.Exchange(ref entry.EndTimestamp, req.EndTs); Interlocked.Exchange(ref entry.TxId, req.TxId); VersionEntry.CopyFromRemote(entry, req.LocalVerEntry); // req.LocalVerEntry.RecordKey = req.RecordKey; } //entry.ExitQueuedLatch(ticket); entry.UnWriteLock(); req.Result = req.LocalVerEntry; req.Finished = true; }