// Reads `ProcessIO::Data` records from a string containing "Record-IO" // data encoded in protobuf messages, and returns the stdout and stderr. // // NOTE: This function ignores any `ProcessIO::Control` records. // // TODO(gkleiman): This function is very similar to one in `api_tests.cpp`, we // should refactor them into a common helper when fixing MESOS-7903. static Try<tuple<string, string>> decodeProcessIOData(const string& data) { string stdoutReceived; string stderrReceived; ::recordio::Decoder<v1::agent::ProcessIO> decoder( lambda::bind( deserialize<v1::agent::ProcessIO>, ContentType::PROTOBUF, lambda::_1)); Try<std::deque<Try<v1::agent::ProcessIO>>> records = decoder.decode(data); if (records.isError()) { return Error(records.error()); } while (!records->empty()) { Try<v1::agent::ProcessIO> record = records->front(); records->pop_front(); if (record.isError()) { return Error(record.error()); } if (record->data().type() == v1::agent::ProcessIO::Data::STDOUT) { stdoutReceived += record->data().data(); } else if (record->data().type() == v1::agent::ProcessIO::Data::STDERR) { stderrReceived += record->data().data(); } } return std::make_tuple(stdoutReceived, stderrReceived); }