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 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 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); }
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 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 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); }
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 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 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 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 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 object Get(string key, string table) => cache.GetOrCreateTable <string>(table ?? defaultTable).Get(key);
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 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 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()); } }
private ICacheTable <GDID> getTable(GDID gUser) { return(m_Cache.GetOrCreateTable <GDID>((gUser.Counter & 0x0fff).ToString())); }