Don't copy every byte read into arena

This commit is contained in:
2025-08-20 15:21:15 -04:00
parent 7f4c024efa
commit 60cda698c0
3 changed files with 6 additions and 14 deletions

View File

@@ -47,11 +47,7 @@ void Connection::appendMessage(std::string_view s, bool copyToArena) {
} }
} }
std::string_view Connection::readBytes(size_t /*max_request_size*/, std::string_view Connection::readBytes(char *buf, size_t buffer_size) {
size_t buffer_size) {
// Use Variable Length Array for optimal stack allocation
char buf[buffer_size];
int r = read(fd_, buf, buffer_size); int r = read(fd_, buf, buffer_size);
if (r == -1) { if (r == -1) {
if (errno == EINTR || errno == EAGAIN) { if (errno == EINTR || errno == EAGAIN) {
@@ -63,11 +59,7 @@ std::string_view Connection::readBytes(size_t /*max_request_size*/,
if (r == 0) { if (r == 0) {
return {}; // EOF - let server handle connection cleanup return {}; // EOF - let server handle connection cleanup
} }
return {buf, size_t(r)};
// Copy data to arena for persistent storage
char *arena_data = arena_.allocate<char>(r);
std::memcpy(arena_data, buf, r);
return {arena_data, size_t(r)};
} }
bool Connection::writeBytes() { bool Connection::writeBytes() {

View File

@@ -349,7 +349,7 @@ private:
ConnectionHandler *handler, std::weak_ptr<Server> server); ConnectionHandler *handler, std::weak_ptr<Server> server);
// Networking interface - only accessible by Server // Networking interface - only accessible by Server
std::string_view readBytes(size_t max_request_size, size_t buffer_size); std::string_view readBytes(char *buf, size_t buffer_size);
bool writeBytes(); bool writeBytes();
void tsan_acquire(); void tsan_acquire();
void tsan_release(); void tsan_release();

View File

@@ -318,9 +318,9 @@ void Server::start_network_threads() {
} }
if (events[i].events & EPOLLIN) { if (events[i].events & EPOLLIN) {
std::string_view data = auto buf_size = config_.server.read_buffer_size;
conn->readBytes(config_.server.max_request_size_bytes, char buf[buf_size];
config_.server.read_buffer_size); std::string_view data = conn->readBytes(buf, buf_size);
if (data.empty()) { if (data.empty()) {
// No data, error, or EOF - connection should be closed // No data, error, or EOF - connection should be closed