diff options
author | ilnaz <ilnaz@ydb.tech> | 2022-11-28 23:48:10 +0300 |
---|---|---|
committer | ilnaz <ilnaz@ydb.tech> | 2022-11-28 23:48:10 +0300 |
commit | 40b8600f0c8d0f9328fc6683c05672852c8e4aaf (patch) | |
tree | b6d7cc14e31680605fad58ced664b451ae1c6156 | |
parent | c8acf5a44134b43160300b2a211e9b753edcf79f (diff) | |
download | ydb-40b8600f0c8d0f9328fc6683c05672852c8e4aaf.tar.gz |
Fill 'created_at' field of scheme entry
-rw-r--r-- | library/cpp/actors/util/README.md (renamed from library/cpp/actors/core/README.md) | 12 | ||||
-rw-r--r-- | ydb/core/kqp/ut/CMakeLists.darwin.txt | 1 | ||||
-rw-r--r-- | ydb/core/kqp/ut/CMakeLists.linux-aarch64.txt | 1 | ||||
-rw-r--r-- | ydb/core/kqp/ut/CMakeLists.linux.txt | 1 | ||||
-rw-r--r-- | ydb/core/kqp/ut/kqp_scheme_ut.cpp | 57 | ||||
-rw-r--r-- | ydb/core/ydb_convert/ydb_convert.cpp | 4 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp | 82 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_scheme/scheme.h | 34 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_table/CMakeLists.txt | 1 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_table/table.cpp | 8 | ||||
-rw-r--r-- | ydb/public/sdk/cpp/client/ydb_table/table.h | 8 |
11 files changed, 157 insertions, 52 deletions
diff --git a/library/cpp/actors/core/README.md b/library/cpp/actors/util/README.md index 439a8dd459..ff2d573fe8 100644 --- a/library/cpp/actors/core/README.md +++ b/library/cpp/actors/util/README.md @@ -1,6 +1,6 @@ ## Memory tracker -https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/actors/core/memory_track.h +https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/actors/util/memory_track.h Использование: @@ -15,7 +15,7 @@ https://a.yandex-team.ru/arc/trunk/arcadia/library/cpp/actors/core/memory_track. Использование с автоматически генерируемой меткой: ```cpp -#include <library/cpp/actors/core/memory_track.h> +#include <library/cpp/actors/util/memory_track.h> struct TTypeLabeled : public NActors::NMemory::TTrack<TTypeLabeled> @@ -27,7 +27,7 @@ struct TTypeLabeled Использование с пользовательским именем метки: ```cpp -#include <library/cpp/actors/core/memory_track.h> +#include <library/cpp/actors/util/memory_track.h> static const char NamedLabel[] = "NamedLabel"; @@ -43,7 +43,7 @@ struct TNameLabeled ### Отслеживание аллокаций в контейнерах ```cpp -#include <library/cpp/actors/core/memory_track.h> +#include <library/cpp/actors/util/memory_track.h> static const char InContainerLabel[] = "InContainerLabel"; @@ -75,7 +75,7 @@ std::unordered_map<TKey, TInContainer, std::hash<TKey>, std::equal_to<TKey>, ### Ручное отслеживание аллокаций/деаллокаций ```cpp -#include <library/cpp/actors/core/memory_track.h> +#include <library/cpp/actors/util/memory_track.h> static const char ManualLabel[] = "ManualLabel"; @@ -92,7 +92,7 @@ NActors::NMemory::TLabel<ManualLabel>::Sub(size); Сервис **utils**, пользовательская метка **label**, сенсоры: -- MT/Count: количество аллокаций в моменте +- MT/Count: количество аллокаций в моменте - MT/Memory: аллоцированная память в моменте - MT/PeakCount: пиковое значение количества аллокаций (сэмплится с фиксированной частотой) - MT/PeakMemory: пиковое значение аллоцированной памяти diff --git a/ydb/core/kqp/ut/CMakeLists.darwin.txt b/ydb/core/kqp/ut/CMakeLists.darwin.txt index d92d946e73..1d4f8d472e 100644 --- a/ydb/core/kqp/ut/CMakeLists.darwin.txt +++ b/ydb/core/kqp/ut/CMakeLists.darwin.txt @@ -31,6 +31,7 @@ target_link_libraries(ydb-core-kqp-ut PUBLIC kqp-ut-common cpp-client-draft cpp-client-ydb_proto + cpp-client-ydb_scheme cpp-client-ydb_topic yql-sql-pg_dummy re2_udf diff --git a/ydb/core/kqp/ut/CMakeLists.linux-aarch64.txt b/ydb/core/kqp/ut/CMakeLists.linux-aarch64.txt index 567488a2e4..b44461174d 100644 --- a/ydb/core/kqp/ut/CMakeLists.linux-aarch64.txt +++ b/ydb/core/kqp/ut/CMakeLists.linux-aarch64.txt @@ -31,6 +31,7 @@ target_link_libraries(ydb-core-kqp-ut PUBLIC kqp-ut-common cpp-client-draft cpp-client-ydb_proto + cpp-client-ydb_scheme cpp-client-ydb_topic yql-sql-pg_dummy re2_udf diff --git a/ydb/core/kqp/ut/CMakeLists.linux.txt b/ydb/core/kqp/ut/CMakeLists.linux.txt index eed52704bd..e8f9dc55ea 100644 --- a/ydb/core/kqp/ut/CMakeLists.linux.txt +++ b/ydb/core/kqp/ut/CMakeLists.linux.txt @@ -33,6 +33,7 @@ target_link_libraries(ydb-core-kqp-ut PUBLIC kqp-ut-common cpp-client-draft cpp-client-ydb_proto + cpp-client-ydb_scheme cpp-client-ydb_topic yql-sql-pg_dummy re2_udf diff --git a/ydb/core/kqp/ut/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/kqp_scheme_ut.cpp index 71ea1c6065..b8ad69b6d6 100644 --- a/ydb/core/kqp/ut/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/kqp_scheme_ut.cpp @@ -1,5 +1,6 @@ #include <ydb/core/kqp/ut/common/kqp_ut_common.h> #include <ydb/public/sdk/cpp/client/ydb_proto/accessor.h> +#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> #include <ydb/public/sdk/cpp/client/ydb_topic/topic.h> #include <library/cpp/threading/local_executor/local_executor.h> @@ -2888,6 +2889,62 @@ Y_UNIT_TEST_SUITE(KqpScheme) { } } + Y_UNIT_TEST(CreatedAt) { + TKikimrRunner kikimr(TKikimrSettings().SetPQConfig(DefaultPQConfig())); + auto scheme = NYdb::NScheme::TSchemeClient(kikimr.GetDriver(), TCommonClientSettings().Database("/Root")); + auto db = kikimr.GetTableClient(); + auto session = db.CreateSession().GetValueSync().GetSession(); + + { + auto query = R"( + --!syntax_v1 + CREATE TABLE `/Root/dir/table` ( + Key Uint64, + Value String, + PRIMARY KEY (Key) + ); + )"; + + const auto result = session.ExecuteSchemeQuery(query).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + NYdb::NScheme::TVirtualTimestamp createdAt; + + { // describe table + auto desc = session.DescribeTable("/Root/dir/table").ExtractValueSync(); + UNIT_ASSERT_C(desc.IsSuccess(), desc.GetIssues().ToString()); + + createdAt = desc.GetEntry().CreatedAt; + UNIT_ASSERT(createdAt.PlanStep() > 0); + UNIT_ASSERT(createdAt.TxId() != 0); + } + + { // describe dir + auto desc = scheme.DescribePath("/Root/dir").ExtractValueSync(); + UNIT_ASSERT_C(desc.IsSuccess(), desc.GetIssues().ToString()); + UNIT_ASSERT_VALUES_EQUAL(desc.GetEntry().CreatedAt, createdAt); + } + + { // list dir + auto desc = scheme.ListDirectory("/Root/dir").ExtractValueSync(); + UNIT_ASSERT_C(desc.IsSuccess(), desc.GetIssues().ToString()); + UNIT_ASSERT_VALUES_EQUAL(desc.GetEntry().CreatedAt, createdAt); + + UNIT_ASSERT_VALUES_EQUAL(desc.GetChildren().size(), 1); + UNIT_ASSERT_VALUES_EQUAL(desc.GetChildren()[0].CreatedAt, createdAt); + } + + { // copy table + const auto result = session.CopyTable("/Root/dir/table", "/Root/dir/copy").GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + + auto desc = session.DescribeTable("/Root/dir/copy").ExtractValueSync(); + UNIT_ASSERT_C(desc.IsSuccess(), desc.GetIssues().ToString()); + UNIT_ASSERT(desc.GetEntry().CreatedAt > createdAt); + } + } + Y_UNIT_TEST(CreateAlterDropTableStore) { TKikimrSettings runnerSettings; runnerSettings.WithSampleTables = false; diff --git a/ydb/core/ydb_convert/ydb_convert.cpp b/ydb/core/ydb_convert/ydb_convert.cpp index 1e2b0904d7..5cea073e51 100644 --- a/ydb/core/ydb_convert/ydb_convert.cpp +++ b/ydb/core/ydb_convert/ydb_convert.cpp @@ -806,6 +806,10 @@ void ConvertDirectoryEntry(const NKikimrSchemeOp::TDirEntry& from, Ydb::Scheme:: to->set_type(static_cast<Ydb::Scheme::Entry::Type>(from.GetPathType())); } + auto& timestamp = *to->mutable_created_at(); + timestamp.set_plan_step(from.GetCreateStep()); + timestamp.set_tx_id(from.GetCreateTxId()); + if (processAcl) { const bool isDir = from.GetPathType() == NKikimrSchemeOp::EPathTypeDir; ConvertAclToYdb(from.GetOwner(), from.GetEffectiveACL(), isDir, to->mutable_effective_permissions()); diff --git a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp index 305a7e92d7..108fe82dbe 100644 --- a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp +++ b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp @@ -15,6 +15,23 @@ namespace NScheme { using namespace NThreading; using namespace Ydb::Scheme; +TVirtualTimestamp::TVirtualTimestamp(const ::Ydb::VirtualTimestamp& proto) + : std::tuple<ui64, ui64>(proto.plan_step(), proto.tx_id()) +{} + +TString TVirtualTimestamp::ToString() const { + TString result; + TStringOutput out(result); + Out(out); + return result; +} + +void TVirtualTimestamp::Out(IOutputStream& o) const { + o << "{ plan_step: " << PlanStep() + << ", tx_id: " << TxId() + << " }"; +} + static ESchemeEntryType ConvertProtoEntryType(::Ydb::Scheme::Entry::Type entry) { switch (entry) { case ::Ydb::Scheme::Entry::DIRECTORY: @@ -44,6 +61,17 @@ static ESchemeEntryType ConvertProtoEntryType(::Ydb::Scheme::Entry::Type entry) } } +TSchemeEntry::TSchemeEntry(const ::Ydb::Scheme::Entry& proto) + : Name(proto.name()) + , Owner(proto.owner()) + , Type(ConvertProtoEntryType(proto.type())) + , SizeBytes(proto.size_bytes()) + , CreatedAt(proto.created_at()) +{ + PermissionToSchemeEntry(proto.effective_permissions(), &EffectivePermissions); + PermissionToSchemeEntry(proto.permissions(), &Permissions); +} + class TSchemeClient::TImpl : public TClientImplCommon<TSchemeClient::TImpl> { public: TImpl(std::shared_ptr<TGRpcConnectionsImpl>&& connections, const TCommonClientSettings& settings) @@ -79,21 +107,12 @@ public: auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { - TSchemeEntry entry; + DescribePathResult result; if (any) { - DescribePathResult result; any->UnpackTo(&result); - entry.Name = result.self().name(); - entry.Owner = result.self().owner(); - entry.Type = ConvertProtoEntryType(result.self().type()); - entry.SizeBytes = result.self().size_bytes(); - PermissionToSchemeEntry(result.self().effective_permissions(), &entry.EffectivePermissions); - PermissionToSchemeEntry(result.self().permissions(), &entry.Permissions); } - TDescribePathResult val(std::move(entry), - TStatus(std::move(status))); - promise.SetValue(std::move(val)); + promise.SetValue(TDescribePathResult(TStatus(std::move(status)), result.self())); }; Connections_->RunDeferred<Ydb::Scheme::V1::SchemeService, DescribePathRequest, DescribePathResponse>( @@ -116,27 +135,17 @@ public: auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { - TSchemeEntry entry; - TVector<TSchemeEntry> children; + ListDirectoryResult result; if (any) { - ListDirectoryResult result; any->UnpackTo(&result); - entry.Name = result.self().name(); - entry.Owner = result.self().owner(); - entry.Type = ConvertProtoEntryType(result.self().type()); - - for (const auto& child : result.children()) { - TSchemeEntry tmp; - tmp.Name = child.name(); - tmp.Owner = child.owner(); - tmp.Type = ConvertProtoEntryType(child.type()); - children.push_back(tmp); - } } - TListDirectoryResult val(std::move(children), std::move(entry), - TStatus(std::move(status))); - promise.SetValue(std::move(val)); + TVector<TSchemeEntry> children(Reserve(result.children().size())); + for (const auto& child : result.children()) { + children.emplace_back(child); + } + + promise.SetValue(TListDirectoryResult(TStatus(std::move(status)), result.self(), std::move(children))); }; Connections_->RunDeferred<Ydb::Scheme::V1::SchemeService, ListDirectoryRequest, ListDirectoryResponse>( @@ -199,23 +208,24 @@ public: //////////////////////////////////////////////////////////////////////////////// -TDescribePathResult::TDescribePathResult(TSchemeEntry&& entry, TStatus&& status) +TDescribePathResult::TDescribePathResult(TStatus&& status, const TSchemeEntry& entry) : TStatus(std::move(status)) - , Entry_(std::move(entry)) {} + , Entry_(entry) +{} -TSchemeEntry TDescribePathResult::GetEntry() const { +const TSchemeEntry& TDescribePathResult::GetEntry() const { CheckStatusOk("TDescribePathResult::GetEntry"); return Entry_; } //////////////////////////////////////////////////////////////////////////////// -TListDirectoryResult::TListDirectoryResult(TVector<TSchemeEntry>&& children, TSchemeEntry&& self, - TStatus&& status) - : TDescribePathResult(std::move(self), std::move(status)) - , Children_(std::move(children)) {} +TListDirectoryResult::TListDirectoryResult(TStatus&& status, const TSchemeEntry& self, TVector<TSchemeEntry>&& children) + : TDescribePathResult(std::move(status), self) + , Children_(std::move(children)) +{} -TVector<TSchemeEntry> TListDirectoryResult::GetChildren() const { +const TVector<TSchemeEntry>& TListDirectoryResult::GetChildren() const { CheckStatusOk("TListDirectoryResult::GetChildren"); return Children_; } diff --git a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.h b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.h index cde748b88a..dea529a02a 100644 --- a/ydb/public/sdk/cpp/client/ydb_scheme/scheme.h +++ b/ydb/public/sdk/cpp/client/ydb_scheme/scheme.h @@ -2,6 +2,13 @@ #include <ydb/public/sdk/cpp/client/ydb_driver/driver.h> +namespace Ydb { + class VirtualTimestamp; + namespace Scheme { + class Entry; + } +} + namespace NYdb { namespace NScheme { @@ -34,6 +41,17 @@ enum class ESchemeEntryType : i32 { Topic = 17 }; +struct TVirtualTimestamp : std::tuple<ui64, ui64> { + ui64 PlanStep() const { return std::get<0>(*this); } + ui64 TxId() const { return std::get<1>(*this); } + + TVirtualTimestamp() = default; + TVirtualTimestamp(const ::Ydb::VirtualTimestamp& proto); + + TString ToString() const; + void Out(IOutputStream& o) const; +}; + struct TSchemeEntry { TString Name; TString Owner; @@ -41,6 +59,10 @@ struct TSchemeEntry { TVector<TPermissions> EffectivePermissions; TVector<TPermissions> Permissions; ui64 SizeBytes = 0; + TVirtualTimestamp CreatedAt; + + TSchemeEntry() = default; + TSchemeEntry(const ::Ydb::Scheme::Entry& proto); }; //////////////////////////////////////////////////////////////////////////////// @@ -126,8 +148,8 @@ private: class TDescribePathResult : public TStatus { public: - TDescribePathResult(TSchemeEntry&& entry, TStatus&& status); - TSchemeEntry GetEntry() const; + TDescribePathResult(TStatus&& status, const TSchemeEntry& entry); + const TSchemeEntry& GetEntry() const; private: TSchemeEntry Entry_; @@ -135,8 +157,8 @@ private: class TListDirectoryResult : public TDescribePathResult { public: - TListDirectoryResult(TVector<TSchemeEntry>&& children, TSchemeEntry&& self, TStatus&& status); - TVector<TSchemeEntry> GetChildren() const; + TListDirectoryResult(TStatus&& status, const TSchemeEntry& self, TVector<TSchemeEntry>&& children); + const TVector<TSchemeEntry>& GetChildren() const; private: TVector<TSchemeEntry> Children_; @@ -144,3 +166,7 @@ private: } // namespace NScheme } // namespace NYdb + +Y_DECLARE_OUT_SPEC(inline, NYdb::NScheme::TVirtualTimestamp, o, x) { + return x.Out(o); +} diff --git a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.txt b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.txt index 29702d2e8b..d333a8dcfc 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.txt +++ b/ydb/public/sdk/cpp/client/ydb_table/CMakeLists.txt @@ -20,6 +20,7 @@ target_link_libraries(cpp-client-ydb_table PUBLIC cpp-client-ydb_params cpp-client-ydb_proto cpp-client-ydb_result + cpp-client-ydb_scheme client-ydb_table-impl client-ydb_table-query_stats client-ydb_types-operation diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.cpp b/ydb/public/sdk/cpp/client/ydb_table/table.cpp index d1323089e0..28bc15c86d 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.cpp +++ b/ydb/public/sdk/cpp/client/ydb_table/table.cpp @@ -4094,7 +4094,8 @@ bool TPrepareQueryResult::IsQueryFromCache() const { TExplainQueryResult::TExplainQueryResult(TStatus&& status, TString&& plan, TString&& ast) : TStatus(std::move(status)) , Plan_(plan) - , Ast_(ast) {} + , Ast_(ast) +{} const TString& TExplainQueryResult::GetPlan() const { CheckStatusOk("TExplainQueryResult::GetPlan"); @@ -4110,8 +4111,9 @@ const TString& TExplainQueryResult::GetAst() const { TDescribeTableResult::TDescribeTableResult(TStatus&& status, Ydb::Table::DescribeTableResult&& desc, const TDescribeTableSettings& describeSettings) - : TStatus(std::move(status)) - , TableDescription_(std::move(desc), describeSettings) {} + : NScheme::TDescribePathResult(std::move(status), desc.self()) + , TableDescription_(std::move(desc), describeSettings) +{} TTableDescription TDescribeTableResult::GetTableDescription() const { CheckStatusOk("TDescribeTableResult::GetTableDescription"); diff --git a/ydb/public/sdk/cpp/client/ydb_table/table.h b/ydb/public/sdk/cpp/client/ydb_table/table.h index 18d72ae150..7fc7e1484f 100644 --- a/ydb/public/sdk/cpp/client/ydb_table/table.h +++ b/ydb/public/sdk/cpp/client/ydb_table/table.h @@ -3,9 +3,10 @@ #include "table_enum.h" #include <ydb/public/sdk/cpp/client/ydb_driver/driver.h> +#include <ydb/public/sdk/cpp/client/ydb_params/params.h> #include <ydb/public/sdk/cpp/client/ydb_result/result.h> +#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> #include <ydb/public/sdk/cpp/client/ydb_table/query_stats/stats.h> -#include <ydb/public/sdk/cpp/client/ydb_params/params.h> #include <ydb/public/sdk/cpp/client/ydb_types/operation/operation.h> #include <util/generic/hash.h> @@ -435,9 +436,11 @@ public: TVector<TChangefeedDescription> GetChangefeedDescriptions() const; TMaybe<TTtlSettings> GetTtlSettings() const; + // Deprecated. Use GetEntry() of TDescribeTableResult instead const TString& GetOwner() const; const TVector<NScheme::TPermissions>& GetPermissions() const; const TVector<NScheme::TPermissions>& GetEffectivePermissions() const; + const TVector<TKeyRange>& GetKeyRanges() const; // Folow options related to table statistics @@ -1747,7 +1750,7 @@ private: }; //! Represents result of DescribeTable call -class TDescribeTableResult : public TStatus { +class TDescribeTableResult : public NScheme::TDescribePathResult { public: TDescribeTableResult(TStatus&& status, Ydb::Table::DescribeTableResult&& desc, const TDescribeTableSettings& describeSettings); @@ -1756,7 +1759,6 @@ public: private: TTableDescription TableDescription_; - }; class TDataQueryResult : public TStatus { |