12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
- #include " tools/worker/work_processor.h"
16
-
17
15
#include < google/protobuf/text_format.h>
18
16
#include < sys/stat.h>
19
17
28
26
#include " tools/common/temp_file.h"
29
27
#include " tools/worker/output_file_map.h"
30
28
#include " tools/worker/swift_runner.h"
29
+ #include " tools/worker/work_processor.h"
31
30
32
31
namespace {
33
32
@@ -38,6 +37,15 @@ static bool ArgumentEnablesWMO(const std::string &arg) {
38
37
arg == " -force-single-frontend-invocation" ;
39
38
}
40
39
40
+ static void FinalizeWorkRequest (const blaze::worker::WorkRequest &request,
41
+ blaze::worker::WorkResponse *response,
42
+ int exit_code,
43
+ const std::ostringstream &output) {
44
+ response->set_exit_code (exit_code);
45
+ response->set_output (output.str ());
46
+ response->set_request_id (request.request_id ());
47
+ }
48
+
41
49
}; // end namespace
42
50
43
51
WorkProcessor::WorkProcessor (const std::vector<std::string> &args) {
@@ -111,6 +119,8 @@ void WorkProcessor::ProcessWorkRequest(
111
119
processed_args.push_back (" @" + params_file->GetPath ());
112
120
params_file_stream.close ();
113
121
122
+ std::ostringstream stderr_stream;
123
+
114
124
if (!is_wmo) {
115
125
for (const auto &expected_object_pair :
116
126
output_file_map.incremental_outputs ()) {
@@ -119,15 +129,30 @@ void WorkProcessor::ProcessWorkRequest(
119
129
// incremental storage area.
120
130
auto dir_path = Dirname (expected_object_pair.second );
121
131
if (!MakeDirs (dir_path, S_IRWXU)) {
122
- std::cerr << " Could not create directory " << dir_path << " (errno "
123
- << errno << " )\n " ;
132
+ stderr_stream << " swift_worker: Could not create directory " << dir_path
133
+ << " (errno " << errno << " )\n " ;
134
+ FinalizeWorkRequest (request, response, EXIT_FAILURE, stderr_stream);
135
+ }
136
+ }
137
+
138
+ // Copy some input files from the incremental storage area to the locations
139
+ // where Bazel will generate them.
140
+ for (const auto &expected_object_pair :
141
+ output_file_map.incremental_inputs ()) {
142
+ if (FileExists (expected_object_pair.second )) {
143
+ if (!CopyFile (expected_object_pair.second ,
144
+ expected_object_pair.first )) {
145
+ stderr_stream << " swift_worker: Could not copy "
146
+ << expected_object_pair.second << " to "
147
+ << expected_object_pair.first << " (errno " << errno
148
+ << " )\n " ;
149
+ FinalizeWorkRequest (request, response, EXIT_FAILURE, stderr_stream);
150
+ }
124
151
}
125
152
}
126
153
}
127
154
128
- std::ostringstream stderr_stream;
129
155
SwiftRunner swift_runner (processed_args, /* force_response_file=*/ true );
130
-
131
156
int exit_code = swift_runner.Run (&stderr_stream, /* stdout_to_stderr=*/ true );
132
157
133
158
if (!is_wmo) {
@@ -136,14 +161,34 @@ void WorkProcessor::ProcessWorkRequest(
136
161
for (const auto &expected_object_pair :
137
162
output_file_map.incremental_outputs ()) {
138
163
if (!CopyFile (expected_object_pair.second , expected_object_pair.first )) {
139
- std::cerr << " Could not copy " << expected_object_pair.second << " to "
140
- << expected_object_pair.first << " (errno " << errno << " )\n " ;
141
- exit_code = EXIT_FAILURE;
164
+ stderr_stream << " swift_worker: Could not copy "
165
+ << expected_object_pair.second << " to "
166
+ << expected_object_pair.first << " (errno " << errno
167
+ << " )\n " ;
168
+ FinalizeWorkRequest (request, response, EXIT_FAILURE, stderr_stream);
142
169
}
143
170
}
144
- }
145
171
146
- response->set_exit_code (exit_code);
147
- response->set_output (stderr_stream.str ());
148
- response->set_request_id (request.request_id ());
172
+ // Copy the replaced input files back to the incremental storage for the
173
+ // next run.
174
+ for (const auto &expected_object_pair :
175
+ output_file_map.incremental_inputs ()) {
176
+ if (FileExists (expected_object_pair.first )) {
177
+ if (FileExists (expected_object_pair.second )) {
178
+ // CopyFile fails if the file already exists
179
+ RemoveFile (expected_object_pair.second );
180
+ }
181
+ if (!CopyFile (expected_object_pair.first ,
182
+ expected_object_pair.second )) {
183
+ stderr_stream << " swift_worker: Could not copy "
184
+ << expected_object_pair.first << " to "
185
+ << expected_object_pair.second << " (errno " << errno
186
+ << " )\n " ;
187
+ FinalizeWorkRequest (request, response, EXIT_FAILURE, stderr_stream);
188
+ }
189
+ }
190
+ }
191
+
192
+ FinalizeWorkRequest (request, response, exit_code, stderr_stream);
193
+ }
149
194
}
0 commit comments