aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKonstantin Khlebnikov <koct9i@gmail.com>2024-04-02 23:43:02 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2024-04-02 23:56:32 +0300
commitd18afd09df2a08cd023012593b46109b77713a6c (patch)
treead5a4edb17656a1c0727dbcbcfbd83d9135e158c
parent710a878d0b66c06d0e79ed31b702d6861482a388 (diff)
downloadydb-d18afd09df2a08cd023012593b46109b77713a6c.tar.gz
Ignore missing task I/O accounting (/proc/*/io)
This feature is missing in kernels built with CONFIG_TASK_IO_ACCOUNTING=n It's used for I/O engine statistics: "kernel_read_bytes", "kernel_written_bytes". --- 4a0264b832902e4cad6a8c31a38c6bc3fff27b4e Pull Request resolved: https://github.com/ytsaurus/ytsaurus/pull/483
-rw-r--r--yt/yt/core/misc/proc.cpp38
1 files changed, 25 insertions, 13 deletions
diff --git a/yt/yt/core/misc/proc.cpp b/yt/yt/core/misc/proc.cpp
index 7673065998..a3b630383c 100644
--- a/yt/yt/core/misc/proc.cpp
+++ b/yt/yt/core/misc/proc.cpp
@@ -1553,24 +1553,36 @@ TTaskDiskStatistics GetSelfThreadTaskDiskStatistics()
{
#ifdef _linux_
static const TString path = "/proc/thread-self/io";
+ static std::atomic<bool> supported = true;
TTaskDiskStatistics stat;
- TIFStream ioFile(path);
- for (TString line; ioFile.ReadLine(line); ) {
- if (line.empty()) {
- continue;
- }
+ if (supported) {
+ try {
+ TIFStream ioFile(path);
+ for (TString line; ioFile.ReadLine(line); ) {
+ if (line.empty()) {
+ continue;
+ }
- auto fields = SplitString(line, " ", 2);
- if (fields.size() != 2) {
- continue;
- }
+ auto fields = SplitString(line, " ", 2);
+ if (fields.size() != 2) {
+ continue;
+ }
- if (fields[0] == "read_bytes:") {
- TryFromString(fields[1], stat.ReadBytes);
- } else if (fields[0] == "write_bytes:") {
- TryFromString(fields[1], stat.ReadBytes);
+ if (fields[0] == "read_bytes:") {
+ TryFromString(fields[1], stat.ReadBytes);
+ } else if (fields[0] == "write_bytes:") {
+ TryFromString(fields[1], stat.ReadBytes);
+ }
+ }
+ } catch (const TSystemError& ex) {
+ if (ex.Status() == ENOENT) {
+ supported = false;
+ YT_LOG_WARNING(ex, "Task I/O accounting is not supported by kernel");
+ } else {
+ throw;
+ }
}
}