aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/error/origin_attributes.cpp
diff options
context:
space:
mode:
authorarkady-e1ppa <arkady-e1ppa@yandex-team.com>2024-12-25 07:12:23 +0300
committerarkady-e1ppa <arkady-e1ppa@yandex-team.com>2024-12-25 07:31:55 +0300
commitb5dd91799751f9924acb7c17ddad16ddb2086bba (patch)
treef430b4e9f752af7411d5503bfcf823e9718056c2 /library/cpp/yt/error/origin_attributes.cpp
parent75f1af270a6cf9a17b65fde6d12efbb94f235960 (diff)
downloadydb-b5dd91799751f9924acb7c17ddad16ddb2086bba.tar.gz
YT-21233: Adjust (To/From)ErrorAttributeValue CPOs, revert ConvertTo becoming CPO, move TErrorCode and TError to library/cpp/yt/error
\[nodiff:caesar\] List of changes: 1) Make `ConvertTo` a normal function again (basically, a revert of previous change). It turned out to be very inconvenient entry point 2) Introduce concept for "Primitive types" which are handled without yt/core module. Please note that inclusion of core **does not** affect work with primitive types (otherwise we would be facing and ODR violation). These are numerics, duration, instant, string-like objects and guid 3) Introduce `FromErrorAttributeValue` which is a substitute to `ConvertTo` with special behavior (see below) 4) Scheme for (de-)serialization has changed: 1) Primitive types are handled via `ConvertToTextYsonString` and `ConvertFromTextYsonString` 2) Other types are not supported without yt/core. Otherwise `ConvertToYsonString(value, EYsonFormat::Text)` used for serialization and `ConvertTo<T>(value)` for deserialization. 5) New format of attribute value storage allows to not care about concrete type of the attribute (text yson strings can be detected since they start with `\"` and deserialized so are text yson bools, everything else is already human readable). This drops dependency on `TTokenizer` 6) Some small parts (e.g. enums or constants or aliases) of yt/core/misc files were moved to library/cpp/yt/\* locations and re-included to drop dependencies of stripped\_error on them 7) `TErrorAttributes` is now a simple hash map instead of a handle to `IAttributeDictionary` 8) `ExtractFromAttributes` weak symbol is finally moved to library/cpp/yt/error due to point 9 allowing to fully drop dependency on `IAttributeDictionary`. Combined with point 7 this drops dep on yt/core/ytree altogether 9) Moved `TErrorCode` to library/cpp/yt/error. There is a logger there which forces dep on library/cpp/yt/logging. It is not required really, and can be later removed 10) Moved `TError` with format and macroes to library/cpp/yt/error. It still (and probably forever will) depend on yson. What can be done next: Switch TYsonString to TString and move ConvertTo/FromTextYsonString to library/cpp/yt/error. This would remove dep on library/cpp/yt/yson\_string commit_hash:6f11dc478ab782a1f98a5aedcd45a4800d3f4e7b
Diffstat (limited to 'library/cpp/yt/error/origin_attributes.cpp')
-rw-r--r--library/cpp/yt/error/origin_attributes.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/library/cpp/yt/error/origin_attributes.cpp b/library/cpp/yt/error/origin_attributes.cpp
index 5ff0b03933..6f86e31ae8 100644
--- a/library/cpp/yt/error/origin_attributes.cpp
+++ b/library/cpp/yt/error/origin_attributes.cpp
@@ -1,4 +1,5 @@
#include "origin_attributes.h"
+#include "error_attributes.h"
#include <library/cpp/yt/assert/assert.h>
@@ -105,6 +106,48 @@ TString FormatOrigin(const TOriginAttributes& attributes)
}));
}
+////////////////////////////////////////////////////////////////////////////////
+
+TOriginAttributes ExtractFromDictionary(TErrorAttributes* attributes)
+{
+ using TFunctor = TOriginAttributes(*)(TErrorAttributes*);
+
+ if (auto strong = NGlobal::GetErasedVariable(ExtractFromDictionaryTag)) {
+ return strong->AsConcrete<TFunctor>()(attributes);
+ }
+
+ return ExtractFromDictionaryDefault(attributes);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TOriginAttributes ExtractFromDictionaryDefault(TErrorAttributes* attributes)
+{
+ TOriginAttributes result;
+ if (attributes == nullptr) {
+ return result;
+ }
+
+ // TODO(arkady-e1ppa): Try using std::string here.
+ static const TString HostKey("host");
+ result.HostHolder = TSharedRef::FromString(attributes->GetAndRemove(HostKey, TString()));
+ result.Host = result.HostHolder.empty() ? TStringBuf() : TStringBuf(result.HostHolder.Begin(), result.HostHolder.End());
+
+ static const TString DatetimeKey("datetime");
+ result.Datetime = attributes->GetAndRemove(DatetimeKey, TInstant());
+
+ static const TString PidKey("pid");
+ result.Pid = attributes->GetAndRemove(PidKey, TProcessId{});
+
+ static const TString TidKey("tid");
+ result.Tid = attributes->GetAndRemove(TidKey, NThreading::InvalidThreadId);
+
+ static const TString ThreadNameKey("thread");
+ result.ThreadName = attributes->GetAndRemove<TString>(ThreadNameKey, TString());
+
+ return result;
+}
+
} // namespace NDetail
////////////////////////////////////////////////////////////////////////////////