Skip to content

Commit cd0e889

Browse files
committed
Add arguments to --breakpad-minidumps-path and `--breakpad-minidump… (#17711)
1 parent 22f1c52 commit cd0e889

File tree

17 files changed

+164
-47
lines changed

17 files changed

+164
-47
lines changed

ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,35 @@ TClientCommandServer::TClientCommandServer(std::shared_ptr<TModuleFactories> fac
2424
*Logger
2525
}))
2626
, InitCfg(DepsRecorder->GetDeps())
27+
, RunConfig(AppConfig)
2728
{}
2829

2930
int TClientCommandServer::Run(TConfig& config) {
30-
NKikimrConfig::TAppConfig appConfig;
31-
32-
TKikimrRunConfig runConfig(appConfig);
33-
3431
InitCfg.Apply(
35-
appConfig,
36-
runConfig.NodeId,
37-
runConfig.ScopeId,
38-
runConfig.TenantName,
39-
runConfig.ServicesMask,
40-
runConfig.ClusterName,
41-
runConfig.ConfigsDispatcherInitInfo);
32+
AppConfig,
33+
RunConfig.NodeId,
34+
RunConfig.ScopeId,
35+
RunConfig.TenantName,
36+
RunConfig.ServicesMask,
37+
RunConfig.ClusterName,
38+
RunConfig.ConfigsDispatcherInitInfo);
4239

43-
runConfig.ConfigsDispatcherInitInfo.RecordedInitialConfiguratorDeps =
40+
RunConfig.ConfigsDispatcherInitInfo.RecordedInitialConfiguratorDeps =
4441
std::make_shared<NConfig::TRecordedInitialConfiguratorDeps>(DepsRecorder->GetRecordedDeps());
4542

4643
for (int i = 0; i < config.ArgC; ++i) {
47-
runConfig.ConfigsDispatcherInitInfo.Args.push_back(config.ArgV[i]);
44+
RunConfig.ConfigsDispatcherInitInfo.Args.push_back(config.ArgV[i]);
4845
}
4946

50-
Y_ABORT_UNLESS(runConfig.NodeId);
51-
return MainRun(runConfig, Factories);
47+
Y_ABORT_UNLESS(RunConfig.NodeId);
48+
return MainRun(RunConfig, Factories);
5249
}
5350

5451
void TClientCommandServer::Config(TConfig& config) {
5552
TClientCommand::Config(config);
56-
53+
for (auto plugin: RunConfig.Plugins) {
54+
plugin->SetupOpts(config.Opts->GetOpts());
55+
}
5756
NConfig::AddProtoConfigOptions(DepsRecorder->GetDeps().ProtoConfigFileProvider);
5857
InitCfg.RegisterCliOptions(*config.Opts);
5958
ProtoConfigFileProvider->RegisterCliOptions(*config.Opts);

ydb/core/driver_lib/cli_utils/cli_cmds_server.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ class TClientCommandServer : public TClientCommand {
3333
std::unique_ptr<NConfig::IInitialConfiguratorDepsRecorder> DepsRecorder;
3434

3535
NConfig::TInitialConfigurator InitCfg;
36+
37+
private:
38+
NKikimrConfig::TAppConfig AppConfig;
39+
TKikimrRunConfig RunConfig;
3640
};
3741

3842
} // namespace NKikimr::NDriverClient

ydb/core/driver_lib/run/config.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ TKikimrRunConfig::TKikimrRunConfig(NKikimrConfig::TAppConfig& appConfig, ui32 no
66
: AppConfig(appConfig)
77
, NodeId(nodeId)
88
, ScopeId(scopeId)
9-
{}
9+
{
10+
for (const auto& key: NYdb::NGlobalPlugins::TPluginFactory::GetRegisteredKeys()) {
11+
Plugins.emplace_back(NYdb::NGlobalPlugins::TPluginFactory::Construct(key));
12+
}
13+
}
1014

1115
} // namespace NKikimr

ydb/core/driver_lib/run/config.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <ydb/core/base/event_filter.h>
77
#include <ydb/core/config/init/init.h>
88
#include <ydb/core/driver_lib/cli_config_base/config_base.h>
9+
#include <ydb/library/global_plugins/abstract.h>
910

1011
#include <util/generic/hash.h>
1112

@@ -27,6 +28,8 @@ struct TKikimrRunConfig {
2728

2829
NConfig::TConfigsDispatcherInitInfo ConfigsDispatcherInitInfo;
2930

31+
TVector<TAtomicSharedPtr<NYdb::NGlobalPlugins::IPluginInitilizer>> Plugins;
32+
3033
TKikimrRunConfig(NKikimrConfig::TAppConfig& appConfig,
3134
ui32 nodeId = 0, const TKikimrScopeId& scopeId = {});
3235
};

ydb/core/driver_lib/run/run.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1757,6 +1757,9 @@ TIntrusivePtr<TServiceInitializersList> TKikimrRunner::CreateServiceInitializers
17571757
}
17581758

17591759
void TKikimrRunner::KikimrStart() {
1760+
for (auto plugin: Plugins) {
1761+
plugin->Start();
1762+
}
17601763

17611764
if (!!PollerThreads) {
17621765
PollerThreads->Start();
@@ -1918,6 +1921,9 @@ void TKikimrRunner::KikimrStop(bool graceful) {
19181921
if (YdbDriver) {
19191922
YdbDriver->Stop(true);
19201923
}
1924+
for (auto plugin: Plugins) {
1925+
plugin->Stop();
1926+
}
19211927
}
19221928

19231929
void TKikimrRunner::BusyLoop() {
@@ -1984,6 +1990,14 @@ void TKikimrRunner::InitializeRegistries(const TKikimrRunConfig& runConfig) {
19841990
NKikHouse::RegisterFormat(*FormatFactory);
19851991
}
19861992

1993+
void TKikimrRunner::InitializePlugins(const TKikimrRunConfig& runConfig) {
1994+
for (const auto& initializer: runConfig.Plugins) {
1995+
if (auto plugin = initializer->CreatePlugin()) {
1996+
Plugins.push_back(plugin);
1997+
}
1998+
}
1999+
}
2000+
19872001
TIntrusivePtr<TKikimrRunner> TKikimrRunner::CreateKikimrRunner(
19882002
const TKikimrRunConfig& runConfig,
19892003
std::shared_ptr<TModuleFactories> factories) {
@@ -2000,6 +2014,7 @@ TIntrusivePtr<TKikimrRunner> TKikimrRunner::CreateKikimrRunner(
20002014
runner->InitializeKqpController(runConfig);
20012015
runner->InitializeGracefulShutdown(runConfig);
20022016
runner->InitializeGRpc(runConfig);
2017+
runner->InitializePlugins(runConfig);
20032018
return runner;
20042019
}
20052020

ydb/core/driver_lib/run/run.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class TKikimrRunner : public virtual TThrRefBase, private IGlobalObjectStorage {
6363

6464
TIntrusivePtr<NMemory::IProcessMemoryInfoProvider> ProcessMemoryInfoProvider;
6565

66+
TVector<NYdb::NGlobalPlugins::IPlugin::TPtr> Plugins;
67+
6668
TKikimrRunner(std::shared_ptr<TModuleFactories> factories = {});
6769

6870
virtual ~TKikimrRunner();
@@ -89,6 +91,8 @@ class TKikimrRunner : public virtual TThrRefBase, private IGlobalObjectStorage {
8991

9092
void InitializeAppData(const TKikimrRunConfig& runConfig);
9193

94+
void InitializePlugins(const TKikimrRunConfig& runConfig);
95+
9296
void InitializeActorSystem(
9397
const TKikimrRunConfig& runConfig,
9498
TIntrusivePtr<TServiceInitializersList> serviceInitializers,

ydb/core/driver_lib/run/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ PEERDIR(
134134
ydb/library/actors/util
135135
ydb/library/folder_service
136136
ydb/library/folder_service/proto
137+
ydb/library/global_plugins
137138
ydb/library/grpc/server
138139
ydb/library/grpc/server/actors
139140
ydb/library/pdisk_io

ydb/core/driver_lib/version/version.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include <google/protobuf/text_format.h>
22
#include <google/protobuf/util/message_differencer.h>
33
#include <library/cpp/svnversion/svnversion.h>
4-
#include <library/cpp/resource/resource.h>
4+
#include <ydb/library/global_plugins/abstract.h>
55
#include <ydb/library/yverify_stream/yverify_stream.h>
66
#include <ydb/core/viewer/json/json.h>
77
#include "version.h"
@@ -732,7 +732,7 @@ TString TCompatibilityInfo::PrintHumanReadable(const NKikimrConfig::TCurrentComp
732732
}
733733
str << "\n";
734734

735-
if (NResource::Has("internal_breakpad_about")) {
735+
if (NYdb::NGlobalPlugins::TPluginFactory::Has("internal_breakpad")) {
736736
str << " HasInternalBreakpad: true" << Endl;
737737
}
738738

ydb/core/driver_lib/version/ya.make

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ PEERDIR(
1010
ydb/library/actors/interconnect
1111
library/cpp/monlib/service/pages
1212
library/cpp/svnversion
13-
library/cpp/resource
13+
ydb/library/global_plugins
1414
ydb/core/protos
1515
ydb/core/viewer/json
1616
)

ydb/library/breakpad/minidumps.cpp

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,60 @@
1-
#include <util/generic/ptr.h>
1+
#include <ydb/library/global_plugins/abstract.h>
22
#include <contrib/libs/breakpad/src/client/linux/handler/exception_handler.h>
33
#include <unistd.h>
44
#include <sys/wait.h>
55

66

77
class TMinidumper {
88
public:
9-
TMinidumper() {
10-
if(const char* path = getenv("BREAKPAD_MINIDUMPS_PATH")) {
11-
using namespace google_breakpad;
12-
Handler = MakeHolder<ExceptionHandler>(MinidumpDescriptor(path), nullptr, DumpCallback, nullptr, true, -1, true);
9+
TMinidumper(const char* path) {
10+
Init(path);
11+
}
12+
void Init(const char* path) {
13+
if (TStringBuf(path)) {
14+
Handler = MakeHolder<google_breakpad::ExceptionHandler>(google_breakpad::MinidumpDescriptor(path), nullptr, DumpCallback, nullptr, true, -1, true);
1315
}
1416
}
1517

16-
private:
17-
static bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* /*context*/, bool succeeded) {
18-
if (char* script = getenv("BREAKPAD_MINIDUMPS_SCRIPT")) {
19-
if (auto pid = fork()) {
20-
waitpid(pid, 0, 0);
21-
} else {
22-
char* dumpSucceded = succeeded ? (char *)"true" : (char *)"false";
23-
char* descriptorPath = succeeded ? (char *)descriptor.path() : (char *)"\0";
24-
char* cmd[] = {script, dumpSucceded, descriptorPath, NULL};
25-
if (execve(cmd[0], &cmd[0], NULL)) {
26-
fprintf(stderr, "Error while process BREAKPAD MINIDUMPS SCRIPT: execve(%s '%s' '%s' '%s'): %s\n", cmd[0], cmd[1], cmd[2], strerror(errno));
27-
}
18+
TString Script = getenv("BREAKPAD_MINIDUMPS_SCRIPT");
19+
20+
private:
21+
static bool DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* context, bool succeeded);
22+
THolder<google_breakpad::ExceptionHandler> Handler;
23+
};
24+
25+
TMinidumper Minidumper(getenv("BREAKPAD_MINIDUMPS_PATH"));
26+
27+
bool TMinidumper::DumpCallback(const google_breakpad::MinidumpDescriptor& descriptor, void* /*context*/, bool succeeded) {
28+
if (Minidumper.Script) {
29+
if (auto pid = fork()) {
30+
waitpid(pid, 0, 0);
31+
} else {
32+
char* dumpSucceded = succeeded ? (char *)"true" : (char *)"false";
33+
char* descriptorPath = succeeded ? (char *)descriptor.path() : (char *)"\0";
34+
char* cmd[] = {Minidumper.Script.begin(), dumpSucceded, descriptorPath, NULL};
35+
if (execve(cmd[0], &cmd[0], NULL)) {
36+
fprintf(stderr, "Error while process BREAKPAD MINIDUMPS SCRIPT: execve(%s '%s' '%s' '%s'): %s\n", cmd[0], cmd[1], cmd[2], strerror(errno));
2837
}
2938
}
30-
return succeeded;
3139
}
40+
return succeeded;
41+
}
3242

33-
THolder<google_breakpad::ExceptionHandler> Handler;
43+
44+
class TMinidumperInitilizer final: public NYdb::NGlobalPlugins::IPluginInitilizer {
45+
public:
46+
void SetupOpts(NLastGetopt::TOpts& opts) override {
47+
opts.AddLongOption("breakpad-minidumps-path", "Path for minidumps generated by internal breakpad")
48+
.RequiredArgument("PATH").Handler1T<TString>([](const TString& path) {
49+
Minidumper.Init(path.c_str());
50+
});
51+
opts.AddLongOption("breakpad-minidumps-script", "Script for process minidumps generated by internal breakpad")
52+
.RequiredArgument("SCRIPT").StoreResult(&Minidumper.Script);
53+
}
54+
NYdb::NGlobalPlugins::IPlugin::TPtr CreatePlugin() const override {
55+
return {};
56+
}
57+
const static NYdb::NGlobalPlugins::TPluginFactory::TRegistrator<TMinidumperInitilizer> Registrar;
3458
};
3559

36-
TMinidumper Minidumper;
60+
const NYdb::NGlobalPlugins::TPluginFactory::TRegistrator<TMinidumperInitilizer> TMinidumperInitilizer::Registrar("internal_breakpad");

0 commit comments

Comments
 (0)