return r;
}
+ snap_meta.timestamp = ceph_clock_now();
+
int max_read = RBD_MAX_KEYS_READ;
uint64_t total_read = 0;
string last_read = RBD_SNAP_KEY_PREFIX;
uint8_t protection_status;
cls_rbd_parent parent;
uint64_t flags;
+ utime_t timestamp;
cls::rbd::SnapshotNamespaceOnDisk snapshot_namespace;
/// true if we have a parent
cls_rbd_snap() : id(CEPH_NOSNAP), image_size(0), features(0),
protection_status(RBD_PROTECTION_STATUS_UNPROTECTED),
- flags(0)
+ flags(0), timestamp(utime_t())
{}
void encode(bufferlist& bl) const {
- ENCODE_START(5, 1, bl);
+ ENCODE_START(6, 1, bl);
::encode(id, bl);
::encode(name, bl);
::encode(image_size, bl);
::encode(protection_status, bl);
::encode(flags, bl);
::encode(snapshot_namespace, bl);
+ ::encode(timestamp, bl);
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator& p) {
- DECODE_START(5, p);
+ DECODE_START(6, p);
::decode(id, p);
::decode(name, p);
::decode(image_size, p);
} else {
snapshot_namespace = cls::rbd::SnapshotNamespaceOnDisk(cls::rbd::UserSnapshotNamespace());
}
+ if (struct_v >= 6) {
+ ::decode(timestamp, p);
+ }
DECODE_FINISH(p);
}
void dump(Formatter *f) const {
t->parent.overlap = 12345;
t->protection_status = RBD_PROTECTION_STATUS_PROTECTED;
t->flags = 14;
+ t->timestamp = utime_t();
o.push_back(t);
}
};
cls::rbd::SnapshotNamespace in_snap_namespace,
snap_t id, uint64_t in_size,
parent_info parent, uint8_t protection_status,
- uint64_t flags)
+ uint64_t flags, utime_t timestamp)
{
assert(snap_lock.is_wlocked());
snaps.push_back(id);
SnapInfo info(in_snap_name, in_snap_namespace,
- in_size, parent, protection_status, flags);
+ in_size, parent, protection_status, flags, timestamp);
snap_info.insert(pair<snap_t, SnapInfo>(id, info));
snap_ids.insert(pair<string, snap_t>(in_snap_name, id));
}
cls::rbd::SnapshotNamespace in_snap_namespace,
librados::snap_t id,
uint64_t in_size, parent_info parent,
- uint8_t protection_status, uint64_t flags);
+ uint8_t protection_status, uint64_t flags, utime_t timestamp);
void rm_snap(std::string in_snap_name, librados::snap_t id);
uint64_t get_image_size(librados::snap_t in_snap_id) const;
uint64_t get_object_count(librados::snap_t in_snap_id) const;
image_ctx.exclusive_lock->is_lock_owner());
// immediately add a reference to the new snapshot
+ utime_t snap_time = ceph_clock_now();
image_ctx.add_snap(m_snap_name, m_snap_namespace, m_snap_id, m_size, m_parent_info,
- RBD_PROTECTION_STATUS_UNPROTECTED, 0);
+ RBD_PROTECTION_STATUS_UNPROTECTED, 0, snap_time);
// immediately start using the new snap context if we
// own the exclusive lock
void expect_add_snap(MockRefreshImageCtx &mock_image_ctx,
const std::string &snap_name, uint64_t snap_id) {
- EXPECT_CALL(mock_image_ctx, add_snap(snap_name, _, snap_id, _, _, _, _));
+ EXPECT_CALL(mock_image_ctx, add_snap(snap_name, _, snap_id, _, _, _, _, _));
}
void expect_init_exclusive_lock(MockRefreshImageCtx &mock_image_ctx,
MOCK_CONST_METHOD2(is_snap_unprotected, int(librados::snap_t in_snap_id,
bool *is_unprotected));
- MOCK_METHOD7(add_snap, void(std::string in_snap_name,
+ MOCK_METHOD8(add_snap, void(std::string in_snap_name,
cls::rbd::SnapshotNamespace in_snap_namespace,
librados::snap_t id,
- uint64_t in_size, parent_info parent,
- uint8_t protection_status, uint64_t flags));
+ uint64_t in_size, parent_info parent,
+ uint8_t protection_status, uint64_t flags, utime_t timestamp));
MOCK_METHOD2(rm_snap, void(std::string in_snap_name, librados::snap_t id));
MOCK_METHOD0(user_flushed, void());
ictx->add_snap("snap name",
cls::rbd::UserSnapshotNamespace(), snap_id,
ictx->size, ictx->parent_md,
- RBD_PROTECTION_STATUS_UNPROTECTED, 0);
+ RBD_PROTECTION_STATUS_UNPROTECTED, 0, utime_t());
}
void expect_read_map(librbd::ImageCtx *ictx, int r) {
// state machine checks to ensure a refresh hasn't already added the snap
EXPECT_CALL(mock_image_ctx, get_snap_info(_))
.WillOnce(Return(static_cast<const librbd::SnapInfo*>(NULL)));
- EXPECT_CALL(mock_image_ctx, add_snap("snap1", _, _, _, _, _, _));
+ EXPECT_CALL(mock_image_ctx, add_snap("snap1", _, _, _, _, _, _, _));
}
void expect_unblock_writes(MockImageCtx &mock_image_ctx) {
expect_update_client(mock_remote_journaler, 0);
mock_local_image_ctx.snap_info = {
- {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U}}};
+ {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U, utime_t()}}};
m_client_meta.snap_seqs = {{1, 2}, {3, 4}, {5, 6}};
MockEventPreprocessor event_preprocessor(mock_local_image_ctx,
mock_remote_journaler,
mock_local_image_ctx.snap_ids = {{"snap", 6}};
mock_local_image_ctx.snap_info = {
- {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U}}};
+ {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U, utime_t()}}};
MockEventPreprocessor event_preprocessor(mock_local_image_ctx,
mock_remote_journaler,
"local mirror uuid",
expect_image_refresh(mock_local_image_ctx, 0);
mock_local_image_ctx.snap_info = {
- {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U}}};
+ {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U, utime_t()}}};
m_client_meta.snap_seqs = {{5, 6}};
MockEventPreprocessor event_preprocessor(mock_local_image_ctx,
mock_remote_journaler,
mock_local_image_ctx.snap_ids = {{"snap", 6}};
mock_local_image_ctx.snap_info = {
- {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U}}};
+ {6, librbd::SnapInfo{"snap", cls::rbd::UserSnapshotNamespace(), 0U, {}, 0U, 0U, utime_t()}}};
MockEventPreprocessor event_preprocessor(mock_local_image_ctx,
mock_remote_journaler,
"local mirror uuid",