Truncate with metadata

This commit is contained in:
alesapin 2020-06-18 13:29:13 +03:00
parent 35ce47951d
commit aab4ce6394
24 changed files with 44 additions and 31 deletions

View File

@ -105,8 +105,9 @@ BlockIO InterpreterDropQuery::executeToTable(
table->checkTableCanBeDropped(); table->checkTableCanBeDropped();
auto table_lock = table->lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout); auto table_lock = table->lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout);
auto metadata_snapshot = table->getInMemoryMetadataPtr();
/// Drop table data, don't touch metadata /// Drop table data, don't touch metadata
table->truncate(query_ptr, context, table_lock); table->truncate(query_ptr, metadata_snapshot, context, table_lock);
} }
else if (query.kind == ASTDropQuery::Kind::Drop) else if (query.kind == ASTDropQuery::Kind::Drop)
{ {
@ -187,7 +188,8 @@ BlockIO InterpreterDropQuery::executeToTemporaryTable(const String & table_name,
{ {
auto table_lock = table->lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout); auto table_lock = table->lockExclusively(context.getCurrentQueryId(), context.getSettingsRef().lock_acquire_timeout);
/// Drop table data, don't touch metadata /// Drop table data, don't touch metadata
table->truncate(query_ptr, context, table_lock); auto metadata_snapshot = table->getInMemoryMetadataPtr();
table->truncate(query_ptr, metadata_snapshot, context, table_lock);
} }
else if (kind == ASTDropQuery::Kind::Drop) else if (kind == ASTDropQuery::Kind::Drop)
{ {

View File

@ -292,7 +292,11 @@ public:
/** Clear the table data and leave it empty. /** Clear the table data and leave it empty.
* Must be called under lockForAlter. * Must be called under lockForAlter.
*/ */
virtual void truncate(const ASTPtr & /*query*/, const Context & /* context */, TableStructureWriteLockHolder &) virtual void truncate(
const ASTPtr & /*query*/,
const StorageMetadataPtr & /* metadata_snapshot */,
const Context & /* context */,
TableStructureWriteLockHolder &)
{ {
throw Exception("Truncate is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED); throw Exception("Truncate is not supported by storage " + getName(), ErrorCodes::NOT_IMPLEMENTED);
} }

View File

@ -619,7 +619,7 @@ Strings StorageDistributed::getDataPaths() const
return paths; return paths;
} }
void StorageDistributed::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageDistributed::truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &)
{ {
std::lock_guard lock(cluster_nodes_mutex); std::lock_guard lock(cluster_nodes_mutex);

View File

@ -82,7 +82,7 @@ public:
BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, const Context & context) override; BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, const Context & context) override;
/// Removes temporary data in local filesystem. /// Removes temporary data in local filesystem.
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &) override;
void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override;
void renameOnDisk(const String & new_path_to_table_data); void renameOnDisk(const String & new_path_to_table_data);

View File

@ -523,7 +523,11 @@ void StorageFile::rename(const String & new_path_to_table_data, const StorageID
renameInMemory(new_table_id); renameInMemory(new_table_id);
} }
void StorageFile::truncate(const ASTPtr & /*query*/, const Context & /* context */, TableStructureWriteLockHolder &) void StorageFile::truncate(
const ASTPtr & /*query*/,
const StorageMetadataPtr & /* metadata_snapshot */,
const Context & /* context */,
TableStructureWriteLockHolder &)
{ {
if (paths.size() != 1) if (paths.size() != 1)
throw Exception("Can't truncate table '" + getStorageID().getNameForLogs() + "' in readonly mode", ErrorCodes::DATABASE_ACCESS_DENIED); throw Exception("Can't truncate table '" + getStorageID().getNameForLogs() + "' in readonly mode", ErrorCodes::DATABASE_ACCESS_DENIED);

View File

@ -38,7 +38,11 @@ public:
const StorageMetadataPtr & /*metadata_snapshot*/, const StorageMetadataPtr & /*metadata_snapshot*/,
const Context & context) override; const Context & context) override;
void truncate(const ASTPtr & /*query*/, const Context & /* context */, TableStructureWriteLockHolder &) override; void truncate(
const ASTPtr & /*query*/,
const StorageMetadataPtr & /* metadata_snapshot */,
const Context & /* context */,
TableStructureWriteLockHolder &) override;
void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override;

View File

@ -64,10 +64,9 @@ StorageJoin::StorageJoin(
} }
void StorageJoin::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageJoin::truncate(
const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &)
{ {
/// TODO(alesap) FIXME
auto metadata_snapshot = getInMemoryMetadataPtr();
Poco::File(path).remove(true); Poco::File(path).remove(true);
Poco::File(path).createDirectories(); Poco::File(path).createDirectories();
Poco::File(path + "tmp/").createDirectories(); Poco::File(path + "tmp/").createDirectories();

View File

@ -27,7 +27,7 @@ class StorageJoin final : public ext::shared_ptr_helper<StorageJoin>, public Sto
public: public:
String getName() const override { return "Join"; } String getName() const override { return "Join"; }
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &) override;
/// Access the innards. /// Access the innards.
HashJoinPtr & getJoin() { return join; } HashJoinPtr & getJoin() { return join; }

View File

@ -535,11 +535,10 @@ void StorageLog::rename(const String & new_path_to_table_data, const StorageID &
renameInMemory(new_table_id); renameInMemory(new_table_id);
} }
void StorageLog::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageLog::truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &)
{ {
std::shared_lock<std::shared_mutex> lock(rwlock); std::shared_lock<std::shared_mutex> lock(rwlock);
auto metadata_snapshot = getInMemoryMetadataPtr();
files.clear(); files.clear();
file_count = 0; file_count = 0;
loaded_marks = false; loaded_marks = false;

View File

@ -39,7 +39,7 @@ public:
CheckResults checkData(const ASTPtr & /* query */, const Context & /* context */) override; CheckResults checkData(const ASTPtr & /* query */, const Context & /* context */) override;
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &) override;
Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; } Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; }

View File

@ -173,7 +173,7 @@ void StorageMaterializedView::drop()
executeDropQuery(ASTDropQuery::Kind::Drop, global_context, target_table_id); executeDropQuery(ASTDropQuery::Kind::Drop, global_context, target_table_id);
} }
void StorageMaterializedView::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageMaterializedView::truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &)
{ {
if (has_inner_table) if (has_inner_table)
executeDropQuery(ASTDropQuery::Kind::Truncate, global_context, target_table_id); executeDropQuery(ASTDropQuery::Kind::Truncate, global_context, target_table_id);

View File

@ -37,7 +37,7 @@ public:
void drop() override; void drop() override;
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &) override;
bool optimize( bool optimize(
const ASTPtr & query, const ASTPtr & query,

View File

@ -148,7 +148,8 @@ void StorageMemory::drop()
data.clear(); data.clear();
} }
void StorageMemory::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageMemory::truncate(
const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &)
{ {
std::lock_guard lock(mutex); std::lock_guard lock(mutex);
data.clear(); data.clear();

View File

@ -37,11 +37,11 @@ public:
size_t max_block_size, size_t max_block_size,
unsigned num_streams) override; unsigned num_streams) override;
BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & /*metadata_snapshot*/, const Context & context) override; BlockOutputStreamPtr write(const ASTPtr & query, const StorageMetadataPtr & metadata_snapshot, const Context & context) override;
void drop() override; void drop() override;
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &) override;
std::optional<UInt64> totalRows() const override; std::optional<UInt64> totalRows() const override;
std::optional<UInt64> totalBytes() const override; std::optional<UInt64> totalBytes() const override;

View File

@ -231,7 +231,7 @@ void StorageMergeTree::drop()
dropAllData(); dropAllData();
} }
void StorageMergeTree::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageMergeTree::truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &)
{ {
{ {
/// Asks to complete merges and does not allow them to start. /// Asks to complete merges and does not allow them to start.

View File

@ -75,7 +75,7 @@ public:
CancellationCode killMutation(const String & mutation_id) override; CancellationCode killMutation(const String & mutation_id) override;
void drop() override; void drop() override;
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &) override;
void alter(const AlterCommands & commands, const Context & context, TableStructureWriteLockHolder & table_lock_holder) override; void alter(const AlterCommands & commands, const Context & context, TableStructureWriteLockHolder & table_lock_holder) override;

View File

@ -4011,7 +4011,8 @@ void StorageReplicatedMergeTree::dropPartition(const ASTPtr & query, const ASTPt
} }
void StorageReplicatedMergeTree::truncate(const ASTPtr & query, const Context & query_context, TableStructureWriteLockHolder & table_lock) void StorageReplicatedMergeTree::truncate(
const ASTPtr & query, const StorageMetadataPtr &, const Context & query_context, TableStructureWriteLockHolder & table_lock)
{ {
table_lock.release(); /// Truncate is done asynchronously. table_lock.release(); /// Truncate is done asynchronously.

View File

@ -120,7 +120,7 @@ public:
*/ */
void drop() override; void drop() override;
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &) override;
void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override; void rename(const String & new_path_to_table_data, const StorageID & new_table_id) override;

View File

@ -142,9 +142,8 @@ void StorageSet::finishInsert() { set->finishInsert(); }
size_t StorageSet::getSize() const { return set->getTotalRowCount(); } size_t StorageSet::getSize() const { return set->getTotalRowCount(); }
void StorageSet::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageSet::truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &)
{ {
auto metadata_snapshot = getInMemoryMetadataPtr();
Poco::File(path).remove(true); Poco::File(path).remove(true);
Poco::File(path).createDirectories(); Poco::File(path).createDirectories();
Poco::File(path + "tmp/").createDirectories(); Poco::File(path + "tmp/").createDirectories();

View File

@ -67,7 +67,7 @@ public:
/// Access the insides. /// Access the insides.
SetPtr & getSet() { return set; } SetPtr & getSet() { return set; }
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &) override;
private: private:
SetPtr set; SetPtr set;

View File

@ -326,7 +326,7 @@ CheckResults StorageStripeLog::checkData(const ASTPtr & /* query */, const Conte
return file_checker.check(); return file_checker.check();
} }
void StorageStripeLog::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageStripeLog::truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &)
{ {
std::shared_lock<std::shared_mutex> lock(rwlock); std::shared_lock<std::shared_mutex> lock(rwlock);

View File

@ -42,7 +42,7 @@ public:
Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; } Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; }
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr &, const Context &, TableStructureWriteLockHolder &) override;
protected: protected:
StorageStripeLog( StorageStripeLog(

View File

@ -429,10 +429,10 @@ CheckResults StorageTinyLog::checkData(const ASTPtr & /* query */, const Context
return file_checker.check(); return file_checker.check();
} }
void StorageTinyLog::truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) void StorageTinyLog::truncate(
const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &)
{ {
std::unique_lock<std::shared_mutex> lock(rwlock); std::unique_lock<std::shared_mutex> lock(rwlock);
auto metadata_snapshot = getInMemoryMetadataPtr();
disk->clearDirectory(table_path); disk->clearDirectory(table_path);

View File

@ -41,7 +41,7 @@ public:
Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; } Strings getDataPaths() const override { return {DB::fullPath(disk, table_path)}; }
void truncate(const ASTPtr &, const Context &, TableStructureWriteLockHolder &) override; void truncate(const ASTPtr &, const StorageMetadataPtr & metadata_snapshot, const Context &, TableStructureWriteLockHolder &) override;
void drop() override; void drop() override;