]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/test/common/test_lru.cc
update sources to v12.2.1
[ceph.git] / ceph / src / test / common / test_lru.cc
index b3630792aef81bd61750fee4557ffc13cfa13ba9..5db18314c4bd9789d2d7085c34f290b54c15b9c5 100644 (file)
 class Item : public LRUObject {
 public:
   int id;
-  explicit Item(int v) : id(v) {}
+  Item() : id(0) {}
+  Item(int i) : id(i) {}
+  void set(int i) {id = i;}
 };
 
 
 TEST(lru, InsertTop) {
-  LRU lru = LRU(10);
-
-  lru.lru_set_midpoint(.5); // 50% of 10 elements.
-  for (int i=0; i<100; i++) {
-    lru.lru_insert_top(new Item(i));
+  LRU lru;
+  static const int n = 100;
+  Item items[n];
+
+  lru.lru_set_midpoint(.5); // 50% of elements.
+  for (int i=0; i<n; i++) {
+    items[i].set(i);
+    lru.lru_insert_top(&items[i]);
   }
-  ASSERT_EQ(5U, lru.lru_get_top());
-  ASSERT_EQ(95U, lru.lru_get_bot());
+  ASSERT_EQ(50U, lru.lru_get_top());
+  ASSERT_EQ(50U, lru.lru_get_bot());
   ASSERT_EQ(100U, lru.lru_get_size());
 
   ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
 }
 
 TEST(lru, InsertMid) {
-  LRU lru = LRU(10);
-
-  for (int i=0; i<100; i++) {
-    lru.lru_insert_mid(new Item(i));
+  LRU lru;
+  static const int n = 102;
+  Item items[n];
+
+  lru.lru_set_midpoint(.7); // 70% of elements.
+  for (int i=0; i<n; i++) {
+    items[i].set(i);
+    lru.lru_insert_mid(&items[i]);
   }
-  ASSERT_EQ(0U, lru.lru_get_top());
-  ASSERT_EQ(100U, lru.lru_get_bot());
-  ASSERT_EQ(100U, lru.lru_get_size());
+  ASSERT_EQ(71U, lru.lru_get_top());
+  ASSERT_EQ(31U, lru.lru_get_bot());
+  ASSERT_EQ(102U, lru.lru_get_size());
 
   ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
 }
 
 TEST(lru, InsertBot) {
-  LRU lru = LRU(10);
-
-  for (int i=0; i<100; i++) {
-    lru.lru_insert_bot(new Item(i));
+  LRU lru;
+  static const int n = 100;
+  Item items[n];
+
+  lru.lru_set_midpoint(.7); // 70% of elements.
+  for (int i=0; i<n; i++) {
+    items[i].set(i);
+    lru.lru_insert_bot(&items[i]);
   }
-  ASSERT_EQ(0U, lru.lru_get_top());
-  ASSERT_EQ(100U, lru.lru_get_bot());
+  ASSERT_EQ(70U, lru.lru_get_top());
+  ASSERT_EQ(30U, lru.lru_get_bot());
   ASSERT_EQ(100U, lru.lru_get_size());
 
   ASSERT_EQ(99, (static_cast<Item*>(lru.lru_expire()))->id);
 }
 
 TEST(lru, Adjust) {
-  LRU lru = LRU(10);
-
-  lru.lru_set_midpoint(.6); // 60% of 10 elements.
-  for (int i=0; i<100; i++) {
-    lru.lru_touch(new Item(i));
+  LRU lru;
+  static const int n = 100;
+  Item items[n];
+
+  lru.lru_set_midpoint(.6); // 60% of elements.
+  for (int i=0; i<n; i++) {
+    items[i].set(i);
+    lru.lru_insert_top(&items[i]);
+    if (i % 5 == 0)
+      items[i].lru_pin();
   }
-  ASSERT_EQ(6U, lru.lru_get_top());
-  ASSERT_EQ(94U, lru.lru_get_bot());
+  ASSERT_EQ(48U, lru.lru_get_top()); /* 60% of unpinned */
+  ASSERT_EQ(52U, lru.lru_get_bot());
   ASSERT_EQ(100U, lru.lru_get_size());
 
-  lru.lru_clear();
-
-  lru.lru_set_midpoint(1.2); // 120% of 10 elements.
-  for (int i=0; i<100; i++) {
-    lru.lru_touch(new Item(i));
-  }
-  ASSERT_EQ(12U, lru.lru_get_top());
-  ASSERT_EQ(88U, lru.lru_get_bot());
-  ASSERT_EQ(100U, lru.lru_get_size());
+  ASSERT_EQ(1, (static_cast<Item*>(lru.lru_expire()))->id);
+  ASSERT_EQ(1U, lru.lru_get_pintail());
+  ASSERT_EQ(47U, lru.lru_get_top()); /* 60% of unpinned */
+  ASSERT_EQ(51U, lru.lru_get_bot());
+  ASSERT_EQ(99U, lru.lru_get_size());
+  ASSERT_EQ(2, (static_cast<Item*>(lru.lru_expire()))->id);
+  ASSERT_EQ(1U, lru.lru_get_pintail());
+  ASSERT_EQ(46U, lru.lru_get_top()); /* 60% of unpinned */
+  ASSERT_EQ(51U, lru.lru_get_bot());
+  ASSERT_EQ(98U, lru.lru_get_size());
+  ASSERT_EQ(3, (static_cast<Item*>(lru.lru_expire()))->id);
+  ASSERT_EQ(4, (static_cast<Item*>(lru.lru_expire()))->id);
+  ASSERT_EQ(6, (static_cast<Item*>(lru.lru_expire()))->id);
+  ASSERT_EQ(2U, lru.lru_get_pintail());
+  ASSERT_EQ(45U, lru.lru_get_top()); /* 60% of unpinned */
+  ASSERT_EQ(48U, lru.lru_get_bot());
+  ASSERT_EQ(95U, lru.lru_get_size());
 }
 
 TEST(lru, Pinning) {
-  LRU lru = LRU();
+  LRU lru;
 
-  Item *ob0 = new Item(0);
-  Item *ob1 = new Item(1);
+  Item ob0(0), ob1(1);
 
   // test before ob1 are in a LRU
-  ob1->lru_pin();
-  ASSERT_FALSE(ob1->lru_is_expireable());
+  ob1.lru_pin();
+  ASSERT_FALSE(ob1.lru_is_expireable());
 
-  ob1->lru_unpin();
-  ASSERT_TRUE(ob1->lru_is_expireable());
+  ob1.lru_unpin();
+  ASSERT_TRUE(ob1.lru_is_expireable());
 
   // test when ob1 are in a LRU
-  lru.lru_touch(ob0);
-  lru.lru_touch(ob1);
+  lru.lru_insert_top(&ob0);
+  lru.lru_insert_top(&ob1);
 
-  ob1->lru_pin();
-  ob1->lru_pin(); // Verify that, one incr.
+  ob1.lru_pin();
+  ob1.lru_pin(); // Verify that, one incr.
   ASSERT_EQ(1U, lru.lru_get_num_pinned());
-  ASSERT_FALSE(ob1->lru_is_expireable());
+  ASSERT_FALSE(ob1.lru_is_expireable());
 
-  ob1->lru_unpin();
-  ob1->lru_unpin(); // Verify that, one decr.
+  ob1.lru_unpin();
+  ob1.lru_unpin(); // Verify that, one decr.
   ASSERT_EQ(0U, lru.lru_get_num_pinned());
-  ASSERT_TRUE(ob1->lru_is_expireable());
+  ASSERT_TRUE(ob1.lru_is_expireable());
 
   ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
-  ob0->lru_pin();
+  ob0.lru_pin();
   ASSERT_EQ(1, (static_cast<Item*>(lru.lru_expire()))->id);
 }