mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Smarter way to increase the parent/child pipe's socket buffer. (Craig
Leres). This is from #383.
This commit is contained in:
parent
51b3efbb1a
commit
4d12ac861d
2 changed files with 37 additions and 19 deletions
|
@ -544,6 +544,36 @@ void RemoteSerializer::Init()
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RemoteSerializer::SetSocketBufferSize(int fd, int opt, const char *what, int size, int verbose)
|
||||||
|
{
|
||||||
|
int defsize = 0;
|
||||||
|
socklen_t len = sizeof(defsize);
|
||||||
|
|
||||||
|
if ( getsockopt(fd, SOL_SOCKET, opt, (void *)&defsize, &len) < 0 )
|
||||||
|
{
|
||||||
|
if ( verbose )
|
||||||
|
Log(LogInfo, fmt("warning: cannot get socket buffer size (%s): %s", what, strerror(errno)));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( int trysize = size; trysize > defsize; trysize -= 1024 )
|
||||||
|
{
|
||||||
|
if ( setsockopt(fd, SOL_SOCKET, opt, &trysize, sizeof(trysize)) >= 0 )
|
||||||
|
{
|
||||||
|
if ( verbose )
|
||||||
|
{
|
||||||
|
if ( trysize == size )
|
||||||
|
Log(LogInfo, fmt("raised pipe's socket buffer size from %dK to %dK", defsize / 1024, trysize / 1024));
|
||||||
|
else
|
||||||
|
Log(LogInfo, fmt("raised pipe's socket buffer size from %dK to %dK (%dK was requested)", defsize / 1024, trysize / 1024, size / 1024));
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log(LogInfo, fmt("warning: cannot increase %s socket buffer size from %dK (%dK was requested)", what, defsize / 1024, size / 1024));
|
||||||
|
}
|
||||||
|
|
||||||
void RemoteSerializer::Fork()
|
void RemoteSerializer::Fork()
|
||||||
{
|
{
|
||||||
if ( child_pid )
|
if ( child_pid )
|
||||||
|
@ -562,25 +592,11 @@ void RemoteSerializer::Fork()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bufsize;
|
// Try to increase the size of the socket send and receive buffers.
|
||||||
socklen_t len = sizeof(bufsize);
|
SetSocketBufferSize(pipe[0], SO_SNDBUF, "SO_SNDBUF", SOCKBUF_SIZE, 1);
|
||||||
|
SetSocketBufferSize(pipe[0], SO_RCVBUF, "SO_RCVBUF", SOCKBUF_SIZE, 0);
|
||||||
if ( getsockopt(pipe[0], SOL_SOCKET, SO_SNDBUF, &bufsize, &len ) < 0 )
|
SetSocketBufferSize(pipe[1], SO_SNDBUF, "SO_SNDBUF", SOCKBUF_SIZE, 0);
|
||||||
Log(LogInfo, fmt("warning: cannot get socket buffer size: %s", strerror(errno)));
|
SetSocketBufferSize(pipe[1], SO_RCVBUF, "SO_RCVBUF", SOCKBUF_SIZE, 0);
|
||||||
else
|
|
||||||
Log(LogInfo, fmt("pipe's socket buffer size is %d, setting to %d", bufsize, SOCKBUF_SIZE));
|
|
||||||
|
|
||||||
bufsize = SOCKBUF_SIZE;
|
|
||||||
|
|
||||||
if ( setsockopt(pipe[0], SOL_SOCKET, SO_SNDBUF,
|
|
||||||
&bufsize, sizeof(bufsize) ) < 0 ||
|
|
||||||
setsockopt(pipe[0], SOL_SOCKET, SO_RCVBUF,
|
|
||||||
&bufsize, sizeof(bufsize) ) < 0 ||
|
|
||||||
setsockopt(pipe[1], SOL_SOCKET, SO_SNDBUF,
|
|
||||||
&bufsize, sizeof(bufsize) ) < 0 ||
|
|
||||||
setsockopt(pipe[1], SOL_SOCKET, SO_RCVBUF,
|
|
||||||
&bufsize, sizeof(bufsize) ) < 0 )
|
|
||||||
Log(LogInfo, fmt("warning: cannot set socket buffer size to %dK: %s", bufsize / 1024, strerror(errno)));
|
|
||||||
|
|
||||||
child_pid = 0;
|
child_pid = 0;
|
||||||
|
|
||||||
|
|
|
@ -297,6 +297,8 @@ protected:
|
||||||
bool SendToChild(char type, Peer* peer, int nargs, ...); // can send uints32 only
|
bool SendToChild(char type, Peer* peer, int nargs, ...); // can send uints32 only
|
||||||
bool SendToChild(ChunkedIO::Chunk* c);
|
bool SendToChild(ChunkedIO::Chunk* c);
|
||||||
|
|
||||||
|
void SetSocketBufferSize(int fd, int opt, const char *what, int size, int verbose);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum { TYPE, ARGS } msgstate; // current state of reading comm.
|
enum { TYPE, ARGS } msgstate; // current state of reading comm.
|
||||||
Peer* current_peer;
|
Peer* current_peer;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue