aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorilnaz <ilnaz@ydb.tech>2022-11-28 23:48:10 +0300
committerilnaz <ilnaz@ydb.tech>2022-11-28 23:48:10 +0300
commit40b8600f0c8d0f9328fc6683c05672852c8e4aaf (patch)
treeb6d7cc14e31680605fad58ced664b451ae1c6156
parentc8acf5a44134b43160300b2a211e9b753edcf79f (diff)
downloadydb-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.txt1
-rw-r--r--ydb/core/kqp/ut/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/core/kqp/ut/CMakeLists.linux.txt1
-rw-r--r--ydb/core/kqp/ut/kqp_scheme_ut.cpp57
-rw-r--r--ydb/core/ydb_convert/ydb_convert.cpp4
-rw-r--r--ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp82
-rw-r--r--ydb/public/sdk/cpp/client/ydb_scheme/scheme.h34
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/CMakeLists.txt1
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.cpp8
-rw-r--r--ydb/public/sdk/cpp/client/ydb_table/table.h8
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 {