Module: check_mk
Branch: master
Commit: 522aa2062a56acc56444bc5a4b5305ca55b11b3b
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=522aa2062a56ac…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Thu Jan 21 15:54:46 2016 +0100
Make InputBuffer's underlying buffer grow dynamically.
We start at 4k (seems to be more than enough for the common cases), and
impose a rather arbitrary upper bound of 500MB. We can make this
configurable if we want, but for now it's just hard-wired.
---
livestatus/src/InputBuffer.cc | 18 ++++++++++++------
livestatus/src/InputBuffer.h | 2 --
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/livestatus/src/InputBuffer.cc b/livestatus/src/InputBuffer.cc
index f4fd7ab..de84973 100644
--- a/livestatus/src/InputBuffer.cc
+++ b/livestatus/src/InputBuffer.cc
@@ -39,9 +39,11 @@ using std::string;
extern int g_query_timeout_msec;
extern int g_idle_timeout_msec;
-const size_t InputBuffer::buffer_size;
-
namespace {
+const size_t initial_buffer_size = 4096;
+// TODO: Make this configurable?
+const size_t maximum_buffer_size = 500 * 1024 * 1024;
+
const int read_timeout_usec = 200000;
bool timeout_reached(const struct timeval *start, int timeout_ms)
@@ -65,7 +67,7 @@ pair<list<string>, InputBuffer::Result>
failure(InputBuffer::Result r)
InputBuffer::InputBuffer(int fd, const int *termination_flag)
: _fd(fd)
, _termination_flag(termination_flag)
- , _readahead_buffer(buffer_size)
+ , _readahead_buffer(initial_buffer_size)
{
_read_index = 0; // points to data not yet processed
_write_index = 0; // points to end of data in buffer
@@ -164,10 +166,14 @@ pair<list<string>, InputBuffer::Result>
InputBuffer::readRequest()
// continue -> still no data in buffer, but it will
// be read, as now is space
}
- // buffer is full, but still no end of line found => buffer is too small
+ // buffer is full, but still no end of line found
else {
- logger(LG_INFO, "Error: maximum length of request line
exceeded");
- return failure(Result::line_too_long);
+ size_t new_capacity = _readahead_buffer.capacity() * 2;
+ if (new_capacity > maximum_buffer_size) {
+ logger(LG_INFO, "Error: maximum length of request line
exceeded");
+ return failure(Result::line_too_long);
+ }
+ _readahead_buffer.resize(new_capacity);
}
}
else // end of line found
diff --git a/livestatus/src/InputBuffer.h b/livestatus/src/InputBuffer.h
index 89b7d15..b358d84 100644
--- a/livestatus/src/InputBuffer.h
+++ b/livestatus/src/InputBuffer.h
@@ -49,8 +49,6 @@ public:
std::pair<std::list<std::string>, Result> readRequest();
private:
- static const size_t buffer_size = 65536;
-
int _fd;
const int *_termination_flag;
std::vector<char> _readahead_buffer;