aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/core/issue/yql_issue.cpp
blob: 5fa6f02e69b2a90457d82655d81572fcc0120423 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "yql_issue.h"

#include <util/string/builder.h>

namespace NYql {

const char IssueMapResource[] = "yql_issue.txt";

static_assert(DEFAULT_ERROR == TIssuesIds::DEFAULT_ERROR,
    "value of particular and common error mismatched for \"DEFAULT_ERROR\"");
static_assert(UNEXPECTED_ERROR == TIssuesIds::UNEXPECTED,
    "value of particular and common error mismatched for \"UNEXPECTED_ERROR\"");

void CheckFatalIssues(TIssues& issues) {
    bool isFatal = false;
    auto checkIssue = [&](const TIssue& issue) {
        if (issue.GetSeverity() == TSeverityIds::S_FATAL) {
            isFatal = true;
        }
    };

    std::function<void(const TIssuePtr& issue)> recursiveCheck = [&](const TIssuePtr& issue) {
        if (isFatal) {
            return;
        }

        checkIssue(*issue);
        for (const auto& subissue : issue->GetSubIssues()) {
            recursiveCheck(subissue);
        }
    };

    for (const auto& issue : issues) {
        if (isFatal) {
            break;
        }

        checkIssue(issue);
        // check subissues
        for (const auto& subissue : issue.GetSubIssues()) {
            recursiveCheck(subissue);
        }
    }

    if (isFatal) {
        TIssue result;
        result.SetMessage(
            TStringBuilder()
                << "An abnormal situation found, so consider opening a bug report to YQL (st/YQLSUPPORT),"
                << " because more detailed information is only available in server side logs and/or "
                << "coredumps.");
        result.SetCode(TIssuesIds::UNEXPECTED, TSeverityIds::S_FATAL);
        issues.AddIssue(result);
    }
}

}