internal override void Visit(ReadVersionRequest req) { byte[] valueBytes = req.Result as byte[]; req.Result = valueBytes == null || valueBytes.Length == 0 ? null : VersionEntry.Deserialize(req.VersionKey, valueBytes, req.LocalVerEntry); }
internal override void Visit(ReadVersionRequest req) { this.HashId = req.RecordKey as string; byte[] keyBytes = BitConverter.GetBytes(req.VersionKey); this.RedisReq = new RedisRequest(this.HashId, keyBytes, RedisRequestType.HGet) { ParentRequest = req }; }
internal override void Visit(ReadVersionRequest req) { string hashId = req.RecordKey.ToString(); if (this.redisVersionDbMode == RedisVersionDbMode.Cluster) { hashId = RedisVersionDb.PACK_KEY(RedisVersionDb.VER_KEY_PREFIX, hashId); } byte[] keyBytes = BitConverter.GetBytes(req.VersionKey); RedisRequest redisReq = this.NextRedisRequest(); redisReq.Set(hashId, keyBytes, RedisRequestType.HGet); redisReq.ParentRequest = req; }
internal override void Visit(ReadVersionRequest req) { VersionEntry verEntry = req.RemoteVerEntry; if (verEntry == null) { Dictionary <long, VersionEntry> versionList = null; if (!this.dict.TryGetValue(req.RecordKey, out versionList) || !versionList.TryGetValue(req.VersionKey, out verEntry)) { req.Result = null; req.Finished = true; } } VersionEntry.CopyValue(verEntry, req.LocalVerEntry); req.Result = req.LocalVerEntry; req.Finished = true; }
internal override void Visit(ReadVersionRequest req) { VersionEntry versionEntry = req.RemoteVerEntry; if (versionEntry == null) { ConcurrentDictionary <long, VersionEntry> versionList = null; if (!this.dict.TryGetValue(req.RecordKey, out versionList)) { req.Result = null; req.Finished = true; return; } if (!versionList.TryGetValue(req.VersionKey, out versionEntry)) { req.Result = null; req.Finished = true; return; } } Debug.Assert(Interlocked.Read(ref versionEntry.VersionKey) == req.VersionKey); // Debug Assertion // if (!versionEntry.RecordKey.Equals(req.RecordKey)) // { // throw new Exception("Inconsistent record key"); // } //int ticket = versionEntry.EnterQueuedLatch(); versionEntry.ReadLock(); VersionEntry.CopyFromRemote(versionEntry, req.LocalVerEntry); //versionEntry.ExitQueuedLatch(ticket); versionEntry.UnReadLock(); req.Result = req.LocalVerEntry; req.Finished = true; }
internal override void Visit(ReadVersionRequest req) { VersionEntry versionEntry = req.RemoteVerEntry; if (versionEntry == null) { throw new TransactionException("The version entry should be referenced for main-memory k-v."); } if (versionEntry.VersionKey != req.VersionKey) { throw new TransactionException("The referenced version entry has been recycled for new data."); } while (Interlocked.CompareExchange(ref versionEntry.latch, 1, 0) != 0) { ; } VersionEntry.CopyValue(versionEntry, req.LocalVerEntry); Interlocked.Exchange(ref versionEntry.latch, 0); req.Result = req.LocalVerEntry; req.Finished = true; }
internal virtual void Visit(ReadVersionRequest req) { }
internal override void Visit(ReadVersionRequest req) { req.Result = this.GetVersionEntryByKey(req.TableId, req.RecordKey, req.VersionKey); req.Finished = true; }