Exemplo n.º 1
0
      public void PileSmallObjects(int payloadSize, params int[] freeChunkSizes)
      {
        using (var pile = new DefaultPile() { SegmentSize = SEG_SIZE, AllocMode = AllocationMode.ReuseSpace })
        {
          pile.FreeChunkSizes = freeChunkSizes;

          pile.Start();

          var pps = new List<PilePointer>();
          while (pile.SegmentCount < 2)
            pps.Add(pile.Put(generatePayload(payloadSize)));

          pile.Delete(pps.Last());
          pps.RemoveAt(pps.Count-1);

          Console.WriteLine("just removed the last added payload and segment should be 1 now, real segment count is {0}", pile.SegmentCount);

          var objectsInFirstSegment = pps.Count;

          Console.WriteLine("put {0:N0} objects in first segment, pile.ObjectCount {1:N0}", objectsInFirstSegment, pile.ObjectCount);

          var deletedObjectCount = 0;
          for (int i = 0; i < pps.Count; i+=2, deletedObjectCount++)
            Assert.IsTrue(pile.Delete(pps[i]));

          Console.WriteLine("deleted {0:N0} objects, pile.ObjectCount {1:N0}", deletedObjectCount, pile.ObjectCount);

          var crawlStatus = pile.Crawl(false);
          Console.WriteLine("crawl: {0}", crawlStatus);

          var pps1 = new List<PilePointer>();
          var c = 0;
          while (pile.SegmentCount < 3)
          {
            pps1.Add(pile.Put(generatePayload(payloadSize)));
            if (c%20000 ==0 )pile.Crawl(true); //we do crawl because otherwise the 25000 free index xlots get exhausted AND
            c++;                               //this unit tests does not run long enough to cause Crawl within allocator (5+ seconds)
          }                                    //so we induce Crawl by hand to rebiild indexes

          pile.Delete(pps1.Last());
          pps1.RemoveAt(pps1.Count-1);

          Console.WriteLine("again just removed the last added payload and segment should be 2 now, real segment count is {0}", pile.SegmentCount);

          var objectsInSecondSegment = pps1.Count;

          Console.WriteLine("put {0:N0} objects in second segment, pile.ObjectCount {1:N0}", objectsInSecondSegment, pile.ObjectCount);

          Assert.AreEqual(objectsInFirstSegment * 2, pile.ObjectCount, "Object count in pile with two full segments must be equal to double object count in full first segment!");
        }
      }