Skip to content

Commit 1d4638d

Browse files
committed
workshop/Workplace: move stderr pipe initialization to WorkshopOperator::Start()
1 parent b97d0a6 commit 1d4638d

File tree

3 files changed

+29
-36
lines changed

3 files changed

+29
-36
lines changed

src/workshop/Operator.cxx

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,13 @@ class WorkshopOperator::SpawnedProcess final
6868
WorkshopOperator::WorkshopOperator(EventLoop &_event_loop,
6969
WorkshopWorkplace &_workplace,
7070
const WorkshopJob &_job,
71-
const std::shared_ptr<Plan> &_plan,
72-
UniqueFileDescriptor stderr_read_pipe,
73-
size_t max_log_buffer,
74-
bool enable_journal) noexcept
71+
const std::shared_ptr<Plan> &_plan) noexcept
7572
:event_loop(_event_loop),
7673
workplace(_workplace), job(_job), plan(_plan),
7774
logger(*this),
78-
timeout_event(event_loop, BIND_THIS_METHOD(OnTimeout)),
79-
log(event_loop, job.plan_name, job.id,
80-
std::move(stderr_read_pipe))
75+
timeout_event(event_loop, BIND_THIS_METHOD(OnTimeout))
8176
{
8277
ScheduleTimeout();
83-
84-
if (max_log_buffer > 0)
85-
log.EnableBuffer(max_log_buffer);
86-
87-
if (enable_journal)
88-
log.EnableJournal();
8978
}
9079

9180
WorkshopOperator::~WorkshopOperator() noexcept
@@ -127,10 +116,24 @@ PrepareChildProcess(PreparedChildProcess &p, const char *plan_name,
127116
}
128117

129118
void
130-
WorkshopOperator::Start(FileDescriptor stderr_w)
119+
WorkshopOperator::Start(std::size_t max_log_buffer,
120+
bool enable_journal)
131121
{
132122
auto &spawn_service = workplace.GetSpawnService();
133123

124+
/* create stdout/stderr pipes */
125+
126+
auto [stderr_r, stderr_w] = CreatePipe();
127+
stderr_r.SetNonBlocking();
128+
129+
log.emplace(event_loop, job.plan_name, job.id, std::move(stderr_r));
130+
131+
if (max_log_buffer > 0)
132+
log->EnableBuffer(max_log_buffer);
133+
134+
if (enable_journal)
135+
log->EnableJournal();
136+
134137
if (plan->control_channel && plan->allow_spawn)
135138
stderr_write_pipe = stderr_w.Duplicate();
136139

@@ -314,6 +317,8 @@ WorkshopOperator::Expand(std::list<std::string> &args) const noexcept
314317
void
315318
WorkshopOperator::OnChildProcessExit(int status) noexcept
316319
{
320+
assert(log);
321+
317322
exited = true;
318323

319324
if (control_channel) {
@@ -325,7 +330,7 @@ WorkshopOperator::OnChildProcessExit(int status) noexcept
325330
}
326331
}
327332

328-
log.Flush();
333+
log->Flush();
329334

330335
int exit_status = WEXITSTATUS(status);
331336

@@ -342,7 +347,7 @@ WorkshopOperator::OnChildProcessExit(int status) noexcept
342347
else
343348
logger(2, "exited with status ", exit_status);
344349

345-
const char *log_text = log.GetBuffer();
350+
const char *log_text = log->GetBuffer();
346351
if (log_text != nullptr && !ValidateUTF8(log_text)) {
347352
/* TODO: purge illegal UTF-8 sequences instead of
348353
replacing the log text? */

src/workshop/Operator.hxx

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
// Copyright CM4all GmbH
33
// author: Max Kellermann <mk@cm4all.com>
44

5-
#ifndef WORKSHOP_OPERATOR_HXX
6-
#define WORKSHOP_OPERATOR_HXX
5+
#pragma once
76

87
#include "Job.hxx"
98
#include "LogBridge.hxx"
@@ -16,6 +15,7 @@
1615
#include "util/IntrusiveList.hxx"
1716

1817
#include <memory>
18+
#include <optional>
1919
#include <string>
2020
#include <list>
2121
#include <chrono>
@@ -74,7 +74,7 @@ class WorkshopOperator final
7474
*/
7575
UniqueFileDescriptor cgroup_cpu_stat;
7676

77-
LogBridge log;
77+
std::optional<LogBridge> log;
7878

7979
class SpawnedProcess;
8080

@@ -87,10 +87,7 @@ class WorkshopOperator final
8787
public:
8888
WorkshopOperator(EventLoop &_event_loop,
8989
WorkshopWorkplace &_workplace, const WorkshopJob &_job,
90-
const std::shared_ptr<Plan> &_plan,
91-
UniqueFileDescriptor stderr_read_pipe,
92-
size_t max_log_buffer,
93-
bool enable_journal) noexcept;
90+
const std::shared_ptr<Plan> &_plan) noexcept;
9491

9592
WorkshopOperator(const WorkshopOperator &other) = delete;
9693

@@ -106,7 +103,8 @@ public:
106103
return job.plan_name;
107104
}
108105

109-
void Start(FileDescriptor stderr_w);
106+
void Start(std::size_t max_log_buffer,
107+
bool enable_journal);
110108

111109
void SetPid(std::unique_ptr<ChildProcessHandle> &&_pid) noexcept {
112110
pid = std::move(_pid);
@@ -142,5 +140,3 @@ private:
142140
void OnControlPermanentError(std::exception_ptr &&error) noexcept override;
143141
void OnControlClosed() noexcept override;
144142
};
145-
146-
#endif

src/workshop/Workplace.cxx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,10 @@ WorkshopWorkplace::Start(EventLoop &event_loop, const WorkshopJob &job,
9191
{
9292
assert(!plan->args.empty());
9393

94-
/* create stdout/stderr pipes */
95-
96-
auto [stderr_r, stderr_w] = CreatePipe();
97-
stderr_r.SetNonBlocking();
98-
9994
/* create operator object */
10095

101-
auto o = std::make_unique<WorkshopOperator>(event_loop, *this, job, std::move(plan),
102-
std::move(stderr_r),
103-
max_log,
104-
enable_journal);
105-
o->Start(stderr_w);
96+
auto o = std::make_unique<WorkshopOperator>(event_loop, *this, job, std::move(plan));
97+
o->Start(max_log, enable_journal);
10698

10799
operators.push_back(*o.release());
108100
}

0 commit comments

Comments
 (0)