Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 4d61826

Browse files
authored
Merge pull request #1383 from ksaito7/catalog_update
Catalog updates for checkpoints
2 parents e53e5b4 + 05e042c commit 4d61826

28 files changed

+390
-149
lines changed

src/catalog/catalog.cpp

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -169,22 +169,22 @@ void Catalog::BootstrapSystemCatalogs(storage::Database *database,
169169
// pg_database record is shared across different databases
170170
system_catalogs->GetTableCatalog()->InsertTable(
171171
DATABASE_CATALOG_OID, DATABASE_CATALOG_NAME, CATALOG_SCHEMA_NAME,
172-
CATALOG_DATABASE_OID, pool_.get(), txn);
172+
CATALOG_DATABASE_OID, ROW_STORE_LAYOUT_OID, pool_.get(), txn);
173173
system_catalogs->GetTableCatalog()->InsertTable(
174174
SCHEMA_CATALOG_OID, SCHEMA_CATALOG_NAME, CATALOG_SCHEMA_NAME,
175-
database_oid, pool_.get(), txn);
175+
database_oid, ROW_STORE_LAYOUT_OID, pool_.get(), txn);
176176
system_catalogs->GetTableCatalog()->InsertTable(
177177
TABLE_CATALOG_OID, TABLE_CATALOG_NAME, CATALOG_SCHEMA_NAME, database_oid,
178-
pool_.get(), txn);
178+
ROW_STORE_LAYOUT_OID, pool_.get(), txn);
179179
system_catalogs->GetTableCatalog()->InsertTable(
180180
INDEX_CATALOG_OID, INDEX_CATALOG_NAME, CATALOG_SCHEMA_NAME, database_oid,
181-
pool_.get(), txn);
181+
ROW_STORE_LAYOUT_OID, pool_.get(), txn);
182182
system_catalogs->GetTableCatalog()->InsertTable(
183183
COLUMN_CATALOG_OID, COLUMN_CATALOG_NAME, CATALOG_SCHEMA_NAME,
184-
database_oid, pool_.get(), txn);
184+
database_oid, ROW_STORE_LAYOUT_OID, pool_.get(), txn);
185185
system_catalogs->GetTableCatalog()->InsertTable(
186186
LAYOUT_CATALOG_OID, LAYOUT_CATALOG_NAME, CATALOG_SCHEMA_NAME,
187-
database_oid, pool_.get(), txn);
187+
database_oid, ROW_STORE_LAYOUT_OID, pool_.get(), txn);
188188
}
189189

190190
void Catalog::Bootstrap() {
@@ -208,6 +208,12 @@ void Catalog::Bootstrap() {
208208

209209
InitializeLanguages();
210210
InitializeFunctions();
211+
212+
// Reset oid of each catalog to avoid collisions between catalog
213+
// values added by system and users when checkpoint recovery.
214+
DatabaseCatalog::GetInstance()->UpdateOid(OID_FOR_USER_OFFSET);
215+
LanguageCatalog::GetInstance().UpdateOid(OID_FOR_USER_OFFSET);
216+
ProcCatalog::GetInstance().UpdateOid(OID_FOR_USER_OFFSET);
211217
}
212218

213219
//===----------------------------------------------------------------------===//
@@ -362,13 +368,14 @@ ResultType Catalog::CreateTable(const std::string &database_name,
362368

363369
// Update pg_table with table info
364370
pg_table->InsertTable(table_oid, table_name, schema_name,
365-
database_object->GetDatabaseOid(), pool_.get(), txn);
371+
database_object->GetDatabaseOid(),
372+
table->GetDefaultLayout()->GetOid(), pool_.get(), txn);
366373
oid_t column_id = 0;
367374
for (const auto &column : table->GetSchema()->GetColumns()) {
368375
pg_attribute->InsertColumn(table_oid, column.GetName(), column_id,
369376
column.GetOffset(), column.GetType(),
370-
column.IsInlined(), column.GetConstraints(),
371-
pool_.get(), txn);
377+
column.GetLength(), column.IsInlined(),
378+
column.GetConstraints(), pool_.get(), txn);
372379

373380
// Create index on unique single column
374381
if (column.IsUnique()) {
@@ -383,6 +390,15 @@ ResultType Catalog::CreateTable(const std::string &database_name,
383390
}
384391
CreatePrimaryIndex(database_object->GetDatabaseOid(), table_oid, schema_name,
385392
txn);
393+
394+
// Create layout as default layout
395+
auto pg_layout =
396+
catalog_map_[database_object->GetDatabaseOid()]->GetLayoutCatalog();
397+
auto default_layout = table->GetDefaultLayout();
398+
if (!pg_layout->InsertLayout(table_oid, default_layout, pool_.get(), txn))
399+
throw CatalogException("Failed to create a new layout for table "
400+
+ table_name);
401+
386402
return ResultType::SUCCESS;
387403
}
388404

@@ -573,15 +589,15 @@ std::shared_ptr<const storage::Layout> Catalog::CreateLayout(
573589
// Ensure that the new layout
574590
PELOTON_ASSERT(layout_oid < INVALID_OID);
575591
auto new_layout = std::shared_ptr<const storage::Layout>(
576-
new const storage::Layout(column_map, layout_oid));
592+
new const storage::Layout(column_map, column_map.size(), layout_oid));
577593

578594
// Add the layout the pg_layout table
579595
auto pg_layout = catalog_map_[database_oid]->GetLayoutCatalog();
580-
bool result =
581-
pg_layout->InsertLayout(table_oid, new_layout, pool_.get(), txn);
582-
if (!result) {
583-
LOG_ERROR("Failed to create a new layout for table %u", table_oid);
584-
return nullptr;
596+
if (pg_layout->GetLayoutWithOid(table_oid, new_layout->GetOid(), txn)
597+
== nullptr &&
598+
!pg_layout->InsertLayout(table_oid, new_layout, pool_.get(), txn)) {
599+
LOG_ERROR("Failed to create a new layout for table %u", table_oid);
600+
return nullptr;
585601
}
586602
return new_layout;
587603
}
@@ -596,6 +612,10 @@ std::shared_ptr<const storage::Layout> Catalog::CreateDefaultLayout(
596612
auto database = storage_manager->GetDatabaseWithOid(database_oid);
597613
auto table = database->GetTableWithOid(table_oid);
598614
table->SetDefaultLayout(new_layout);
615+
616+
// update table catalog
617+
catalog_map_[database_oid]->GetTableCatalog()
618+
->UpdateDefaultLayoutOid(new_layout->GetOid(), table_oid, txn);
599619
}
600620
return new_layout;
601621
}
@@ -791,7 +811,7 @@ ResultType Catalog::DropIndex(oid_t database_oid, oid_t index_oid,
791811
// find index catalog object by looking up pg_index or read from cache using
792812
// index_oid
793813
auto pg_index = catalog_map_[database_oid]->GetIndexCatalog();
794-
auto index_object = pg_index->GetIndexObject(index_oid, txn);
814+
auto index_object = pg_index->GetIndexObject(database_oid, index_oid, txn);
795815
if (index_object == nullptr) {
796816
throw CatalogException("Can't find index " + std::to_string(index_oid) +
797817
" to drop");
@@ -801,7 +821,7 @@ ResultType Catalog::DropIndex(oid_t database_oid, oid_t index_oid,
801821
auto table = storage_manager->GetTableWithOid(database_oid,
802822
index_object->GetTableOid());
803823
// drop record in pg_index
804-
pg_index->DeleteIndex(index_oid, txn);
824+
pg_index->DeleteIndex(database_oid, index_oid, txn);
805825
LOG_TRACE("Successfully drop index %d for table %s", index_oid,
806826
table->GetName().c_str());
807827

@@ -822,17 +842,29 @@ ResultType Catalog::DropLayout(oid_t database_oid, oid_t table_oid,
822842
auto table = database->GetTableWithOid(table_oid);
823843
auto default_layout = table->GetDefaultLayout();
824844

825-
if (default_layout.GetOid() == layout_oid) {
826-
table->ResetDefaultLayout();
827-
}
828-
829845
auto pg_layout = catalog_map_[database_oid]->GetLayoutCatalog();
830846
if (!pg_layout->DeleteLayout(table_oid, layout_oid, txn)) {
831847
auto layout = table->GetDefaultLayout();
832-
LOG_DEBUG("Layout delete failed. Default layout id: %u", layout.GetOid());
848+
LOG_DEBUG("Layout delete failed. Default layout id: %u", layout->GetOid());
833849
return ResultType::FAILURE;
834850
}
835851

852+
if (default_layout->GetOid() == layout_oid) {
853+
table->ResetDefaultLayout();
854+
auto new_default_layout = table->GetDefaultLayout();
855+
if (pg_layout->GetLayoutWithOid(table_oid, new_default_layout->GetOid(),
856+
txn) == nullptr &&
857+
!pg_layout->InsertLayout(table_oid, new_default_layout,
858+
pool_.get(), txn)) {
859+
LOG_DEBUG("Failed to create a new layout for table %d", table_oid);
860+
return ResultType::FAILURE;
861+
}
862+
863+
// update table catalog
864+
catalog_map_[database_oid]->GetTableCatalog()
865+
->UpdateDefaultLayoutOid(new_default_layout->GetOid(), table_oid, txn);
866+
}
867+
836868
return ResultType::SUCCESS;
837869
}
838870

src/catalog/catalog_cache.cpp

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,11 @@ std::shared_ptr<DatabaseCatalogObject> CatalogCache::GetDatabaseObject(
116116
* @return table catalog object; if not found return null
117117
*/
118118
std::shared_ptr<TableCatalogObject> CatalogCache::GetCachedTableObject(
119-
oid_t table_oid) {
120-
for (auto it = database_objects_cache.begin();
121-
it != database_objects_cache.end(); ++it) {
122-
auto database_object = it->second;
123-
auto table_object = database_object->GetTableObject(table_oid, true);
124-
if (table_object) return table_object;
125-
}
119+
oid_t database_oid, oid_t table_oid) {
120+
auto database_object = GetDatabaseObject(database_oid);
121+
if (database_object == nullptr) return nullptr;
122+
auto table_object = database_object->GetTableObject(table_oid, true);
123+
if (table_object) return table_object;
126124
return nullptr;
127125
}
128126

@@ -131,13 +129,11 @@ std::shared_ptr<TableCatalogObject> CatalogCache::GetCachedTableObject(
131129
* @return index catalog object; if not found return null
132130
*/
133131
std::shared_ptr<IndexCatalogObject> CatalogCache::GetCachedIndexObject(
134-
oid_t index_oid) {
135-
for (auto it = database_objects_cache.begin();
136-
it != database_objects_cache.end(); ++it) {
137-
auto database_object = it->second;
138-
auto index_object = database_object->GetCachedIndexObject(index_oid);
139-
if (index_object) return index_object;
140-
}
132+
oid_t database_oid, oid_t index_oid) {
133+
auto database_object = GetDatabaseObject(database_oid);
134+
if (database_object == nullptr) return nullptr;
135+
auto index_object = database_object->GetCachedIndexObject(index_oid);
136+
if (index_object) return index_object;
141137
return nullptr;
142138
}
143139

@@ -146,14 +142,13 @@ std::shared_ptr<IndexCatalogObject> CatalogCache::GetCachedIndexObject(
146142
* @return index catalog object; if not found return null
147143
*/
148144
std::shared_ptr<IndexCatalogObject> CatalogCache::GetCachedIndexObject(
149-
const std::string &index_name, const std::string &schema_name) {
150-
for (auto it = database_objects_cache.begin();
151-
it != database_objects_cache.end(); ++it) {
152-
auto database_object = it->second;
153-
auto index_object =
154-
database_object->GetCachedIndexObject(index_name, schema_name);
155-
if (index_object) return index_object;
156-
}
145+
const std::string &database_name, const std::string &index_name,
146+
const std::string &schema_name) {
147+
auto database_object = GetDatabaseObject(database_name);
148+
if (database_object == nullptr) return nullptr;
149+
auto index_object =
150+
database_object->GetCachedIndexObject(index_name, schema_name);
151+
if (index_object) return index_object;
157152
return nullptr;
158153
}
159154

src/catalog/column_catalog.cpp

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,16 @@ ColumnCatalogObject::ColumnCatalogObject(executor::LogicalTile *tile,
3030
column_name(tile->GetValue(tupleId, ColumnCatalog::ColumnId::COLUMN_NAME)
3131
.ToString()),
3232
column_id(tile->GetValue(tupleId, ColumnCatalog::ColumnId::COLUMN_ID)
33-
.GetAs<uint32_t>()),
33+
.GetAs<oid_t>()),
3434
column_offset(
3535
tile->GetValue(tupleId, ColumnCatalog::ColumnId::COLUMN_OFFSET)
36-
.GetAs<uint32_t>()),
36+
.GetAs<oid_t>()),
3737
column_type(StringToTypeId(
3838
tile->GetValue(tupleId, ColumnCatalog::ColumnId::COLUMN_TYPE)
3939
.ToString())),
40+
column_length(
41+
tile->GetValue(tupleId, ColumnCatalog::ColumnId::COLUMN_LENGTH)
42+
.GetAs<uint32_t>()),
4043
is_inlined(tile->GetValue(tupleId, ColumnCatalog::ColumnId::IS_INLINED)
4144
.GetAs<bool>()),
4245
is_primary(tile->GetValue(tupleId, ColumnCatalog::ColumnId::IS_PRIMARY)
@@ -62,8 +65,8 @@ ColumnCatalog::ColumnCatalog(storage::Database *pg_catalog,
6265
uint32_t column_id = 0;
6366
for (auto column : catalog_table_->GetSchema()->GetColumns()) {
6467
InsertColumn(COLUMN_CATALOG_OID, column.GetName(), column_id,
65-
column.GetOffset(), column.GetType(), column.IsInlined(),
66-
column.GetConstraints(), pool, txn);
68+
column.GetOffset(), column.GetType(), column.GetLength(),
69+
column.IsInlined(), column.GetConstraints(), pool, txn);
6770
column_id++;
6871
}
6972
}
@@ -109,6 +112,12 @@ std::unique_ptr<catalog::Schema> ColumnCatalog::InitializeSchema() {
109112
column_type_column.AddConstraint(
110113
catalog::Constraint(ConstraintType::NOTNULL, not_null_constraint_name));
111114

115+
auto column_length_column = catalog::Column(
116+
type::TypeId::INTEGER, type::Type::GetTypeSize(type::TypeId::INTEGER),
117+
"column_length", true);
118+
column_length_column.AddConstraint(
119+
catalog::Constraint(ConstraintType::NOTNULL, not_null_constraint_name));
120+
112121
auto is_inlined_column = catalog::Column(
113122
type::TypeId::BOOLEAN, type::Type::GetTypeSize(type::TypeId::BOOLEAN),
114123
"is_inlined", true);
@@ -129,16 +138,17 @@ std::unique_ptr<catalog::Schema> ColumnCatalog::InitializeSchema() {
129138

130139
std::unique_ptr<catalog::Schema> column_catalog_schema(new catalog::Schema(
131140
{table_id_column, column_name_column, column_id_column,
132-
column_offset_column, column_type_column, is_inlined_column,
133-
is_primary_column, is_not_null_column}));
141+
column_offset_column, column_type_column, column_length_column,
142+
is_inlined_column, is_primary_column, is_not_null_column}));
134143

135144
return column_catalog_schema;
136145
}
137146

138147
bool ColumnCatalog::InsertColumn(oid_t table_oid,
139148
const std::string &column_name,
140149
oid_t column_id, oid_t column_offset,
141-
type::TypeId column_type, bool is_inlined,
150+
type::TypeId column_type, size_t column_length,
151+
bool is_inlined,
142152
const std::vector<Constraint> &constraints,
143153
type::AbstractPool *pool,
144154
concurrency::TransactionContext *txn) {
@@ -152,7 +162,8 @@ bool ColumnCatalog::InsertColumn(oid_t table_oid,
152162
auto val3 = type::ValueFactory::GetIntegerValue(column_offset);
153163
auto val4 =
154164
type::ValueFactory::GetVarcharValue(TypeIdToString(column_type), nullptr);
155-
auto val5 = type::ValueFactory::GetBooleanValue(is_inlined);
165+
auto val5 = type::ValueFactory::GetIntegerValue(column_length);
166+
auto val6 = type::ValueFactory::GetBooleanValue(is_inlined);
156167
bool is_primary = false, is_not_null = false;
157168
for (auto constraint : constraints) {
158169
if (constraint.GetType() == ConstraintType::PRIMARY) {
@@ -162,17 +173,18 @@ bool ColumnCatalog::InsertColumn(oid_t table_oid,
162173
is_not_null = true;
163174
}
164175
}
165-
auto val6 = type::ValueFactory::GetBooleanValue(is_primary);
166-
auto val7 = type::ValueFactory::GetBooleanValue(is_not_null);
176+
auto val7 = type::ValueFactory::GetBooleanValue(is_primary);
177+
auto val8 = type::ValueFactory::GetBooleanValue(is_not_null);
167178

168179
tuple->SetValue(ColumnId::TABLE_OID, val0, pool);
169180
tuple->SetValue(ColumnId::COLUMN_NAME, val1, pool);
170181
tuple->SetValue(ColumnId::COLUMN_ID, val2, pool);
171182
tuple->SetValue(ColumnId::COLUMN_OFFSET, val3, pool);
172183
tuple->SetValue(ColumnId::COLUMN_TYPE, val4, pool);
173-
tuple->SetValue(ColumnId::IS_INLINED, val5, pool);
174-
tuple->SetValue(ColumnId::IS_PRIMARY, val6, pool);
175-
tuple->SetValue(ColumnId::IS_NOT_NULL, val7, pool);
184+
tuple->SetValue(ColumnId::COLUMN_LENGTH, val5, pool);
185+
tuple->SetValue(ColumnId::IS_INLINED, val6, pool);
186+
tuple->SetValue(ColumnId::IS_PRIMARY, val7, pool);
187+
tuple->SetValue(ColumnId::IS_NOT_NULL, val8, pool);
176188

177189
// Insert the tuple
178190
return InsertTuple(std::move(tuple), txn);

src/catalog/index_catalog.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -167,29 +167,32 @@ bool IndexCatalog::InsertIndex(oid_t index_oid, const std::string &index_name,
167167
return InsertTuple(std::move(tuple), txn);
168168
}
169169

170-
bool IndexCatalog::DeleteIndex(oid_t index_oid,
170+
bool IndexCatalog::DeleteIndex(oid_t database_oid, oid_t index_oid,
171171
concurrency::TransactionContext *txn) {
172172
oid_t index_offset = IndexId::PRIMARY_KEY; // Index of index_oid
173173
std::vector<type::Value> values;
174174
values.push_back(type::ValueFactory::GetIntegerValue(index_oid).Copy());
175175

176-
auto index_object = txn->catalog_cache.GetCachedIndexObject(index_oid);
176+
auto index_object = txn->catalog_cache.GetCachedIndexObject(database_oid,
177+
index_oid);
177178
if (index_object) {
178179
auto table_object =
179-
txn->catalog_cache.GetCachedTableObject(index_object->GetTableOid());
180+
txn->catalog_cache.GetCachedTableObject(database_oid,
181+
index_object->GetTableOid());
180182
table_object->EvictAllIndexObjects();
181183
}
182184

183185
return DeleteWithIndexScan(index_offset, values, txn);
184186
}
185187

186188
std::shared_ptr<IndexCatalogObject> IndexCatalog::GetIndexObject(
187-
oid_t index_oid, concurrency::TransactionContext *txn) {
189+
oid_t database_oid, oid_t index_oid, concurrency::TransactionContext *txn) {
188190
if (txn == nullptr) {
189191
throw CatalogException("Transaction is invalid!");
190192
}
191193
// try get from cache
192-
auto index_object = txn->catalog_cache.GetCachedIndexObject(index_oid);
194+
auto index_object = txn->catalog_cache.GetCachedIndexObject(database_oid,
195+
index_oid);
193196
if (index_object) {
194197
return index_object;
195198
}
@@ -224,14 +227,15 @@ std::shared_ptr<IndexCatalogObject> IndexCatalog::GetIndexObject(
224227
}
225228

226229
std::shared_ptr<IndexCatalogObject> IndexCatalog::GetIndexObject(
227-
const std::string &index_name, const std::string &schema_name,
228-
concurrency::TransactionContext *txn) {
230+
const std::string &database_name, const std::string &index_name,
231+
const std::string &schema_name, concurrency::TransactionContext *txn) {
229232
if (txn == nullptr) {
230233
throw CatalogException("Transaction is invalid!");
231234
}
232235
// try get from cache
233236
auto index_object =
234-
txn->catalog_cache.GetCachedIndexObject(index_name, schema_name);
237+
txn->catalog_cache.GetCachedIndexObject(database_name, index_name,
238+
schema_name);
235239
if (index_object) {
236240
return index_object;
237241
}

0 commit comments

Comments
 (0)