Ejemplo n.º 1
0
        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;
        }
Ejemplo n.º 2
0
        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;
        }