internal override void Visit(InitiGetVersionListRequest req) { // The version list is empty if (!this.dict.ContainsKey(req.RecordKey)) { Dictionary <long, VersionEntry> newVersionList = new Dictionary <long, VersionEntry>(SingletonPartitionedVersionTable.VERSION_CAPACITY); // Adds a special entry whose key is TAIL_KEY when the list is initialized. // The entry uses beginTimestamp as a pointer pointing to the newest verion in the list. newVersionList.Add( SingletonDictionaryVersionTable.TAIL_KEY, VersionEntry.InitEmptyVersionEntry()); this.dict.Add(req.RecordKey, newVersionList); // The version list is newly created by this tx. // No meaningful versions exist, except for the artificial entry as a tail pointer. req.RemoteVerList = newVersionList; req.Result = true; req.Finished = true; return; } else { req.RemoteVerList = null; req.Result = false; req.Finished = true; } }
internal override void Visit(InitiGetVersionListRequest req) { ConcurrentDictionary <long, VersionEntry> versionList = null; if (!this.dict.TryGetValue(req.RecordKey, out versionList)) { ConcurrentDictionary <long, VersionEntry> newVersionList = new ConcurrentDictionary <long, VersionEntry>(32); // Adds a special entry whose key is -1 when the list is initialized. // The entry uses beginTimestamp as a pointer pointing to the newest verion in the list. VersionEntry entry = VersionEntry.InitEmptyVersionEntry(); ResetTailEntry(entry); newVersionList.TryAdd(SingletonDictionaryVersionTable.TAIL_KEY, entry); // if concurrentDict.TryAdd() this.dict.Add(req.RecordKey, newVersionList); // The version list is newly created by this tx. // No meaningful versions exist, except for the artificial entry as a tail pointer. req.RemoteVerList = newVersionList; req.Result = true; req.Finished = true; return; } req.RemoteVerList = null; req.Result = false; req.Finished = true; }
internal override void MockLoadData(int recordCount) { int pk = 0; while (pk < this.VersionDb.PartitionCount) { Console.WriteLine("Loading Partition {0}", pk); int partitions = this.VersionDb.PartitionCount; for (int i = pk; i < recordCount; i += partitions) { object recordKey = i; if (!this.dicts[pk].ContainsKey(recordKey)) { this.dicts[pk].Add(recordKey, new Dictionary <long, VersionEntry>()); } Dictionary <long, VersionEntry> versionList = this.dicts[pk][recordKey]; // `+ 1` is for conforming to the logic of `Insert` and // `ReadAndInitialize` in 'TransactionExecution.cs'. // It's the version key of the first Inserted version. long firstMeaningfulVersion = VersionEntry.VERSION_KEY_START_INDEX + 1; VersionEntry emptyEntry = new VersionEntry(); VersionEntry.InitEmptyVersionEntry(emptyEntry); emptyEntry.BeginTimestamp = firstMeaningfulVersion; emptyEntry.EndTimestamp = firstMeaningfulVersion; versionList.Add(SingletonDictionaryVersionTable.TAIL_KEY, emptyEntry); VersionEntry versionEntry = new VersionEntry(); VersionEntry.InitFirstVersionEntry(versionEntry.Record == null ? new String('a', 100) : versionEntry.Record, versionEntry); versionList.Add(firstMeaningfulVersion, versionEntry); } pk++; } }
internal override void MockLoadData(int recordCount) { int pk = 0; while (pk < this.VersionDb.PartitionCount) { Console.WriteLine("Loading Partition {0}", pk); for (int i = pk; i < recordCount; i += this.VersionDb.PartitionCount) { object recordKey = i; ConcurrentDictionary <long, VersionEntry> versionList = null; if (!this.dict.TryGetValue(recordKey, out versionList)) { versionList = new ConcurrentDictionary <long, VersionEntry>(); this.dict.Add(recordKey, versionList); } // `+ 1` is for conforming to the logic of `Insert` and // `ReadAndInitialize` in `TransactionExecution`. // It's the version key of the first Inserted version. long firstMeaningfulVersion = VersionEntry.VERSION_KEY_START_INDEX + 1; VersionEntry emptyEntry = new VersionEntry(); VersionEntry.InitEmptyVersionEntry(emptyEntry); emptyEntry.BeginTimestamp = firstMeaningfulVersion; emptyEntry.EndTimestamp = firstMeaningfulVersion; versionList.TryAdd(TAIL_KEY, emptyEntry); VersionEntry versionEntry = new VersionEntry(); VersionEntry.InitFirstVersionEntry(versionEntry.Record == null ? new String('a', 100) : versionEntry.Record, versionEntry); versionList.TryAdd(firstMeaningfulVersion, versionEntry); } pk++; } }
internal override void Visit(InitiGetVersionListRequest req) { VersionEntry emptyEntry = VersionEntry.InitEmptyVersionEntry(); this.CQLExecute(string.Format(PartitionedCassandraVersionTable.CQL_UPLOAD_VERSION_ENTRY, req.TableId, req.RecordKey.ToString(), emptyEntry.VersionKey, emptyEntry.BeginTimestamp, emptyEntry.EndTimestamp, BytesSerializer.ToHexString(BytesSerializer.Serialize(emptyEntry.Record)), emptyEntry.TxId, emptyEntry.MaxCommitTs)); req.Result = true; req.Finished = true; }