Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions include/mp/proxy-io.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,16 @@ class Logger
std::ostringstream m_buffer;
};

struct LogOptions {

//! External logging callback.
LogFn log_fn;

//! Maximum number of characters to use when representing
//! request and response structs as strings.
size_t max_chars{200};
};

std::string LongThreadName(const char* exe_name);

//! Event loop implementation.
Expand Down Expand Up @@ -204,12 +214,12 @@ class EventLoop

Logger log()
{
Logger logger(false, m_log_fn);
Logger logger(false, m_log_opts.log_fn);
logger << "{" << LongThreadName(m_exe_name) << "} ";
return logger;
}
Logger logPlain() { return {false, m_log_fn}; }
Logger raise() { return {true, m_log_fn}; }
Logger logPlain() { return {false, m_log_opts.log_fn}; }
Logger raise() { return {true, m_log_opts.log_fn}; }

//! Process name included in thread names so combined debug output from
//! multiple processes is easier to understand.
Expand Down Expand Up @@ -255,8 +265,8 @@ class EventLoop
//! List of connections.
std::list<Connection> m_incoming_connections;

//! External logging callback.
LogFn m_log_fn;
//! Logging options
LogOptions m_log_opts;

//! External context pointer.
void* m_context;
Expand Down
8 changes: 4 additions & 4 deletions include/mp/proxy-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -631,13 +631,13 @@ void clientInvoke(ProxyClient& proxy_client, const GetRequest& get_request, Fiel
IterateFields().handleChain(*invoke_context, request, FieldList(), typename FieldObjs::BuildParams{&fields}...);
proxy_client.m_context.loop->logPlain()
<< "{" << thread_context.thread_name << "} IPC client send "
<< TypeName<typename Request::Params>() << " " << LogEscape(request.toString());
<< TypeName<typename Request::Params>() << " " << LogEscape(request.toString(), proxy_client.m_context.loop->m_log_opts.max_chars);

proxy_client.m_context.loop->m_task_set->add(request.send().then(
[&](::capnp::Response<typename Request::Results>&& response) {
proxy_client.m_context.loop->logPlain()
<< "{" << thread_context.thread_name << "} IPC client recv "
<< TypeName<typename Request::Results>() << " " << LogEscape(response.toString());
<< TypeName<typename Request::Results>() << " " << LogEscape(response.toString(), proxy_client.m_context.loop->m_log_opts.max_chars);
try {
IterateFields().handleChain(
*invoke_context, response, FieldList(), typename FieldObjs::ReadResults{&fields}...);
Expand Down Expand Up @@ -701,7 +701,7 @@ kj::Promise<void> serverInvoke(Server& server, CallContext& call_context, Fn fn)

int req = ++server_reqs;
server.m_context.loop->log() << "IPC server recv request #" << req << " "
<< TypeName<typename Params::Reads>() << " " << LogEscape(params.toString());
<< TypeName<typename Params::Reads>() << " " << LogEscape(params.toString(), server.m_context.loop->m_log_opts.max_chars);

try {
using ServerContext = ServerInvokeContext<Server, CallContext>;
Expand All @@ -718,7 +718,7 @@ kj::Promise<void> serverInvoke(Server& server, CallContext& call_context, Fn fn)
[&]() { return kj::Promise<CallContext>(kj::mv(call_context)); })
.then([&server, req](CallContext call_context) {
server.m_context.loop->log() << "IPC server send response #" << req << " " << TypeName<Results>()
<< " " << LogEscape(call_context.getResults().toString());
<< " " << LogEscape(call_context.getResults().toString(), server.m_context.loop->m_log_opts.max_chars);
});
} catch (const std::exception& e) {
server.m_context.loop->log() << "IPC server unhandled exception: " << e.what();
Expand Down
2 changes: 1 addition & 1 deletion include/mp/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ std::string ThreadName(const char* exe_name);

//! Escape binary string for use in log so it doesn't trigger unicode decode
//! errors in python unit tests.
std::string LogEscape(const kj::StringTree& string);
std::string LogEscape(const kj::StringTree& string, size_t max_size);

//! Callback type used by SpawnProcess below.
using FdToArgsFn = std::function<std::vector<std::string>(int fd)>;
Expand Down
2 changes: 1 addition & 1 deletion src/mp/proxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,9 @@ EventLoop::EventLoop(const char* exe_name, LogFn log_fn, void* context)
: m_exe_name(exe_name),
m_io_context(kj::setupAsyncIo()),
m_task_set(new kj::TaskSet(m_error_handler)),
m_log_fn(std::move(log_fn)),
m_context(context)
{
m_log_opts.log_fn = log_fn;
int fds[2];
KJ_SYSCALL(socketpair(AF_UNIX, SOCK_STREAM, 0, fds));
m_wait_fd = fds[0];
Expand Down
7 changes: 3 additions & 4 deletions src/mp/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,12 +76,11 @@ std::string ThreadName(const char* exe_name)
return std::move(buffer).str();
}

std::string LogEscape(const kj::StringTree& string)
std::string LogEscape(const kj::StringTree& string, size_t max_size)
{
const int MAX_SIZE = 1000;
std::string result;
string.visit([&](const kj::ArrayPtr<const char>& piece) {
if (result.size() > MAX_SIZE) return;
if (result.size() > max_size) return;
for (const char c : piece) {
if (c == '\\') {
result.append("\\\\");
Expand All @@ -92,7 +91,7 @@ std::string LogEscape(const kj::StringTree& string)
} else {
result.push_back(c);
}
if (result.size() > MAX_SIZE) {
if (result.size() > max_size) {
result += "...";
break;
}
Expand Down
Loading