TEST_F(TestImageReplayer, JournalReset)
{
bootstrap();
+ delete m_replayer;
+
ASSERT_EQ(0, librbd::Journal<>::reset(m_remote_ioctx, m_remote_image_id));
+
// try to recover
bootstrap();
}
ASSERT_TRUE(m_replayer->is_replaying());
+ generate_test_data();
open_remote_image(&ictx);
for (int i = 0; i < TEST_IO_COUNT; ++i) {
write_test_data(ictx, m_test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
wait_for_stopped();
unwatch();
}
+ close_image(ictx);
}
TEST_F(TestImageReplayer, MultipleReplayFailures_MultiEpoch) {
ASSERT_EQ(0, release_ctx.wait());
}
+ generate_test_data();
write_test_data(ictx, m_test_data, 0, TEST_IO_SIZE);
for (uint64_t i = 0; i < 5; ++i) {
for (int i = 0; i < TEST_IO_COUNT; ++i) {
write_test_data(ictx, m_test_data, TEST_IO_SIZE * i, TEST_IO_SIZE);
}
+ close_image(ictx);
sleep(DELAY / 2);
stop();
void finish(int r) {
on_finish->complete(r);
- put();
}
void get() {
void ImageDeleter::complete_active_delete(int r) {
dout(20) << dendl;
- m_delete_lock.Lock();
- DeleteInfo *del_info = m_active_delete.release();
- assert(del_info != nullptr);
- m_delete_lock.Unlock();
- del_info->notify(r);
+ Mutex::Locker delete_locker(m_delete_lock);
+ m_active_delete->notify(r);
+ m_active_delete.reset();
}
void ImageDeleter::enqueue_failed_delete(int error_code) {
class ImageReplayerAdminSocketHook : public AdminSocketHook {
public:
ImageReplayerAdminSocketHook(CephContext *cct, const std::string &name,
- ImageReplayer<I> *replayer) :
- admin_socket(cct->get_admin_socket()) {
+ ImageReplayer<I> *replayer)
+ : admin_socket(cct->get_admin_socket()),
+ lock("ImageReplayerAdminSocketHook::lock " +
+ replayer->get_global_image_id()) {
std::string command;
int r;
}
~ImageReplayerAdminSocketHook() override {
+ Mutex::Locker locker(lock);
for (Commands::const_iterator i = commands.begin(); i != commands.end();
++i) {
(void)admin_socket->unregister_command(i->first);
delete i->second;
}
+ commands.clear();
}
bool call(std::string command, cmdmap_t& cmdmap, std::string format,
bufferlist& out) override {
+ Mutex::Locker locker(lock);
Commands::const_iterator i = commands.find(command);
assert(i != commands.end());
Formatter *f = Formatter::create(format);
typedef std::map<std::string, ImageReplayerAdminSocketCommand*> Commands;
AdminSocket *admin_socket;
+ Mutex lock;
Commands commands;
};
}
void finish(int r) override {
+ m_sync->put();
m_sync_throttler->handle_sync_finished(this);
+
m_on_finish->complete(r);
}
};