Skip to content

Commit b534a66

Browse files
committed
cleanup redo log
class log_file_t: more or less sane RAII wrapper around redo log file descriptor and its path. This change is motivated by the need of using that log_file_t somewhere else.
1 parent 6af00b2 commit b534a66

File tree

3 files changed

+113
-51
lines changed

3 files changed

+113
-51
lines changed

storage/innobase/include/log0log.h

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,36 @@ or the MySQL version that created the redo log file. */
448448
typedef ib_mutex_t LogSysMutex;
449449
typedef ib_mutex_t FlushOrderMutex;
450450

451-
extern my_bool srv_read_only_mode;
451+
/** RAII wrapper over path and file descriptor. Supposed to be used for log
452+
files only */
453+
class log_file_t
454+
{
455+
public:
456+
log_file_t()= default;
457+
log_file_t(std::string path) : m_path{std::move(path)} {}
458+
459+
log_file_t(const log_file_t &)= delete;
460+
log_file_t &operator=(const log_file_t &)= delete;
461+
462+
log_file_t(log_file_t &&rhs);
463+
log_file_t &operator=(log_file_t &&rhs);
464+
465+
~log_file_t();
466+
467+
bool open();
468+
469+
bool is_opened() const { return m_fd != OS_FILE_CLOSED; }
470+
const std::string get_path() const { return m_path; }
471+
472+
bool close();
473+
dberr_t read(size_t offset, span<byte> buf);
474+
dberr_t write(size_t offset, span<const byte> buf);
475+
bool flush_data_only();
476+
477+
private:
478+
pfs_os_file_t m_fd;
479+
std::string m_path;
480+
};
452481

453482
/** Redo log buffer */
454483
struct log_t{
@@ -537,9 +566,7 @@ struct log_t{
537566
lsn_t scanned_lsn;
538567

539568
/** file descriptors for all log files */
540-
std::vector<pfs_os_file_t> files;
541-
/** file names for all log files */
542-
std::vector<std::string> file_names;
569+
std::vector<log_file_t> files;
543570

544571
/** simple setter, does not close or open log files */
545572
void set_file_names(std::vector<std::string> names);

storage/innobase/log/log0log.cc

Lines changed: 80 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -587,88 +587,123 @@ void log_t::create()
587587
}
588588
}
589589

590+
log_file_t::log_file_t(log_file_t &&rhs)
591+
{
592+
m_fd= std::move(rhs.m_fd);
593+
rhs.m_fd= OS_FILE_CLOSED;
594+
m_path= std::move(rhs.m_path);
595+
}
596+
log_file_t &log_file_t::operator=(log_file_t &&rhs)
597+
{
598+
std::swap(m_fd, rhs.m_fd);
599+
std::swap(m_path, rhs.m_path);
600+
return *this;
601+
}
602+
603+
log_file_t::~log_file_t()
604+
{
605+
if (is_opened())
606+
os_file_close(m_fd);
607+
}
608+
609+
bool log_file_t::open()
610+
{
611+
ut_a(!is_opened());
612+
613+
bool success;
614+
m_fd= os_file_create(innodb_log_file_key, m_path.c_str(),
615+
OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, OS_FILE_NORMAL,
616+
OS_LOG_FILE, srv_read_only_mode, &success);
617+
if (!success)
618+
m_fd= OS_FILE_CLOSED;
619+
620+
return success;
621+
}
622+
623+
bool log_file_t::close()
624+
{
625+
ut_a(is_opened());
626+
bool result= os_file_close(m_fd);
627+
m_fd= OS_FILE_CLOSED;
628+
return result;
629+
}
630+
631+
dberr_t log_file_t::read(size_t offset, span<byte> buf)
632+
{
633+
ut_ad(is_opened());
634+
return os_file_read(IORequestRead, m_fd, buf.data(), offset, buf.size());
635+
}
636+
637+
dberr_t log_file_t::write(size_t offset, span<const byte> buf)
638+
{
639+
ut_ad(is_opened());
640+
return os_file_write(IORequestWrite, m_path.c_str(), m_fd, buf.data(),
641+
offset, buf.size());
642+
}
643+
644+
bool log_file_t::flush_data_only()
645+
{
646+
ut_ad(is_opened());
647+
return os_file_flush_data(m_fd);
648+
}
649+
590650
void log_t::files::set_file_names(std::vector<std::string> names)
591651
{
592-
file_names= std::move(names);
652+
files.clear();
653+
654+
for (auto &&name : names)
655+
files.emplace_back(std::move(name));
593656
}
594657

595658
void log_t::files::open_files()
596659
{
597-
ut_ad(files.empty());
598-
files.reserve(file_names.size());
599-
for (const auto &name : file_names)
660+
for (auto &file : files)
600661
{
601-
bool success;
602-
files.push_back(os_file_create(innodb_log_file_key, name.c_str(),
603-
OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT,
604-
OS_FILE_NORMAL, OS_LOG_FILE,
605-
srv_read_only_mode, &success));
606-
if (!success)
607-
{
608-
ib::fatal() << "os_file_create(" << name << ") failed";
609-
}
662+
if (!file.open())
663+
ib::fatal() << "os_file_create(" << file.get_path() << ") failed";
610664
}
611665
}
612666

613667
void log_t::files::read(size_t total_offset, span<byte> buf)
614668
{
615-
ut_ad(files.size() == file_names.size());
616-
617-
const size_t file_idx= total_offset / static_cast<size_t>(file_size);
669+
auto &file= files[total_offset / static_cast<size_t>(file_size)];
618670
const size_t offset= total_offset % static_cast<size_t>(file_size);
619671

620-
if (const dberr_t err= os_file_read(IORequestRead, files[file_idx],
621-
buf.data(), offset, buf.size()))
622-
{
623-
ib::fatal() << "os_file_read(" << file_names[file_idx] << ") returned "
672+
if (const dberr_t err= file.read(offset, buf))
673+
ib::fatal() << "log_file_t::read(" << file.get_path() << ") returned "
624674
<< err;
625-
}
626675
}
627676

628677
void log_t::files::write(size_t total_offset, span<byte> buf)
629678
{
630-
ut_ad(files.size() == file_names.size());
631-
632-
const size_t file_idx= total_offset / static_cast<size_t>(file_size);
679+
auto &file= files[total_offset / static_cast<size_t>(file_size)];
633680
const size_t offset= total_offset % static_cast<size_t>(file_size);
634681

635-
if (const dberr_t err=
636-
os_file_write(IORequestWrite, file_names[file_idx].c_str(),
637-
files[file_idx], buf.data(), offset, buf.size()))
638-
{
639-
ib::fatal() << "os_file_write(" << file_names[file_idx] << ") returned "
682+
if (const dberr_t err= file.write(offset, buf))
683+
ib::fatal() << "log_file_t::d_write(" << file.get_path() << ") returned "
640684
<< err;
641-
}
642685
}
643686

644687
void log_t::files::flush_data_only()
645688
{
646-
ut_ad(files.size() == file_names.size());
647-
648689
log_sys.pending_flushes.fetch_add(1, std::memory_order_acquire);
649-
for (auto it= files.begin(), end= files.end(); it != end; ++it)
690+
for (auto &file : files)
650691
{
651-
if (!os_file_flush_data(*it))
652-
{
653-
const auto idx= std::distance(files.begin(), it);
654-
ib::fatal() << "os_file_flush_data(" << file_names[idx] << ") failed";
655-
}
692+
if (!file.flush_data_only())
693+
ib::fatal() << "log_file_t::flush_data_only(" << file.get_path()
694+
<< ") failed";
656695
}
657696
log_sys.pending_flushes.fetch_sub(1, std::memory_order_release);
658697
log_sys.flushes.fetch_add(1, std::memory_order_release);
659698
}
660699

661700
void log_t::files::close_files()
662701
{
663-
for (auto it= files.begin(), end= files.end(); it != end; ++it)
702+
for (auto &file : files)
664703
{
665-
if (!os_file_close(*it))
666-
{
667-
const auto idx= std::distance(files.begin(), it);
668-
ib::fatal() << "os_file_close(" << file_names[idx] << ") failed";
669-
}
704+
if (file.is_opened() && !file.close())
705+
ib::fatal() << "log_file_t::close(" << file.get_path() << ") failed";
670706
}
671-
files.clear();
672707
}
673708

674709
/** Initialize the redo log.

storage/innobase/srv/srv0start.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,6 @@ create_log_files(
360360
}
361361

362362
logfile0 = file_names[0];
363-
log_sys.log.set_file_names(std::move(file_names));
364363

365364
DBUG_EXECUTE_IF("innodb_log_abort_8", return(DB_ERROR););
366365
DBUG_PRINT("ib_log", ("After innodb_log_abort_8"));
@@ -374,6 +373,7 @@ create_log_files(
374373
return(DB_ERROR);
375374
}
376375

376+
log_sys.log.set_file_names(std::move(file_names));
377377
log_sys.log.open_files();
378378
fil_open_system_tablespace_files();
379379

@@ -447,7 +447,7 @@ static dberr_t create_log_files_rename(char *logfilename, size_t dirnamelen,
447447

448448
/* Replace the first file with ib_logfile0. */
449449
logfile0= logfilename;
450-
log_sys.log.file_names[0]= logfilename;
450+
log_sys.log.files[0]= log_file_t(logfilename);
451451
log_mutex_exit();
452452

453453
DBUG_EXECUTE_IF("innodb_log_abort_10", err= DB_ERROR;);

0 commit comments

Comments
 (0)