示例#1
0
 public Cache()
 {
     cache.Pile = new DefaultPile(cache);
     ConfigAttribute.Apply(this, App.ConfigRoot);
     cache.Configure(App.ConfigRoot);
     cache.Start();
 }
示例#2
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);
            }
        }
示例#3
0
 public PileCacheUserStore(IPileImplementation pile)
 {
     m_Pile  = pile;
     m_Cache = new LocalCache(m_Pile, null, null);
     m_Cache.Configure(null);
     m_Cache.Start();
 }
示例#4
0
        private static LocalCache makeCache()
        {
            var cache = new LocalCache();

            cache.Pile = new DefaultPile(cache);
            cache.Configure(null);
            cache.Start();
            return(cache);
        }
示例#5
0
        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);
        }
示例#6
0
文件: CacheTest.cs 项目: mjaric/nfx
        private LocalCache makeCache(IConfigSectionNode conf = null)
        {
            var cache = new LocalCache();

            cache.Pile = new DefaultPile(cache);
            cache.Configure(conf);
            cache.Start();
            return(cache);
        }
示例#7
0
 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();
 }
示例#8
0
        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;
            }
        }
示例#9
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);
            }
        }
示例#10
0
文件: CacheTest.cs 项目: mjaric/nfx
        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();
            }
        }
示例#11
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);
        }
示例#12
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);
        }
示例#13
0
        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();
        }
示例#14
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();
        }
      }
示例#15
0
      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();
        }
                
      }
示例#16
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);
      }
示例#17
0
 private static LocalCache makeCache()
 {
     var cache = new LocalCache();
        cache.Pile = new DefaultPile(cache);
        cache.Configure(null);
        cache.Start();
        return cache;
 }
示例#18
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());
              }
        }
示例#19
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());
                }
        }
示例#20
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);
            }
        }
示例#21
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();
            }
        }
示例#22
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());
              }
        }
示例#23
0
        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();
            }
        }
示例#24
0
 private LocalCache makeCache(IConfigSectionNode conf = null)
 {
    var cache = new LocalCache();
    cache.Pile = new DefaultPile(cache);
    cache.Configure( conf );
    cache.Start();
    return cache;
 }
示例#25
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());
                }
        }
示例#26
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();
            }
        }
示例#27
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());
                }
        }
示例#28
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());
              }
        }