public Cache() { cache.Pile = new DefaultPile(cache); ConfigAttribute.Apply(this, App.ConfigRoot); cache.Configure(App.ConfigRoot); cache.Start(); }
public void PutDurableParallel(int cnt) { using (var m_Sut = new LocalCache(NOPApplication.Instance)) { m_Sut.Pile = new DefaultPile(m_Sut); m_Sut.Start(); m_Sut.DefaultTableOptions = new TableOptions("*") { CollisionMode = CollisionMode.Durable, MaximumCapacity = cnt / 2 }; var tbl = m_Sut.GetOrCreateTable <int>("a"); Parallel.For(0, cnt, i => { var result = tbl.Put(i, "value#" + i, 10000); Aver.IsTrue(PutResult.Inserted == result); }); Aver.AreEqual(cnt, tbl.Count); Parallel.For(0, cnt, i => { var got = tbl.Get(i) as string; Aver.AreEqual("value#" + i, got); }); tbl.Purge(); Aver.AreEqual(0, tbl.Count); } }
public PileCacheUserStore(IPileImplementation pile) { m_Pile = pile; m_Cache = new LocalCache(m_Pile, null, null); m_Cache.Configure(null); m_Cache.Start(); }
private static LocalCache makeCache() { var cache = new LocalCache(); cache.Pile = new DefaultPile(cache); cache.Configure(null); cache.Start(); return(cache); }
public static LocalCache MakeCache(IConfigSectionNode conf = null) { var cache = new LocalCache(NOPApplication.Instance); cache.Pile = new DefaultPile(cache); cache.Configure(conf); cache.Start(); return(cache); }
private LocalCache makeCache(IConfigSectionNode conf = null) { var cache = new LocalCache(); cache.Pile = new DefaultPile(cache); cache.Configure(conf); cache.Start(); return(cache); }
public PileUserGraph(IPileImplementation pile) { m_Pile = pile; m_Cache = new LocalCache(); m_Cache.Pile = pile; m_Cache.DefaultTableOptions = new TableOptions("*"); m_Cache.DefaultTableOptions.CollisionMode = CollisionMode.Durable; //keep all entries (slower, uses chaining) m_Cache.DefaultTableOptions.DefaultMaxAgeSec = 0; //never expire items m_Cache.Start(); }
protected override void DoStart() { if (m_TargetName.IsNullOrWhiteSpace()) { throw new MDBException(StringConsts.MDB_STORE_CONFIG_NO_TARGET_NAME_ERROR); } if (m_Areas.Count == 0) { throw new MDBException(StringConsts.MDB_STORE_CONFIG_NO_AREAS_ERROR); } try { GDIDAuthorityService.CheckNameValidity(m_SchemaName); GDIDAuthorityService.CheckNameValidity(m_BankName); var gdidScope = GetGDIDScopePrefix(m_SchemaName, m_BankName); m_GDIDGenerator = new GDIDGenerator("GDIDGen({0})".Args(gdidScope), this, gdidScope, null); if (AgniSystem.IsMetabase) { foreach (var ah in AgniSystem.Metabase.GDIDAuthorities) { m_GDIDGenerator.AuthorityHosts.Register(ah); App.Log.Write(new NFX.Log.Message { Type = NFX.Log.MessageType.InfoD, Topic = SysConsts.LOG_TOPIC_MDB, From = GetType().FullName + ".makeGDIDGen()", Text = "Registered GDID authority host: " + ah.ToString() }); } } } catch (Exception error) { throw new MDBException(StringConsts.MDB_STORE_CONFIG_GDID_ERROR + error.ToMessageWithType()); } try { m_Cache = new LocalCache("MDBDataStore::" + Name, this); m_Cache.Pile = new DefaultPile(m_Cache, "MDBDataStore::Pile::" + Name); m_Cache.Configure(null); m_Cache.Start(); } catch { try { DisposableObject.DisposeAndNull(ref m_GDIDGenerator); } catch {} try { DisposableObject.DisposeAndNull(ref m_Cache); } catch {} throw; } }
public void PutGetSamePointer() { using (var m_Sut = new LocalCache(NOPApplication.Instance)) { m_Sut.Pile = new DefaultPile(m_Sut); m_Sut.Start(); m_Sut.DefaultTableOptions = new TableOptions("*") { CollisionMode = CollisionMode.Durable }; var tbl = m_Sut.GetOrCreateTable <int>("a"); Aver.IsTrue(PutResult.Inserted == tbl.Put(1, "my string 1234567", out var ptr)); Aver.IsTrue(PutResult.Inserted == tbl.PutPointer(123_000_000, ptr)); Aver.IsTrue(tbl.ContainsKey(1)); var got = tbl.Get(1); Aver.AreObjectsEqual("my string 1234567", got); Aver.IsFalse(tbl.ContainsKey(2)); got = tbl.Get(2); Aver.AreObjectsEqual(null, got); Aver.IsTrue(tbl.ContainsKey(123_000_000)); got = tbl.Get(123_000_000); Aver.AreObjectsEqual("my string 1234567", got); Aver.AreEqual(2, tbl.Count); Aver.AreEqual(1, m_Sut.Pile.ObjectCount); Aver.IsTrue(tbl.Remove(123_000_000));// <---------- explicitly DELETE one key Aver.AreEqual(1, tbl.Count); Aver.AreEqual(0, m_Sut.Pile.ObjectCount); Aver.IsTrue(tbl.ContainsKey(1)); //it still contains key "1" got = tbl.Get(1); // but it points to non - existing value Aver.IsNull(got); //and returns NULL Aver.IsFalse(tbl.ContainsKey(2)); got = tbl.Get(2); Aver.IsNull(got); Aver.IsFalse(tbl.ContainsKey(123_000_000)); //this key was explicitly deleted above got = tbl.Get(123_000_000); Aver.IsNull(got); } }
public void T050_PileNonOwnershipErrorStart() { var pile = new DefaultPile(); try { var cache = new LocalCache(); cache.Pile = pile; cache.Configure(null); cache.Start(); //can not start cache that uses inactive pile which is not managed by this cache } finally { pile.Dispose(); } }
public void T040_PileOwnership() { var cache = new LocalCache(NOPApplication.Instance); cache.Pile = new DefaultPile(cache); cache.Configure(null); cache.Start(); var tA = cache.GetOrCreateTable <string>("A"); tA.Put("aaa", "avalue"); Aver.AreObjectsEqual("avalue", tA.Get("aaa")); cache.WaitForCompleteStop(); Aver.IsTrue(DaemonStatus.Inactive == cache.Status); Aver.IsTrue(DaemonStatus.Inactive == cache.Pile.Status); }
public void T040_PileOwnership() { var cache = new LocalCache(); cache.Pile = new DefaultPile(cache); cache.Configure(null); cache.Start(); var tA = cache.GetOrCreateTable <string>("A"); tA.Put("aaa", "avalue"); Assert.AreEqual("avalue", tA.Get("aaa")); cache.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, cache.Status); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, cache.Pile.Status); }
private void CacheForm_Load(object sender, EventArgs e) { try { m_Cache = new LocalCache(Azos.Apps.NOPApplication.Instance); m_Cache.Pile = new DefaultPile(m_Cache); m_Cache.Configure(null); //DURABLE m_Cache.TableOptions.Register(new TableOptions("table1") { CollisionMode = CollisionMode.Durable }); // m_Cache.DefaultTableOptions = new TableOptions("*") { CollisionMode = CollisionMode.Durable }; m_Cache.Start(); } catch (Exception error) { MessageBox.Show(error.ToMessageWithType()); } tbAbsoluteExpiration.Text = DateTime.Now.AddMinutes(120).ToString(); }
public void T060_PileNonOwnership() { var pile = new DefaultPile(); pile.Start(); try { var cache = new LocalCache(); cache.Pile = pile; cache.Configure(null); cache.Start(); var tA = cache.GetOrCreateTable<string>("A"); tA.Put("aaa", "avalue"); tA.Put("bbb", "bvalue"); Assert.AreEqual("avalue", tA.Get("aaa")); Assert.AreEqual(2, cache.Count); Assert.AreEqual(2, pile.ObjectCount); cache.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, cache.Status); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Active, pile.Status); Assert.AreEqual(0, pile.ObjectCount); cache = new LocalCache(); cache.Pile = pile; cache.Configure(null); cache.Start(); var tAbc = cache.GetOrCreateTable<string>("Abc"); tAbc.Put("aaa", "avalue"); tAbc.Put("bbb", "bvalue"); tAbc.Put("ccc", "cvalue"); tAbc.Put("ddd", "cvalue"); Assert.AreEqual(4, pile.ObjectCount); var cache2 = new LocalCache(); cache2.Pile = pile; cache2.Configure(null); cache2.Start(); var t2 = cache2.GetOrCreateTable<string>("A"); t2.Put("aaa", "avalue"); t2.Put("bbb", "bvalue"); Assert.AreEqual(2, cache2.Count); Assert.AreEqual(6, pile.ObjectCount); cache.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Active, pile.Status); Assert.AreEqual(2, pile.ObjectCount); cache2.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Active, pile.Status); Assert.AreEqual(0, pile.ObjectCount); pile.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, pile.Status); } finally { pile.Dispose(); } }
public void T040_PileOwnership() { var cache = new LocalCache(); cache.Pile = new DefaultPile(cache); cache.Configure(null); cache.Start(); var tA = cache.GetOrCreateTable<string>("A"); tA.Put("aaa", "avalue"); Assert.AreEqual("avalue", tA.Get("aaa")); cache.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, cache.Status); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, cache.Pile.Status); }
private static LocalCache makeCache() { var cache = new LocalCache(); cache.Pile = new DefaultPile(cache); cache.Configure(null); cache.Start(); return cache; }
public void NoGrowth_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, int countMin, int countMax) { using (var cache = new LocalCache()) using (var pile = new DefaultPile(cache)) { cache.Pile = pile; cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; cache.Start(); var startTime = DateTime.UtcNow; var tasks = new List<Task>(); for (var t = 0; t < (System.Environment.ProcessorCount - 1); t++) tasks.Add(Task.Factory.StartNew(() => { var tA = cache.GetOrCreateTable<GDID>("A"); var list = new List<CheckByteArray>(); bool put = true; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) return; if (put) { var cnt = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(countMin, countMax); for (int i = 0; i < cnt; i++) { var payloadSize = NFX.ExternalRandomGenerator .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i); tA.Put(key, val); var element = new CheckByteArray(key, payloadSize - 1, val[0], val[payloadSize - 1]); list.Add(element); } Console.WriteLine("Thread {0} put {1} objects".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); put = false; } else { var i = 0; for (var j = 0; j < list.Count; j++) { var element = list[j]; var buf = tA.Get(element.Key) as byte[]; if (buf != null) { Assert.AreEqual(element.FirstByte, buf[0]); Assert.AreEqual(element.LastByte, buf[element.IdxLast]); tA.Remove(element.Key); i++; } } Console.WriteLine("Thread {0} deleted {1} objects".Args(Thread.CurrentThread.ManagedThreadId, i)); list.Clear(); put = true; } } }, TaskCreationOptions.LongRunning)); Task.WaitAll(tasks.ToArray()); } }
public void DeleteOne_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, int deleteFreq, bool isParallel) { using (var cache = new LocalCache()) using (var pile = new DefaultPile(cache)) { cache.Pile = pile; cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; cache.Start(); var startTime = DateTime.UtcNow; var tasks = new List <Task>(); for (var t = 0; t < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++) { tasks.Add(Task.Factory.StartNew(() => { var i = 0; var list = new List <CheckByteArray>(); var tA = cache.GetOrCreateTable <GDID>("A"); var wlc = 0; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) { break; } var payloadSize = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i); tA.Put(key, val); list.Add(new CheckByteArray(key, payloadSize - 1, val[0], val[payloadSize - 1])); // delete ONE random element if (i > 0 && i % deleteFreq == 0) { while (true && list.Count > 0) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); key = list[idx].Key; var removed = tA.Remove(key); list.RemoveAt(idx); if (removed) { break; } } } // get several random elements if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98) { var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64); wlc++; if (wlc % 125 == 0) { Console.WriteLine("Thread {0} is reading {1} elements, total {2}" .Args(Thread.CurrentThread.ManagedThreadId, toRead, list.Count)); } for (var k = 0; k < toRead && list.Count > 0; k++) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); var element = list[idx]; var buf = tA.Get(element.Key) as byte[]; if (buf == null) { list.RemoveAt(idx); continue; } Assert.AreEqual(element.FirstByte, buf[0]); Assert.AreEqual(element.LastByte, buf[element.IdxLast]); } } if (i == Int32.MaxValue) { i = 0; } else { i++; } if (list.Count == Int32.MaxValue) { list = new List <CheckByteArray>(); } } Console.WriteLine("Thread {0} is doing final read of {1} elements, tableCount {2}" .Args(Thread.CurrentThread.ManagedThreadId, list.Count, tA.Count)); foreach (var element in list) { var buf = tA.Get(element.Key) as byte[]; if (buf == null) { continue; } Assert.AreEqual(element.FirstByte, buf[0]); Assert.AreEqual(element.LastByte, buf[element.IdxLast]); } }, TaskCreationOptions.LongRunning)); } Task.WaitAll(tasks.ToArray()); } }
public void PutSpeculative(int cnt) { using (var m_Sut = new LocalCache(NOPApplication.Instance)) { m_Sut.Pile = new DefaultPile(m_Sut); m_Sut.Start(); m_Sut.DefaultTableOptions = new TableOptions("*") { CollisionMode = CollisionMode.Speculative, MaximumCapacity = cnt / 2 }; var tbl = m_Sut.GetOrCreateTable <int>("a"); var inserted = 0; var over = 0; for (var i = 0; i < cnt; i++) { var result = tbl.Put(i, "value#" + i, 10000); if (PutResult.Inserted == result) { inserted++; } else if (PutResult.Overwritten == result) { over++; } else { Aver.Fail("Unexpected result: " + result); } } "Inserted: {0} Overwritten: {1}".SeeArgs(inserted, over); var inserted2 = 0; var over2 = 0; for (var i = 0; i < cnt; i++) { var got = tbl.Get(i) as string; if (got == null) { over2++; continue; } inserted2++; Aver.AreEqual("value#" + i, got); } "Inserted2: {0} Overwritten2: {1}".SeeArgs(inserted2, over2); Aver.AreEqual(inserted, inserted2); Aver.AreEqual(over, over2); tbl.Purge(); Aver.AreEqual(0, tbl.Count); } }
public void T060_PileNonOwnership() { var pile = new DefaultPile(NOPApplication.Instance); pile.Start(); try { var cache = new LocalCache(NOPApplication.Instance); cache.Pile = pile; cache.Configure(null); cache.Start(); var tA = cache.GetOrCreateTable <string>("A"); tA.Put("aaa", "avalue"); tA.Put("bbb", "bvalue"); Aver.AreObjectsEqual("avalue", tA.Get("aaa")); Aver.AreEqual(2, cache.Count); Aver.AreEqual(2, pile.ObjectCount); cache.WaitForCompleteStop(); Aver.IsTrue(DaemonStatus.Inactive == cache.Status); Aver.IsTrue(DaemonStatus.Active == pile.Status); Aver.AreEqual(0, pile.ObjectCount); cache = new LocalCache(NOPApplication.Instance); cache.Pile = pile; cache.Configure(null); cache.Start(); var tAbc = cache.GetOrCreateTable <string>("Abc"); tAbc.Put("aaa", "avalue"); tAbc.Put("bbb", "bvalue"); tAbc.Put("ccc", "cvalue"); tAbc.Put("ddd", "cvalue"); Aver.AreEqual(4, pile.ObjectCount); var cache2 = new LocalCache(NOPApplication.Instance); cache2.Pile = pile; cache2.Configure(null); cache2.Start(); var t2 = cache2.GetOrCreateTable <string>("A"); t2.Put("aaa", "avalue"); t2.Put("bbb", "bvalue"); Aver.AreEqual(2, cache2.Count); Aver.AreEqual(6, pile.ObjectCount); cache.WaitForCompleteStop(); Aver.IsTrue(DaemonStatus.Active == pile.Status); Aver.AreEqual(2, pile.ObjectCount); cache2.WaitForCompleteStop(); Aver.IsTrue(DaemonStatus.Active == pile.Status); Aver.AreEqual(0, pile.ObjectCount); pile.WaitForCompleteStop(); Aver.IsTrue(DaemonStatus.Inactive == pile.Status); } finally { pile.Dispose(); } }
public void Chessboard_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, bool isParallel) { using (var cache = new LocalCache()) using (var pile = new DefaultPile(cache)) { cache.Pile = pile; cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; cache.Start(); var startTime = DateTime.UtcNow; var tasks = new List<Task>(); for (var t = 0; t < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++) tasks.Add(Task.Factory.StartNew(() => { var list = new List<CheckByteArray>(); var i = 0; var tA = cache.GetOrCreateTable<GDID>("A"); var wlc = 0; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) break; var payloadSize = NFX.ExternalRandomGenerator .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i); tA.Put(key, val); var element = new CheckByteArray(key, payloadSize - 1, val[0], val[payloadSize - 1]); list.Add(element); // delete previous element if (list.Count > 1 && i % 2 == 0) { key = list[list.Count - 2].Key; tA.Remove(key); list.RemoveAt(list.Count - 2); } // get several random elements if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98) { var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64); wlc++; if (wlc % 125 == 0) Console.WriteLine("Thread {0} is reading {1} elements, total {2}" .Args(Thread.CurrentThread.ManagedThreadId, toRead, list.Count)); for (var k = 0; k < toRead && list.Count > 0; k++) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); element = list[idx]; var buf = tA.Get(element.Key) as byte[]; if (buf == null) { list.RemoveAt(idx); continue; } Assert.AreEqual(element.FirstByte, buf[0]); Assert.AreEqual(element.LastByte, buf[element.IdxLast]); } } if (i == Int32.MaxValue) i = 0; else i++; if (list.Count == Int32.MaxValue) list = new List<CheckByteArray>(); } // total check Console.WriteLine("Thread {0} is doing final read of {1} elements, tableCount {2}" .Args(Thread.CurrentThread.ManagedThreadId, list.Count, tA.Count)); foreach (var element in list) { var buf = tA.Get(element.Key) as byte[]; if (buf == null) continue; Assert.AreEqual(element.FirstByte, buf[0]); Assert.AreEqual(element.LastByte, buf[element.IdxLast]); } return; }, TaskCreationOptions.LongRunning)); Task.WaitAll(tasks.ToArray()); } }
public void Write_Read_Index_Primitives(bool usecache, string compress, string encrypt, int CNT, string idxCompress, string idxEncrypt, int pageLboundKb, int pageUboundKb, int idxLboundKb, int idxUboundKb) { var ctlMumbo = MumboJumbo.GetControl(); IPileImplementation pile = null; ICacheImplementation cache = null; IPageCache pageCache = null; if (usecache) { pile = new DefaultPile(App); cache = new LocalCache(App) { Pile = pile, DefaultTableOptions = new TableOptions("*") { CollisionMode = CollisionMode.Durable }, PileMaxMemoryLimit = 32L * 1024 * 1024 * 1024 }; pile.Start(); cache.Start(); pageCache = new PilePageCache(cache); } try { var msData = new MemoryStream(); var msIdxId = new MemoryStream(); var msIdxCid = new MemoryStream(); var msIdxDid = new MemoryStream(); var msIdxPn = new MemoryStream(); var msIdxLt = new MemoryStream(); var msIdxLn = new MemoryStream(); var msIdxAl = new MemoryStream(); var msIdxCd = new MemoryStream(); var msIdxNt = new MemoryStream(); var msIdxAmt = new MemoryStream(); var meta = VolumeMetadataBuilder.Make("Primitive Idx", "mjumbo") .SetVersion(1, 1) .SetDescription("MumboJumbo testing") .SetCompressionScheme(compress) .SetEncryptionScheme(encrypt); var volumeData = new DefaultVolume(CryptoMan, pageCache, meta, msData); var IdxIdMetaBuilder = getSpecificBuilder(GdidIdxAppender.CONTENT_TYPE_IDX_GDID, idxCompress, idxEncrypt); var IdxCidMetaBuilder = getSpecificBuilder(GuidIdxAppender.CONTENT_TYPE_IDX_GUID, idxCompress, idxEncrypt); var IdxDidMetaBuilder = getSpecificBuilder(LongIdxAppender.CONTENT_TYPE_IDX_LONG, idxCompress, idxEncrypt); var IdxPnMetaBuilder = getSpecificBuilder(IntIdxAppender.CONTENT_TYPE_IDX_INT, idxCompress, idxEncrypt); var IdxLtMetaBuilder = getSpecificBuilder(DoubleIdxAppender.CONTENT_TYPE_IDX_DOUBLE, idxCompress, idxEncrypt); var IdxLnMetaBuilder = getSpecificBuilder(DoubleIdxAppender.CONTENT_TYPE_IDX_DOUBLE, idxCompress, idxEncrypt); var IdxAlMetaBuilder = getSpecificBuilder(DecimalIdxAppender.CONTENT_TYPE_IDX_DECIMAL, idxCompress, idxEncrypt); var IdxCdMetaBuilder = getSpecificBuilder(DateTimeIdxAppender.CONTENT_TYPE_IDX_DATETIME, idxCompress, idxEncrypt); var IdxNtMetaBuilder = getSpecificBuilder(StringIdxAppender.CONTENT_TYPE_IDX_STRING, idxCompress, idxEncrypt); var IdxAmtMetaBuilder = getSpecificBuilder(AmountIdxAppender.CONTENT_TYPE_IDX_AMOUNT, idxCompress, idxEncrypt); var volumeIdxId = new DefaultVolume(CryptoMan, IdxIdMetaBuilder, msIdxId); var volumeIdxCid = new DefaultVolume(CryptoMan, IdxCidMetaBuilder, msIdxCid); var volumeIdxDid = new DefaultVolume(CryptoMan, IdxDidMetaBuilder, msIdxDid); var volumeIdxPn = new DefaultVolume(CryptoMan, IdxPnMetaBuilder, msIdxPn); var volumeIdxLt = new DefaultVolume(CryptoMan, IdxLtMetaBuilder, msIdxLt); var volumeIdxLn = new DefaultVolume(CryptoMan, IdxLnMetaBuilder, msIdxLn); var volumeIdxAl = new DefaultVolume(CryptoMan, IdxAlMetaBuilder, msIdxAl); var volumeIdxCd = new DefaultVolume(CryptoMan, IdxCdMetaBuilder, msIdxCd); var volumeIdxNt = new DefaultVolume(CryptoMan, IdxNtMetaBuilder, msIdxNt); var volumeIdxAmt = new DefaultVolume(CryptoMan, IdxAmtMetaBuilder, msIdxAmt); volumeData.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(pageLboundKb, pageUboundKb) * 1024; volumeIdxId.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxCid.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxDid.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxPn.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxLt.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxLn.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxAl.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxCd.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxNt.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; volumeIdxAmt.PageSizeBytes = Ambient.Random.NextScaledRandomInteger(idxLboundKb, idxUboundKb) * 1024; var reader = new MumboJumboArchiveReader(volumeData); var idxIdReader = new GdidIdxReader(volumeIdxId); var idxCidReader = new GuidIdxReader(volumeIdxCid); var idxDidReader = new LongIdxReader(volumeIdxDid); var idxPnReader = new IntIdxReader(volumeIdxPn); var idxLtReader = new DoubleIdxReader(volumeIdxLt); var idxLnReader = new DoubleIdxReader(volumeIdxLn); var idxAlReader = new DecimalIdxReader(volumeIdxAl); var idxCdReader = new DateTimeIdxReader(volumeIdxCd); var idxNtReader = new StringIdxReader(volumeIdxNt); var idxAmtReader = new AmountIdxReader(volumeIdxAmt); var time = Azos.Time.Timeter.StartNew(); var app = Azos.Apps.ExecutionContext.Application; using (var aIdxId = new GdidIdxAppender(volumeIdxId, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxCid = new GuidIdxAppender(volumeIdxCid, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxDid = new LongIdxAppender(volumeIdxDid, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxPn = new IntIdxAppender(volumeIdxPn, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxLt = new DoubleIdxAppender(volumeIdxLt, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxLn = new DoubleIdxAppender(volumeIdxLn, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxAl = new DecimalIdxAppender(volumeIdxAl, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxCd = new DateTimeIdxAppender(volumeIdxCd, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxNt = new StringIdxAppender(volumeIdxNt, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) using (var aIdxAmt = new AmountIdxAppender(volumeIdxAmt, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba")) { using (var appender = new MumboJumboArchiveAppender(volumeData, NOPApplication.Instance.TimeSource, NOPApplication.Instance.AppId, "dima@zhaba", onPageCommit: (e, b) => { aIdxId.Append(new GdidBookmark(e.ID, b)); aIdxCid.Append(new GuidBookmark(e.CorrelationId, b)); aIdxDid.Append(new LongBookmark(e.DeviceId, b)); aIdxPn.Append(new IntBookmark(e.PartNumber, b)); aIdxLt.Append(new DoubleBookmark(e.Latitude, b)); aIdxLn.Append(new DoubleBookmark(e.Longitude, b)); aIdxAl.Append(new DecimalBookmark(e.Altitude, b)); aIdxCd.Append(new DateTimeBookmark(e.CreateDate, b)); aIdxNt.Append(new StringBookmark(e.Note, b)); aIdxAmt.Append(new AmountBookmark(e.Amt, b)); })) { var messages = FakeRow.GenerateMany <MumboJumbo>(1, 1, (ulong)(CNT * .5) - 1); foreach (var m in messages) { if (!App.Active) { break; } appender.Append(m); } /////////////////////////////////////////////// appender.Append(MumboJumbo.GetControl()); //we add 1 control message in the middle /////////////////////////////////////////////// messages = FakeRow.GenerateMany <MumboJumbo>(1, 1, (ulong)(CNT * .5)); foreach (var m in messages) { if (!App.Active) { break; } appender.Append(m); } } } "Wrote {0} items, now reading".SeeArgs(CNT); if (cache != null) { "Cache has {0} items".SeeArgs(cache.Count); } var gotOne = false; // Find by GDID (ID) foreach (var idx in idxIdReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.ID, idx.Value); if (idx.Value == ctlMumbo.ID) { //data.See(); Aver.AreEqual(ctlMumbo.ID, data.ID); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find ID by {nameof(GdidIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(GdidIdxReader)); gotOne = false; // Find by Guid (CorrelationId) foreach (var idx in idxCidReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.CorrelationId, idx.Value); if (idx.Value == ctlMumbo.CorrelationId) { //data.See(); Aver.AreEqual(ctlMumbo.CorrelationId, data.CorrelationId); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find CorrelationId by {nameof(GuidIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(GuidIdxReader)); gotOne = false; // Find by Long (DeviceId) foreach (var idx in idxDidReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.DeviceId, idx.Value); if (idx.Value == ctlMumbo.DeviceId) { //data.See(); Aver.AreEqual(ctlMumbo.DeviceId, data.DeviceId); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find DeviceId by {nameof(LongIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(LongIdxReader)); gotOne = false; // Find by Int (PartNumber) foreach (var idx in idxPnReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.PartNumber, idx.Value); if (idx.Value == ctlMumbo.PartNumber) { //data.See(); Aver.AreEqual(ctlMumbo.PartNumber, data.PartNumber); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find PartNumber by {nameof(IntIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(IntIdxReader)); gotOne = false; // Find by Double (Latitude) foreach (var idx in idxLtReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.Latitude, idx.Value); if (idx.Value == ctlMumbo.Latitude) { //data.See(); Aver.AreEqual(ctlMumbo.Latitude, data.Latitude); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find Latitude by {nameof(DoubleIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(DoubleIdxReader)); gotOne = false; // Find by Double (Longitude) foreach (var idx in idxLnReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.Longitude, idx.Value); if (idx.Value == ctlMumbo.Longitude) { //data.See(); Aver.AreEqual(ctlMumbo.Longitude, data.Longitude); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find Longitude by {nameof(DoubleIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(DoubleIdxReader)); gotOne = false; // Find by Decimal (Altitude) foreach (var idx in idxAlReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.Altitude, idx.Value); if (idx.Value == ctlMumbo.Altitude) { //data.See(); Aver.AreEqual(ctlMumbo.Altitude, data.Altitude); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find Altitude by {nameof(DecimalIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(DecimalIdxReader)); gotOne = false; // Find by DateTime (CreateDate) foreach (var idx in idxCdReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.CreateDate, idx.Value); if (idx.Value == ctlMumbo.CreateDate) { //data.See(); Aver.AreEqual(ctlMumbo.CreateDate, data.CreateDate); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find CreateDate by {nameof(DateTimeIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(DateTimeIdxReader)); gotOne = false; // Find by String (Note) foreach (var idx in idxNtReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.Note, idx.Value); if (idx.Value == ctlMumbo.Note) { //data.See(); Aver.AreEqual(ctlMumbo.Note, data.Note); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find Note by {nameof(StringIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(StringIdxReader)); gotOne = false; // Find by Amount (Amt) foreach (var idx in idxAmtReader.All) { if (!App.Active) { break; } var data = reader.GetEntriesStartingAt(idx.Bookmark).First(); Aver.AreEqual(data.Amt, idx.Value); if (idx.Value == ctlMumbo.Amt) { //data.See(); Aver.AreEqual(ctlMumbo.Amt, data.Amt); gotOne = true; break; } } if (!gotOne) { Aver.Fail($"Failed to find Amt by {nameof(AmountIdxReader)}"); } "Finished reading {0}".SeeArgs(nameof(AmountIdxReader)); //gotOne = false; time.Stop(); "Did {0:n0} in {1:n1} sec at {2:n2} ops/sec\n".SeeArgs(CNT, time.ElapsedSec, CNT / time.ElapsedSec); volumeIdxId.Dispose(); volumeIdxCid.Dispose(); volumeIdxDid.Dispose(); volumeIdxPn.Dispose(); volumeIdxLt.Dispose(); volumeIdxLn.Dispose(); volumeIdxAl.Dispose(); volumeIdxCd.Dispose(); volumeIdxNt.Dispose(); volumeIdxAmt.Dispose(); volumeData.Dispose(); } finally { DisposableObject.DisposeIfDisposableAndNull(ref pageCache); DisposableObject.DisposeIfDisposableAndNull(ref cache); DisposableObject.DisposeIfDisposableAndNull(ref pile); "CLOSED all volumes\n".See(); } }
private LocalCache makeCache(IConfigSectionNode conf = null) { var cache = new LocalCache(); cache.Pile = new DefaultPile(cache); cache.Configure( conf ); cache.Start(); return cache; }
public void NoGrowth_ByteArray(bool speed, int durationSec, int payloadSizeMin, int payloadSizeMax, int countMin, int countMax) { using (var cache = new LocalCache()) using (var pile = new DefaultPile(cache)) { cache.Pile = pile; cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; cache.Start(); var startTime = DateTime.UtcNow; var tasks = new List <Task>(); for (var t = 0; t < (System.Environment.ProcessorCount - 1); t++) { tasks.Add(Task.Factory.StartNew(() => { var tA = cache.GetOrCreateTable <GDID>("A"); var list = new List <CheckByteArray>(); bool put = true; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) { return; } if (put) { var cnt = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(countMin, countMax); for (int i = 0; i < cnt; i++) { var payloadSize = NFX.ExternalRandomGenerator .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, (ulong)i); tA.Put(key, val); var element = new CheckByteArray(key, payloadSize - 1, val[0], val[payloadSize - 1]); list.Add(element); } Console.WriteLine("Thread {0} put {1} objects".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); put = false; } else { var i = 0; for (var j = 0; j < list.Count; j++) { var element = list[j]; var buf = tA.Get(element.Key) as byte[]; if (buf != null) { Assert.AreEqual(element.FirstByte, buf[0]); Assert.AreEqual(element.LastByte, buf[element.IdxLast]); tA.Remove(element.Key); i++; } } Console.WriteLine("Thread {0} deleted {1} objects".Args(Thread.CurrentThread.ManagedThreadId, i)); list.Clear(); put = true; } } }, TaskCreationOptions.LongRunning)); } Task.WaitAll(tasks.ToArray()); } }
public void T060_PileNonOwnership() { var pile = new DefaultPile(); pile.Start(); try { var cache = new LocalCache(); cache.Pile = pile; cache.Configure(null); cache.Start(); var tA = cache.GetOrCreateTable <string>("A"); tA.Put("aaa", "avalue"); tA.Put("bbb", "bvalue"); Assert.AreEqual("avalue", tA.Get("aaa")); Assert.AreEqual(2, cache.Count); Assert.AreEqual(2, pile.ObjectCount); cache.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, cache.Status); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Active, pile.Status); Assert.AreEqual(0, pile.ObjectCount); cache = new LocalCache(); cache.Pile = pile; cache.Configure(null); cache.Start(); var tAbc = cache.GetOrCreateTable <string>("Abc"); tAbc.Put("aaa", "avalue"); tAbc.Put("bbb", "bvalue"); tAbc.Put("ccc", "cvalue"); tAbc.Put("ddd", "cvalue"); Assert.AreEqual(4, pile.ObjectCount); var cache2 = new LocalCache(); cache2.Pile = pile; cache2.Configure(null); cache2.Start(); var t2 = cache2.GetOrCreateTable <string>("A"); t2.Put("aaa", "avalue"); t2.Put("bbb", "bvalue"); Assert.AreEqual(2, cache2.Count); Assert.AreEqual(6, pile.ObjectCount); cache.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Active, pile.Status); Assert.AreEqual(2, pile.ObjectCount); cache2.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Active, pile.Status); Assert.AreEqual(0, pile.ObjectCount); pile.WaitForCompleteStop(); Assert.AreEqual(NFX.ServiceModel.ControlStatus.Inactive, pile.Status); } finally { pile.Dispose(); } }
public void DeleteSeveral_TwoTables_ByteArray(bool speed, int durationSec, int putMin, int putMax, int delFactor, int payloadSizeMin, int payloadSizeMax, bool isParallel) { using (var cache = new LocalCache()) using (var pile = new DefaultPile(cache)) { cache.Pile = pile; cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; cache.Start(); var startTime = DateTime.UtcNow; var tasks = new List <Task>(); for (var t = 0; t < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++) { tasks.Add(Task.Factory.StartNew(() => { var list = new List <Tuple <int, GDID, int, byte, byte> >(); var tA = cache.GetOrCreateTable <GDID>("A"); var tB = cache.GetOrCreateTable <GDID>("B"); ulong k = 0; var wlc = 0; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) { break; } var putCount = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(putMin, putMax); for (int i = 0; i < putCount; i++) { var payloadSize = NFX.ExternalRandomGenerator .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; var tableId = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 1); var table = tableId == 0 ? tA : tB; var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, k); table.Put(key, val); list.Add(new Tuple <int, GDID, int, byte, byte>(tableId, key, payloadSize - 1, val[0], val[payloadSize - 1])); k++; } int delCount = putCount / delFactor; for (int i = 0; i < delCount; i++) { while (true && list.Count > 0) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); var element = list[idx]; var table = element.Item1 == 0 ? tA : tB; var key = element.Item2; var removed = table.Remove(key); list.RemoveAt(idx); if (removed) { break; } } } // get several random elements if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98) { var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64); wlc++; if (wlc % 125 == 0) { Console.WriteLine("Thread {0} is reading {1} elements" .Args(Thread.CurrentThread.ManagedThreadId, toRead)); } for (var j = 0; j < toRead && list.Count > 0; j++) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); var element = list[idx]; var table = element.Item1 == 0 ? tA : tB; var key = element.Item2; var buf = table.Get(key) as byte[]; if (buf == null) { list.RemoveAt(idx); continue; } Assert.AreEqual(element.Item4, buf[0]); Assert.AreEqual(element.Item5, buf[element.Item3]); } } if (list.Count == Int32.MaxValue) { list = new List <Tuple <int, GDID, int, byte, byte> >(); } } // total check Console.WriteLine("Thread {0} is doing final read of {1} elements".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); foreach (var element in list) { var table = element.Item1 == 0 ? tA : tB; var val = table.Get(element.Item2) as byte[]; if (val == null) { continue; } Assert.AreEqual(element.Item4, val[0]); Assert.AreEqual(element.Item5, val[element.Item3]); } return; }, TaskCreationOptions.LongRunning)); } Task.WaitAll(tasks.ToArray()); } }
public void DeleteSeveral_TwoTables_ByteArray(bool speed, int durationSec, int putMin, int putMax, int delFactor, int payloadSizeMin, int payloadSizeMax, bool isParallel) { using (var cache = new LocalCache()) using (var pile = new DefaultPile(cache)) { cache.Pile = pile; cache.PileAllocMode = speed ? AllocationMode.FavorSpeed : AllocationMode.ReuseSpace; cache.Start(); var startTime = DateTime.UtcNow; var tasks = new List<Task>(); for (var t = 0; t < (isParallel ? (System.Environment.ProcessorCount - 1) : 1); t++) tasks.Add(Task.Factory.StartNew(() => { var list = new List<Tuple<int, GDID, int, byte, byte>>(); var tA = cache.GetOrCreateTable<GDID>("A"); var tB = cache.GetOrCreateTable<GDID>("B"); ulong k = 0; var wlc = 0; while (true) { if ((DateTime.UtcNow - startTime).TotalSeconds >= durationSec) break; var putCount = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(putMin, putMax); for (int i = 0; i < putCount; i++) { var payloadSize = NFX.ExternalRandomGenerator .Instance.NextScaledRandomInteger(payloadSizeMin, payloadSizeMax); var val = new byte[payloadSize]; val[0] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; val[payloadSize - 1] = (byte)NFX.ExternalRandomGenerator.Instance.NextRandomInteger; var tableId = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 1); var table = tableId == 0 ? tA : tB; var key = new GDID((uint)Thread.CurrentThread.ManagedThreadId, k); table.Put(key, val); list.Add(new Tuple<int, GDID, int, byte, byte>(tableId, key, payloadSize - 1, val[0], val[payloadSize - 1])); k++; } int delCount = putCount / delFactor; for (int i = 0; i < delCount; i++) { while (true && list.Count > 0) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); var element = list[idx]; var table = element.Item1 == 0 ? tA : tB; var key = element.Item2; var removed = table.Remove(key); list.RemoveAt(idx); if (removed) break; } } // get several random elements if (list.Count > 64 && NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, 100) > 98) { var toRead = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(8, 64); wlc++; if (wlc % 125 == 0) Console.WriteLine("Thread {0} is reading {1} elements" .Args(Thread.CurrentThread.ManagedThreadId, toRead)); for (var j = 0; j < toRead && list.Count > 0; j++) { var idx = NFX.ExternalRandomGenerator.Instance.NextScaledRandomInteger(0, list.Count - 1); var element = list[idx]; var table = element.Item1 == 0 ? tA : tB; var key = element.Item2; var buf = table.Get(key) as byte[]; if (buf == null) { list.RemoveAt(idx); continue; } Assert.AreEqual(element.Item4, buf[0]); Assert.AreEqual(element.Item5, buf[element.Item3]); } } if (list.Count == Int32.MaxValue) list = new List<Tuple<int, GDID, int, byte, byte>>(); } // total check Console.WriteLine("Thread {0} is doing final read of {1} elements".Args(Thread.CurrentThread.ManagedThreadId, list.Count)); foreach (var element in list) { var table = element.Item1 == 0 ? tA : tB; var val = table.Get(element.Item2) as byte[]; if (val == null) continue; Assert.AreEqual(element.Item4, val[0]); Assert.AreEqual(element.Item5, val[element.Item3]); } return; }, TaskCreationOptions.LongRunning)); Task.WaitAll(tasks.ToArray()); } }