aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobot-piglet <robot-piglet@yandex-team.com>2024-10-04 18:38:47 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2024-10-04 18:47:04 +0300
commit28f94c4ed8634db0e3c5d44c8553d3ce4418f64c (patch)
tree1d3b54ce30832b84ccbe4d56a5383a3c99a1dd39
parent878b50bb2ed42fd7ce11c383bb2a0966c8281eed (diff)
downloadydb-28f94c4ed8634db0e3c5d44c8553d3ce4418f64c.tar.gz
Intermediate changes
commit_hash:c24b722550c2a3bf83fb191eaac6c4bc7f2dc097
-rw-r--r--yt/yt/library/process/process.cpp19
-rw-r--r--yt/yt/library/process/process.h4
-rw-r--r--yt/yt/library/process/unittests/subprocess_ut.cpp14
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
////////////////////////////////////////////////////////////////////////////////