Skip to content

Commit

Permalink
Remove new first page when creating table
Browse files Browse the repository at this point in the history
Signed-off-by: Wenbo Li <[email protected]>
  • Loading branch information
hnjylwb committed Mar 14, 2024
1 parent 4bd4f29 commit 094cac7
Show file tree
Hide file tree
Showing 7 changed files with 28 additions and 20 deletions.
3 changes: 2 additions & 1 deletion src/catalog/simple_catalog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ void SimpleCatalog::CreateTable(const std::string &table_name, const ColumnList
Disk::CreateFile(Disk::GetFilePath(db_oid, oid));
}
name2oid_[table_name] = oid;
oid2table_[oid] = std::make_shared<Table>(buffer_pool_, log_manager_, oid, db_oid, column_list, new_table);
oid2table_[oid] = std::make_shared<Table>(buffer_pool_, log_manager_, oid, db_oid, column_list, new_table,
Disk::EmptyFile(Disk::GetFilePath(db_oid, oid)));

// 检查:非新表不需要添加到Meta中
if (!new_table) {
Expand Down
7 changes: 4 additions & 3 deletions src/catalog/system_catalog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,8 @@ void SystemCatalog::CreateTable(const std::string &table_name, const ColumnList
if (new_table) {
Disk::CreateFile(Disk::GetFilePath(db_oid, oid));
}
oid2table_[oid] = std::make_shared<Table>(buffer_pool_, log_manager_, oid, db_oid, column_list, new_table);
oid2table_[oid] = std::make_shared<Table>(buffer_pool_, log_manager_, oid, db_oid, column_list, new_table,
Disk::EmptyFile(Disk::GetFilePath(db_oid, oid)));

// 检查:非新表不需要添加到 Meta 中
if (!new_table) {
Expand Down Expand Up @@ -430,8 +431,8 @@ void SystemCatalog::LoadTableMeta() {

// 添加数据表
oid_manager_.SetEntryOid(OidType::TABLE, table_name, oid);
oid2table_[oid] =
std::make_shared<Table>(buffer_pool_, log_manager_, oid, current_database_oid_, column_list, false);
oid2table_[oid] = std::make_shared<Table>(buffer_pool_, log_manager_, oid, current_database_oid_, column_list,
false, Disk::EmptyFile(Disk::GetFilePath(GetDatabaseOid(oid), oid)));
table2cardinality_[table_name] = cardinality;
}
}
Expand Down
11 changes: 6 additions & 5 deletions src/log/log_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ lsn_t LogManager::AppendInsertLog(xid_t xid, oid_t oid, pageid_t page_id, slotid
if (att_.find(xid) == att_.end()) {
throw DbException(std::to_string(xid) + " does not exist in att (in AppendInsertLog)");
}
auto log = std::make_shared<InsertLog>(NULL_LSN, xid, att_[xid], oid, page_id, slot_id, offset, size, new_record);
auto log = std::make_shared<InsertLog>(NULL_LSN, xid, att_.at(xid), oid, page_id, slot_id, offset, size, new_record);
lsn_t lsn = next_lsn_.fetch_add(log->GetSize(), std::memory_order_relaxed);
log->SetLSN(lsn);
att_[xid] = lsn;
Expand All @@ -50,7 +50,7 @@ lsn_t LogManager::AppendDeleteLog(xid_t xid, oid_t oid, pageid_t page_id, slotid
if (att_.find(xid) == att_.end()) {
throw DbException(std::to_string(xid) + " does not exist in att (in AppendDeleteLog)");
}
auto log = std::make_shared<DeleteLog>(NULL_LSN, xid, att_[xid], oid, page_id, slot_id);
auto log = std::make_shared<DeleteLog>(NULL_LSN, xid, att_.at(xid), oid, page_id, slot_id);
lsn_t lsn = next_lsn_.fetch_add(log->GetSize(), std::memory_order_relaxed);
log->SetLSN(lsn);
att_[xid] = lsn;
Expand All @@ -72,7 +72,7 @@ lsn_t LogManager::AppendNewPageLog(xid_t xid, oid_t oid, pageid_t prev_page_id,
if (xid == DDL_XID) {
log_xid = NULL_XID;
} else {
log_xid = att_[xid];
log_xid = att_.at(xid);
}
auto log = std::make_shared<NewPageLog>(NULL_LSN, xid, log_xid, oid, prev_page_id, page_id);
lsn_t lsn = next_lsn_.fetch_add(log->GetSize(), std::memory_order_relaxed);
Expand Down Expand Up @@ -113,7 +113,7 @@ lsn_t LogManager::AppendCommitLog(xid_t xid) {
if (att_.find(xid) == att_.end()) {
throw DbException(std::to_string(xid) + " does not exist in att (in AppendCommitLog)");
}
auto log = std::make_shared<CommitLog>(NULL_LSN, xid, att_[xid]);
auto log = std::make_shared<CommitLog>(NULL_LSN, xid, att_.at(xid));
lsn_t lsn = next_lsn_.fetch_add(log->GetSize(), std::memory_order_relaxed);
log->SetLSN(lsn);
{
Expand All @@ -129,7 +129,7 @@ lsn_t LogManager::AppendRollbackLog(xid_t xid) {
if (att_.find(xid) == att_.end()) {
throw DbException(std::to_string(xid) + " does not exist in att (in AppendRollbackLog)");
}
auto log = std::make_shared<RollbackLog>(NULL_LSN, xid, att_[xid]);
auto log = std::make_shared<RollbackLog>(NULL_LSN, xid, att_.at(xid));
lsn_t lsn = next_lsn_.fetch_add(log->GetSize(), std::memory_order_relaxed);
log->SetLSN(lsn);
{
Expand Down Expand Up @@ -246,6 +246,7 @@ void LogManager::Analyze() {
in >> checkpoint_lsn;
}
// 根据 Checkpoint 日志恢复脏页表、活跃事务表等元信息
// 必要时调用 transaction_manager_.SetNextXid 来恢复事务 id
// LAB 2 BEGIN
}

Expand Down
9 changes: 8 additions & 1 deletion src/storage/disk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,13 @@ void Disk::RemoveDirectory(const std::string &path) { std::filesystem::remove_al

bool Disk::FileExists(const std::string &path) { return std::filesystem::is_regular_file(path); }

bool Disk::EmptyFile(const std::string &path) {
if (!FileExists(path)) {
throw DbException("file " + path + " does not exist");
}
return std::filesystem::is_empty(path);
}

void Disk::CreateFile(const std::string &path) { std::ofstream ofs(path); }

void Disk::RemoveFile(const std::string &path) { std::filesystem::remove(path); }
Expand Down Expand Up @@ -76,7 +83,7 @@ void Disk::ReadPage(const std::string &path, pageid_t page_id, char *data) {
fs.seekg(page_id * DB_PAGE_SIZE);
fs.read(data, DB_PAGE_SIZE);
if (fs.gcount() != DB_PAGE_SIZE) {
throw DbException("read page failed: read " + std::to_string(fs.gcount()) + " bytes, expected " +
throw DbException(path + " read page failed: read " + std::to_string(fs.gcount()) + " bytes, expected " +
std::to_string(DB_PAGE_SIZE) + " bytes");
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/storage/disk.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class Disk {
static void RemoveDirectory(const std::string &path);

static bool FileExists(const std::string &path);
static bool EmptyFile(const std::string &path);

static void CreateFile(const std::string &path);
static void RemoveFile(const std::string &path);

Expand Down
14 changes: 5 additions & 9 deletions src/table/table.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,18 @@
namespace huadb {

Table::Table(BufferPool &buffer_pool, LogManager &log_manager, oid_t oid, oid_t db_oid, ColumnList column_list,
bool new_table)
bool new_table, bool is_empty)
: buffer_pool_(buffer_pool),
log_manager_(log_manager),
oid_(oid),
db_oid_(db_oid),
column_list_(std::move(column_list)) {
// 新建表时初始化第一个页面
if (new_table) {
auto table_page = std::make_unique<TablePage>(buffer_pool_.NewPage(db_oid_, oid_, 0));
table_page->Init();
if (oid >= PRESERVED_OID) {
lsn_t lsn = log_manager_.AppendNewPageLog(DDL_XID, oid_, NULL_PAGE_ID, 0);
table_page->SetPageLSN(lsn);
}
if (new_table || is_empty) {
first_page_id_ = NULL_PAGE_ID;
} else {
first_page_id_ = 0;
}
first_page_id_ = 0;
}

Rid Table::InsertRecord(std::shared_ptr<Record> record, xid_t xid, cid_t cid, bool write_log) {
Expand Down
2 changes: 1 addition & 1 deletion src/table/table.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace huadb {
class Table {
public:
Table(BufferPool &buffer_pool, LogManager &log_manager, oid_t oid, oid_t db_oid, ColumnList column_list,
bool new_table);
bool new_table, bool is_empty);

// 插入记录,返回插入记录的 rid
// write_log: 是否写日志。系统表操作不写日志,用户表操作写日志,lab 2 相关参数
Expand Down

0 comments on commit 094cac7

Please sign in to comment.