Skip to content

Commit e471ed3

Browse files
committed
Merge PR ceph#62577 into main
* refs/pull/62577/head: libcephfs_proxy: avoid libc buffering for logging Reviewed-by: Venky Shankar <[email protected]> Reviewed-by: Anoop C S <[email protected]>
2 parents 9c0e8a5 + 162d029 commit e471ed3

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

src/libcephfs_proxy/libcephfsd.c

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
#include <stdio.h>
33
#include <stdlib.h>
44
#include <unistd.h>
5+
#include <sys/uio.h>
56
#include <getopt.h>
67
#include <endian.h>
8+
#include <string.h>
9+
#include <stdarg.h>
710

811
#include "include/cephfs/libcephfs.h"
912

@@ -1825,10 +1828,54 @@ static int32_t server_start(proxy_manager_t *manager)
18251828
accept_connection, check_stop);
18261829
}
18271830

1831+
static void log_format(struct iovec *iov, char *buffer, size_t size,
1832+
const char *fmt, const char *err, ...)
1833+
{
1834+
va_list args;
1835+
int32_t len;
1836+
1837+
va_start(args, err);
1838+
len = vsnprintf(buffer, size, fmt, args);
1839+
va_end(args);
1840+
1841+
if (len < 0) {
1842+
iov->iov_base = (void *)err;
1843+
iov->iov_len = strlen(err);
1844+
} else {
1845+
if (len >= size) {
1846+
memcpy(buffer + size - 6, "[...]", 6);
1847+
len = size - 1;
1848+
}
1849+
1850+
iov->iov_base = buffer;
1851+
iov->iov_len = len;
1852+
}
1853+
}
1854+
18281855
static void log_print(proxy_log_handler_t *handler, int32_t level, int32_t err,
18291856
const char *msg)
18301857
{
1831-
printf("[%d] %s\n", level, msg);
1858+
static const char level_chars[] = "CEWID";
1859+
1860+
char emsg[256];
1861+
char header[8];
1862+
struct iovec iov[3];
1863+
1864+
log_format(&iov[0], header, sizeof(header), "[%c] ", "[?] ",
1865+
level_chars[level]);
1866+
1867+
iov[1].iov_base = (void *)msg;
1868+
iov[1].iov_len = strlen(msg);
1869+
1870+
if (err != 0) {
1871+
log_format(&iov[2], emsg, sizeof(emsg), " (error %d: %s)\n",
1872+
" (error ?)\n", err, strerror(err));
1873+
} else {
1874+
iov[2].iov_base = "\n";
1875+
iov[2].iov_len = 1;
1876+
}
1877+
1878+
writev(STDOUT_FILENO, iov, 3);
18321879
}
18331880

18341881
static struct option main_opts[] = {

0 commit comments

Comments
 (0)