entries, &marker, truncated);
}
+static int log_list(librados::IoCtx& ioctx, const std::string& oid,
+ list<cls_log_entry>& entries)
+{
+ utime_t from, to;
+ bool truncated{false};
+ return log_list(ioctx, oid, from, to, 0, entries, &truncated);
+}
+
TEST_F(cls_log, test_log_add_same_time)
{
/* add chains */
ASSERT_EQ(10, i);
}
-TEST_F(cls_log, test_log_trim)
+int do_log_trim(librados::IoCtx& ioctx, const std::string& oid,
+ const std::string& from_marker, const std::string& to_marker)
+{
+ librados::ObjectWriteOperation op;
+ cls_log_trim(op, {}, {}, from_marker, to_marker);
+ return ioctx.operate(oid, &op);
+}
+
+int do_log_trim(librados::IoCtx& ioctx, const std::string& oid,
+ const utime_t& from_time, const utime_t& to_time)
+{
+ librados::ObjectWriteOperation op;
+ cls_log_trim(op, from_time, to_time, "", "");
+ return ioctx.operate(oid, &op);
+}
+
+TEST_F(cls_log, trim_by_time)
{
/* add chains */
string oid = "obj";
utime_t trim_time = get_time(start_time, i, true);
utime_t zero_time;
- string start_marker, end_marker;
- ASSERT_EQ(0, cls_log_trim(ioctx, oid, zero_time, trim_time, start_marker, end_marker));
+ ASSERT_EQ(0, do_log_trim(ioctx, oid, zero_time, trim_time));
+ ASSERT_EQ(-ENODATA, do_log_trim(ioctx, oid, zero_time, trim_time));
ASSERT_EQ(0, log_list(ioctx, oid, start_time, to_time, 0,
entries, &truncated));
ASSERT_FALSE(truncated);
}
}
+
+TEST_F(cls_log, trim_by_marker)
+{
+ string oid = "obj";
+ ASSERT_EQ(0, ioctx.create(oid, true));
+
+ utime_t start_time = ceph_clock_now();
+ generate_log(ioctx, oid, 10, start_time, true);
+
+ utime_t zero_time;
+ std::vector<cls_log_entry> log1;
+ {
+ list<cls_log_entry> entries;
+ ASSERT_EQ(0, log_list(ioctx, oid, entries));
+ ASSERT_EQ(10u, entries.size());
+
+ log1.assign(std::make_move_iterator(entries.begin()),
+ std::make_move_iterator(entries.end()));
+ }
+ // trim front of log
+ {
+ const std::string from = "";
+ const std::string to = log1[0].id;
+ ASSERT_EQ(0, do_log_trim(ioctx, oid, from, to));
+ list<cls_log_entry> entries;
+ ASSERT_EQ(0, log_list(ioctx, oid, entries));
+ ASSERT_EQ(9u, entries.size());
+ EXPECT_EQ(log1[1].id, entries.begin()->id);
+ ASSERT_EQ(-ENODATA, do_log_trim(ioctx, oid, from, to));
+ }
+ // trim back of log
+ {
+ const std::string from = log1[8].id;
+ const std::string to = "9";
+ ASSERT_EQ(0, do_log_trim(ioctx, oid, from, to));
+ list<cls_log_entry> entries;
+ ASSERT_EQ(0, log_list(ioctx, oid, entries));
+ ASSERT_EQ(8u, entries.size());
+ EXPECT_EQ(log1[8].id, entries.rbegin()->id);
+ ASSERT_EQ(-ENODATA, do_log_trim(ioctx, oid, from, to));
+ }
+ // trim a key from the middle
+ {
+ const std::string from = log1[3].id;
+ const std::string to = log1[4].id;
+ ASSERT_EQ(0, do_log_trim(ioctx, oid, from, to));
+ list<cls_log_entry> entries;
+ ASSERT_EQ(0, log_list(ioctx, oid, entries));
+ ASSERT_EQ(7u, entries.size());
+ ASSERT_EQ(-ENODATA, do_log_trim(ioctx, oid, from, to));
+ }
+ // trim full log
+ {
+ const std::string from = "";
+ const std::string to = "9";
+ ASSERT_EQ(0, do_log_trim(ioctx, oid, from, to));
+ list<cls_log_entry> entries;
+ ASSERT_EQ(0, log_list(ioctx, oid, entries));
+ ASSERT_EQ(0u, entries.size());
+ ASSERT_EQ(-ENODATA, do_log_trim(ioctx, oid, from, to));
+ }
+}