示例#1
0
        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);
            }
        }
示例#2
0
        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);
            }
        }
示例#3
0
文件: CacheTest.cs 项目: mjaric/nfx
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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());
                }
        }
示例#6
0
      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();
        }
      }
示例#7
0
      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);
      }
示例#8
0
文件: CacheTest.cs 项目: mjaric/nfx
        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();
            }
        }
示例#9
0
        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);
            }
        }
示例#10
0
        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());
              }
        }
示例#11
0
        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());
              }
        }
示例#12
0
        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());
              }
        }
示例#13
0
 public object Get(string key, string table) =>
 cache.GetOrCreateTable <string>(table ?? defaultTable).Get(key);
示例#14
0
        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();
            }
        }
示例#15
0
        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());
                }
        }
示例#16
0
        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());
                }
        }
示例#17
0
 private ICacheTable <GDID> getTable(GDID gUser)
 {
     return(m_Cache.GetOrCreateTable <GDID>((gUser.Counter & 0x0fff).ToString()));
 }