diff options
author | robot-piglet <robot-piglet@yandex-team.com> | 2024-10-04 18:38:47 +0300 |
---|---|---|
committer | robot-piglet <robot-piglet@yandex-team.com> | 2024-10-04 18:47:04 +0300 |
commit | 28f94c4ed8634db0e3c5d44c8553d3ce4418f64c (patch) | |
tree | 1d3b54ce30832b84ccbe4d56a5383a3c99a1dd39 | |
parent | 878b50bb2ed42fd7ce11c383bb2a0966c8281eed (diff) | |
download | ydb-28f94c4ed8634db0e3c5d44c8553d3ce4418f64c.tar.gz |
Intermediate changes
commit_hash:c24b722550c2a3bf83fb191eaac6c4bc7f2dc097
-rw-r--r-- | yt/yt/library/process/process.cpp | 19 | ||||
-rw-r--r-- | yt/yt/library/process/process.h | 4 | ||||
-rw-r--r-- | yt/yt/library/process/unittests/subprocess_ut.cpp | 14 |
3 files changed, 28 insertions, 9 deletions
diff --git a/yt/yt/library/process/process.cpp b/yt/yt/library/process/process.cpp index 498503d857..4d6680825b 100644 --- a/yt/yt/library/process/process.cpp +++ b/yt/yt/library/process/process.cpp @@ -720,6 +720,10 @@ IConnectionWriterPtr TSimpleProcess::GetStdInWriter() TFuture<void> TProcessBase::Spawn() { + auto finally = Finally([&] { + CleanUpParent(); + }); + try { // Resolve binary path. std::vector<TError> innerErrors; @@ -753,13 +757,6 @@ TFuture<void> TProcessBase::Spawn() void TSimpleProcess::DoSpawn() { #ifdef _unix_ - auto finally = Finally([&] { - StdPipes_[STDIN_FILENO].CloseReadFD(); - StdPipes_[STDOUT_FILENO].CloseWriteFD(); - StdPipes_[STDERR_FILENO].CloseWriteFD(); - PipeFactory_.Clear(); - }); - YT_VERIFY(ProcessId_ == InvalidProcessId && !Finished_); // Make sure no spawn action closes Pipe_.WriteFD @@ -811,6 +808,14 @@ void TSimpleProcess::DoSpawn() #endif } +void TSimpleProcess::CleanUpParent() +{ + StdPipes_[STDIN_FILENO].CloseReadFD(); + StdPipes_[STDOUT_FILENO].CloseWriteFD(); + StdPipes_[STDERR_FILENO].CloseWriteFD(); + PipeFactory_.Clear(); +} + void TSimpleProcess::PrepareErrorPipe() { #if defined(YT_USE_POSIX_SPAWN_API) diff --git a/yt/yt/library/process/process.h b/yt/yt/library/process/process.h index e642515092..b88defec45 100644 --- a/yt/yt/library/process/process.h +++ b/yt/yt/library/process/process.h @@ -73,6 +73,8 @@ protected: virtual void DoSpawn() = 0; const char* Capture(TStringBuf arg); + virtual void CleanUpParent() = 0; + private: void SpawnChild(); void ValidateSpawnResult(); @@ -128,6 +130,8 @@ private: void AsyncPeriodicTryWait(); void ValidateSpawnResult(); + + void CleanUpParent() override; }; //////////////////////////////////////////////////////////////////////////////// diff --git a/yt/yt/library/process/unittests/subprocess_ut.cpp b/yt/yt/library/process/unittests/subprocess_ut.cpp index 32120a89a6..ff7cf7aa08 100644 --- a/yt/yt/library/process/unittests/subprocess_ut.cpp +++ b/yt/yt/library/process/unittests/subprocess_ut.cpp @@ -26,7 +26,6 @@ TEST(TSubprocessTest, Basic) EXPECT_TRUE(result.Status.IsOK()); } - TEST(TSubprocessTest, PipeOutput) { TSubprocess subprocess("/bin/echo"); @@ -74,7 +73,6 @@ TEST(TSubprocessTest, PipeBigOutput) EXPECT_TRUE(result); } - TEST(TSubprocessTest, PipeBigError) { auto queue = New<TActionQueue>(); @@ -93,6 +91,18 @@ TEST(TSubprocessTest, PipeBigError) EXPECT_EQ(6*100000, std::ssize(result.Error)); } +TEST(TSubprocessTest, BinaryNotFound) +{ + auto queue = New<TActionQueue>(); + + auto result = BIND([] { + TSubprocess subprocess("does-not-exist"); + return subprocess.Execute(); + }).AsyncVia(queue->GetInvoker()).Run().Get().Value(); + + EXPECT_FALSE(result.Status.IsOK()); +} + #endif //////////////////////////////////////////////////////////////////////////////// |