Skip to content

Commit 795a5d6

Browse files
committed
refactor: optimize with shared_lock/unique_lock for InMemoryCatalog
1 parent 428a171 commit 795a5d6

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

src/iceberg/catalog/memory/in_memory_catalog.cc

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -337,42 +337,42 @@ std::string_view InMemoryCatalog::name() const { return catalog_name_; }
337337

338338
Status InMemoryCatalog::CreateNamespace(
339339
const Namespace& ns, const std::unordered_map<std::string, std::string>& properties) {
340-
std::lock_guard guard(mutex_);
340+
std::unique_lock lock(mutex_);
341341
return root_namespace_->CreateNamespace(ns, properties);
342342
}
343343

344344
Result<std::unordered_map<std::string, std::string>>
345345
InMemoryCatalog::GetNamespaceProperties(const Namespace& ns) const {
346-
std::lock_guard guard(mutex_);
346+
std::shared_lock lock(mutex_);
347347
return root_namespace_->GetProperties(ns);
348348
}
349349

350350
Result<std::vector<Namespace>> InMemoryCatalog::ListNamespaces(
351351
const Namespace& ns) const {
352-
std::lock_guard guard(mutex_);
352+
std::shared_lock lock(mutex_);
353353
return root_namespace_->ListNamespaces(ns);
354354
}
355355

356356
Status InMemoryCatalog::DropNamespace(const Namespace& ns) {
357-
std::lock_guard guard(mutex_);
357+
std::unique_lock lock(mutex_);
358358
return root_namespace_->DropNamespace(ns);
359359
}
360360

361361
Result<bool> InMemoryCatalog::NamespaceExists(const Namespace& ns) const {
362-
std::lock_guard guard(mutex_);
362+
std::shared_lock lock(mutex_);
363363
return root_namespace_->NamespaceExists(ns);
364364
}
365365

366366
Status InMemoryCatalog::UpdateNamespaceProperties(
367367
const Namespace& ns, const std::unordered_map<std::string, std::string>& updates,
368368
const std::unordered_set<std::string>& removals) {
369-
std::lock_guard guard(mutex_);
369+
std::unique_lock lock(mutex_);
370370
return root_namespace_->UpdateNamespaceProperties(ns, updates, removals);
371371
}
372372

373373
Result<std::vector<TableIdentifier>> InMemoryCatalog::ListTables(
374374
const Namespace& ns) const {
375-
std::lock_guard guard(mutex_);
375+
std::shared_lock lock(mutex_);
376376
const auto& table_names = root_namespace_->ListTables(ns);
377377
ICEBERG_RETURN_UNEXPECTED(table_names);
378378
std::vector<TableIdentifier> table_idents;
@@ -387,36 +387,40 @@ Result<std::unique_ptr<Table>> InMemoryCatalog::CreateTable(
387387
const TableIdentifier& identifier, const Schema& schema, const PartitionSpec& spec,
388388
const std::string& location,
389389
const std::unordered_map<std::string, std::string>& properties) {
390+
std::unique_lock lock(mutex_);
390391
return NotImplemented("create table");
391392
}
392393

393394
Result<std::unique_ptr<Table>> InMemoryCatalog::UpdateTable(
394395
const TableIdentifier& identifier,
395396
const std::vector<std::unique_ptr<TableRequirement>>& requirements,
396397
const std::vector<std::unique_ptr<TableUpdate>>& updates) {
398+
std::unique_lock lock(mutex_);
397399
return NotImplemented("update table");
398400
}
399401

400402
Result<std::shared_ptr<Transaction>> InMemoryCatalog::StageCreateTable(
401403
const TableIdentifier& identifier, const Schema& schema, const PartitionSpec& spec,
402404
const std::string& location,
403405
const std::unordered_map<std::string, std::string>& properties) {
406+
std::unique_lock lock(mutex_);
404407
return NotImplemented("stage create table");
405408
}
406409

407410
Result<bool> InMemoryCatalog::TableExists(const TableIdentifier& identifier) const {
408-
std::lock_guard guard(mutex_);
411+
std::shared_lock lock(mutex_);
409412
return root_namespace_->TableExists(identifier);
410413
}
411414

412415
Status InMemoryCatalog::DropTable(const TableIdentifier& identifier, bool purge) {
413-
std::lock_guard guard(mutex_);
416+
std::unique_lock lock(mutex_);
414417
// TODO(Guotao): Delete all metadata files if purge is true.
415418
return root_namespace_->UnregisterTable(identifier);
416419
}
417420

418421
Status InMemoryCatalog::RenameTable(const TableIdentifier& from,
419422
const TableIdentifier& to) {
423+
std::unique_lock lock(mutex_);
420424
return NotImplemented("rename table");
421425
}
422426

@@ -428,7 +432,7 @@ Result<std::unique_ptr<Table>> InMemoryCatalog::LoadTable(
428432

429433
Result<std::string> metadata_location;
430434
{
431-
std::lock_guard guard(mutex_);
435+
std::shared_lock lock(mutex_);
432436
ICEBERG_ASSIGN_OR_RAISE(metadata_location,
433437
root_namespace_->GetTableMetadataLocation(identifier));
434438
}
@@ -443,7 +447,7 @@ Result<std::unique_ptr<Table>> InMemoryCatalog::LoadTable(
443447

444448
Result<std::shared_ptr<Table>> InMemoryCatalog::RegisterTable(
445449
const TableIdentifier& identifier, const std::string& metadata_file_location) {
446-
std::lock_guard guard(mutex_);
450+
std::unique_lock lock(mutex_);
447451
if (!root_namespace_->NamespaceExists(identifier.ns)) {
448452
return NoSuchNamespace("table namespace does not exist.");
449453
}

src/iceberg/catalog/memory/in_memory_catalog.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
#pragma once
2121

22-
#include <mutex>
22+
#include <shared_mutex>
2323

2424
#include "iceberg/catalog.h"
2525

@@ -103,7 +103,7 @@ class ICEBERG_EXPORT InMemoryCatalog
103103
std::shared_ptr<FileIO> file_io_;
104104
std::string warehouse_location_;
105105
std::unique_ptr<class InMemoryNamespace> root_namespace_;
106-
mutable std::recursive_mutex mutex_;
106+
mutable std::shared_mutex mutex_;
107107
};
108108

109109
} // namespace iceberg

0 commit comments

Comments
 (0)