Skip to content

Commit 928a62b

Browse files
authored
buffer: add a method for getting only the first slice (envoyproxy#14050)
Signed-off-by: Greg Greenway <[email protected]>
1 parent e4fd69d commit 928a62b

File tree

11 files changed

+42
-17
lines changed

11 files changed

+42
-17
lines changed

include/envoy/buffer/buffer.h

+8
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,14 @@ class Instance {
160160
virtual RawSliceVector
161161
getRawSlices(absl::optional<uint64_t> max_slices = absl::nullopt) const PURE;
162162

163+
/**
164+
* Fetch the valid data pointer and valid data length of the first non-zero-length
165+
* slice in the buffer.
166+
* @return RawSlice the first non-empty slice in the buffer, or {nullptr, 0} if the buffer
167+
* is empty.
168+
*/
169+
virtual RawSlice frontSlice() const PURE;
170+
163171
/**
164172
* Transfer ownership of the front slice to the caller. Must only be called if the
165173
* buffer is not empty otherwise the implementation will have undefined behavior.

source/common/buffer/buffer_impl.cc

+11
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,17 @@ RawSliceVector OwnedImpl::getRawSlices(absl::optional<uint64_t> max_slices) cons
201201
return raw_slices;
202202
}
203203

204+
RawSlice OwnedImpl::frontSlice() const {
205+
// Ignore zero-size slices and return the first slice with data.
206+
for (const auto& slice : slices_) {
207+
if (slice->dataSize() > 0) {
208+
return RawSlice{slice->data(), slice->dataSize()};
209+
}
210+
}
211+
212+
return {nullptr, 0};
213+
}
214+
204215
SliceDataPtr OwnedImpl::extractMutableFrontSlice() {
205216
RELEASE_ASSERT(length_ > 0, "Extract called on empty buffer");
206217
// Remove zero byte fragments from the front of the queue to ensure

source/common/buffer/buffer_impl.h

+1
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,7 @@ class OwnedImpl : public LibEventInstance {
564564
void copyOut(size_t start, uint64_t size, void* data) const override;
565565
void drain(uint64_t size) override;
566566
RawSliceVector getRawSlices(absl::optional<uint64_t> max_slices = absl::nullopt) const override;
567+
RawSlice frontSlice() const override;
567568
SliceDataPtr extractMutableFrontSlice() override;
568569
uint64_t length() const override;
569570
void* linearize(uint32_t size) override;

source/common/buffer/zero_copy_input_stream_impl.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ void ZeroCopyInputStreamImpl::drainLastSlice() {
2929
bool ZeroCopyInputStreamImpl::Next(const void** data, int* size) {
3030
drainLastSlice();
3131

32-
Buffer::RawSliceVector slices = buffer_->getRawSlices(1);
32+
Buffer::RawSlice slice = buffer_->frontSlice();
3333

34-
if (!slices.empty() && slices[0].len_ > 0) {
35-
auto& slice = slices[0];
34+
if (slice.len_ > 0) {
3635
*data = slice.mem_;
3736
*size = slice.len_;
3837
position_ = slice.len_;

source/extensions/quic_listeners/quiche/active_quic_listener.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,11 @@ void ActiveQuicListener::onDataWorker(Network::UdpRecvData&& data) {
110110
quic::QuicTime::Delta::FromMicroseconds(std::chrono::duration_cast<std::chrono::microseconds>(
111111
data.receive_time_.time_since_epoch())
112112
.count());
113-
ASSERT(data.buffer_->getRawSlices().size() == 1);
114-
Buffer::RawSliceVector slices = data.buffer_->getRawSlices(/*max_slices=*/1);
113+
Buffer::RawSlice slice = data.buffer_->frontSlice();
114+
ASSERT(data.buffer_->length() == slice.len_);
115115
// TODO(danzh): pass in TTL and UDP header.
116-
quic::QuicReceivedPacket packet(reinterpret_cast<char*>(slices[0].mem_), slices[0].len_,
117-
timestamp, /*owns_buffer=*/false, /*ttl=*/0, /*ttl_valid=*/false,
116+
quic::QuicReceivedPacket packet(reinterpret_cast<char*>(slice.mem_), slice.len_, timestamp,
117+
/*owns_buffer=*/false, /*ttl=*/0, /*ttl_valid=*/false,
118118
/*packet_headers=*/nullptr, /*headers_length=*/0,
119119
/*owns_header_buffer*/ false);
120120
quic_dispatcher_->ProcessPacket(self_address, peer_address, packet);

source/extensions/quic_listeners/quiche/envoy_quic_client_connection.cc

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ void EnvoyQuicClientConnection::processPacket(
6262
std::chrono::duration_cast<std::chrono::microseconds>(receive_time.time_since_epoch())
6363
.count());
6464
ASSERT(buffer->getRawSlices().size() == 1);
65-
Buffer::RawSliceVector slices = buffer->getRawSlices(/*max_slices=*/1);
66-
quic::QuicReceivedPacket packet(reinterpret_cast<char*>(slices[0].mem_), slices[0].len_,
67-
timestamp, /*owns_buffer=*/false, /*ttl=*/0, /*ttl_valid=*/false,
65+
Buffer::RawSlice slice = buffer->frontSlice();
66+
quic::QuicReceivedPacket packet(reinterpret_cast<char*>(slice.mem_), slice.len_, timestamp,
67+
/*owns_buffer=*/false, /*ttl=*/0, /*ttl_valid=*/false,
6868
/*packet_headers=*/nullptr, /*headers_length=*/0,
6969
/*owns_header_buffer*/ false);
7070
ProcessUdpPacket(envoyIpAddressToQuicSocketAddress(local_address->ip()),

source/extensions/quic_listeners/quiche/platform/quic_mem_slice_impl.cc

+2-6
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,11 @@ QuicMemSliceImpl::QuicMemSliceImpl(Envoy::Buffer::Instance& buffer, size_t lengt
2929
}
3030

3131
const char* QuicMemSliceImpl::data() const {
32-
Envoy::Buffer::RawSliceVector slices = single_slice_buffer_.getRawSlices(/*max_slices=*/1);
33-
ASSERT(slices.size() <= 1);
34-
return !slices.empty() ? static_cast<const char*>(slices[0].mem_) : nullptr;
32+
return reinterpret_cast<const char*>(single_slice_buffer_.frontSlice().mem_);
3533
}
3634

3735
size_t QuicMemSliceImpl::firstSliceLength(Envoy::Buffer::Instance& buffer) {
38-
Envoy::Buffer::RawSliceVector slices = buffer.getRawSlices(/*max_slices=*/1);
39-
ASSERT(slices.size() == 1);
40-
return slices[0].len_;
36+
return buffer.frontSlice().len_;
4137
}
4238

4339
} // namespace quic

test/common/buffer/buffer_fuzz.cc

+2
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ class StringBuffer : public Buffer::Instance {
126126
return {{const_cast<char*>(start()), size_}};
127127
}
128128

129+
Buffer::RawSlice frontSlice() const override { return {const_cast<char*>(start()), size_}; }
130+
129131
uint64_t length() const override { return size_; }
130132

131133
void* linearize(uint32_t /*size*/) override {

test/common/buffer/owned_impl_test.cc

+7
Original file line numberDiff line numberDiff line change
@@ -1256,6 +1256,13 @@ TEST_F(OwnedImplTest, MoveSmallSliceIntoNotEnoughFreeSpace) {
12561256
TestBufferMove(4096 - 127, 128, 2);
12571257
}
12581258

1259+
TEST_F(OwnedImplTest, FrontSlice) {
1260+
Buffer::OwnedImpl buffer;
1261+
EXPECT_EQ(0, buffer.frontSlice().len_);
1262+
buffer.add("a");
1263+
EXPECT_EQ(1, buffer.frontSlice().len_);
1264+
}
1265+
12591266
} // namespace
12601267
} // namespace Buffer
12611268
} // namespace Envoy

test/extensions/filters/network/postgres_proxy/postgres_decoder_test.cc

+1
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,7 @@ class FakeBuffer : public Buffer::Instance {
523523
MOCK_METHOD(void, copyOut, (size_t, uint64_t, void*), (const, override));
524524
MOCK_METHOD(void, drain, (uint64_t), (override));
525525
MOCK_METHOD(Buffer::RawSliceVector, getRawSlices, (absl::optional<uint64_t>), (const, override));
526+
MOCK_METHOD(Buffer::RawSlice, frontSlice, (), (const, override));
526527
MOCK_METHOD(Buffer::SliceDataPtr, extractMutableFrontSlice, (), (override));
527528
MOCK_METHOD(uint64_t, length, (), (const, override));
528529
MOCK_METHOD(void*, linearize, (uint32_t), (override));

test/per_file_coverage.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ declare -a KNOWN_LOW_COVERAGE=(
7272
"source/extensions/wasm_runtime/wavm:0.0" # Noe enabled in coverage build
7373
"source/extensions/watchdog:69.6" # Death tests within extensions
7474
"source/extensions/watchdog/profile_action:84.9"
75-
"source/server:94.6"
75+
"source/server:94.5"
7676
"source/server/config_validation:76.6"
7777
"source/server/admin:95.2"
7878
)

0 commit comments

Comments
 (0)