You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2019/10/01 22:48:59 UTC
[trafficserver] branch 9.0.x updated (a4090bf -> 225a8c9)
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a change to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git.
from a4090bf Update Server IP in Transaction when attaching a session from the pool
new 59b78e5 Convert check programs in iocore/eventsystem/ into Catch based unit tests
new d6d3510 Add unit tests for MIOBuffer:write()
new 225a8c9 Reduce unnecesary IOBufferBlock allocation
The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.gitignore | 4 +-
iocore/eventsystem/IOBuffer.cc | 13 +-
iocore/eventsystem/I_IOBuffer.h | 5 +-
iocore/eventsystem/Makefile.am | 32 +-
iocore/eventsystem/P_IOBuffer.h | 4 +-
iocore/eventsystem/test_Buffer.cc | 64 ----
iocore/eventsystem/test_Event.cc | 83 -----
iocore/eventsystem/unit_tests/test_EventSystem.cc | 101 ++++++
iocore/eventsystem/unit_tests/test_IOBuffer.cc | 361 ++++++++++++++++++++++
9 files changed, 495 insertions(+), 172 deletions(-)
delete mode 100644 iocore/eventsystem/test_Buffer.cc
delete mode 100644 iocore/eventsystem/test_Event.cc
create mode 100644 iocore/eventsystem/unit_tests/test_EventSystem.cc
create mode 100644 iocore/eventsystem/unit_tests/test_IOBuffer.cc
[trafficserver] 03/03: Reduce unnecesary IOBufferBlock allocation
Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 225a8c9fbb2a4cfbb80283f479eac21f1d519a0d
Author: Masaori Koshiba <ma...@apache.org>
AuthorDate: Tue Sep 3 16:23:00 2019 +0900
Reduce unnecesary IOBufferBlock allocation
- Add unit tests for MIOBuffer::write_avail()
- Do nothing when the next block of the current writer exists
(cherry picked from commit c40271ae7543a87bc90b4278954b79d304bb70b0)
---
iocore/eventsystem/IOBuffer.cc | 13 +-
iocore/eventsystem/I_IOBuffer.h | 5 +-
iocore/eventsystem/P_IOBuffer.h | 4 +-
iocore/eventsystem/unit_tests/test_IOBuffer.cc | 162 +++++++++++++++++++++++++
4 files changed, 179 insertions(+), 5 deletions(-)
diff --git a/iocore/eventsystem/IOBuffer.cc b/iocore/eventsystem/IOBuffer.cc
index e1a255a..d2c130b 100644
--- a/iocore/eventsystem/IOBuffer.cc
+++ b/iocore/eventsystem/IOBuffer.cc
@@ -60,6 +60,9 @@ init_buffer_allocators(int iobuffer_advice)
}
}
+//
+// MIOBuffer
+//
int64_t
MIOBuffer::remove_append(IOBufferReader *r)
{
@@ -173,6 +176,9 @@ MIOBuffer::puts(char *s, int64_t len)
return 0;
}
+//
+// IOBufferReader
+//
int64_t
IOBufferReader::read(void *ab, int64_t len)
{
@@ -262,6 +268,9 @@ IOBufferReader::memcpy(void *ap, int64_t len, int64_t offset)
return p;
}
+//
+// IOBufferChain
+//
int64_t
IOBufferChain::write(IOBufferBlock *blocks, int64_t length, int64_t offset)
{
@@ -349,7 +358,9 @@ IOBufferChain::consume(int64_t size)
return zret;
}
-//-- MIOBufferWriter
+//
+// MIOBufferWriter
+//
MIOBufferWriter &
MIOBufferWriter::write(const void *data_, size_t length)
{
diff --git a/iocore/eventsystem/I_IOBuffer.h b/iocore/eventsystem/I_IOBuffer.h
index e74bb15..9a85c63 100644
--- a/iocore/eventsystem/I_IOBuffer.h
+++ b/iocore/eventsystem/I_IOBuffer.h
@@ -950,9 +950,8 @@ public:
void append_block(int64_t asize_index);
/**
- Adds new block to the end of block list using the block size for
- the buffer specified when the buffer was allocated.
-
+ Adds a new block to the end of the block list. Note that this does nothing when the next block of the current writer exists.
+ The block size is the same as specified size when the buffer was allocated.
*/
void add_block();
diff --git a/iocore/eventsystem/P_IOBuffer.h b/iocore/eventsystem/P_IOBuffer.h
index c13202d..7252f48 100644
--- a/iocore/eventsystem/P_IOBuffer.h
+++ b/iocore/eventsystem/P_IOBuffer.h
@@ -987,7 +987,9 @@ MIOBuffer::append_block(int64_t asize_index)
TS_INLINE void
MIOBuffer::add_block()
{
- append_block(size_index);
+ if (this->_writer == nullptr || this->_writer->next == nullptr) {
+ append_block(size_index);
+ }
}
TS_INLINE void
diff --git a/iocore/eventsystem/unit_tests/test_IOBuffer.cc b/iocore/eventsystem/unit_tests/test_IOBuffer.cc
index f380bf0..8128ffb 100644
--- a/iocore/eventsystem/unit_tests/test_IOBuffer.cc
+++ b/iocore/eventsystem/unit_tests/test_IOBuffer.cc
@@ -173,6 +173,168 @@ TEST_CASE("MIOBuffer", "[iocore]")
free_MIOBuffer(miob);
}
+
+ SECTION("write_avail")
+ {
+ MIOBuffer *miob = new_MIOBuffer();
+ IOBufferReader *miob_r = miob->alloc_reader();
+ uint8_t buf[8192];
+ memset(buf, 0xAA, sizeof(buf));
+
+ // initial state
+ CHECK(miob->block_size() == 4096);
+ CHECK(miob->current_write_avail() == 4096);
+ CHECK(miob->write_avail() == 4096);
+
+ SECTION("water_mark == 0 (default)")
+ {
+ REQUIRE(miob->water_mark == 0);
+
+ // fill half of the current buffer
+ miob->write(buf, 2048);
+ CHECK(miob->max_read_avail() == 2048);
+ CHECK(miob->current_write_avail() == 2048);
+ CHECK(miob->high_water() == true);
+ CHECK(miob->current_low_water() == false);
+ CHECK(miob->write_avail() == 2048); ///< should have no side effect
+
+ // fill all of the current buffer
+ miob->write(buf, 2048);
+ CHECK(miob->max_read_avail() == 4096);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == true);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 0); ///< should have no side effect
+
+ // consume half of the data
+ miob_r->consume(2048);
+ CHECK(miob->max_read_avail() == 2048);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == true);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 0); ///< should have no side effect
+
+ // consume all of the data
+ miob_r->consume(2048);
+ CHECK(miob->max_read_avail() == 0);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 4096); ///< should have a side effect: add a new block
+
+ CHECK(miob->max_read_avail() == 0);
+ CHECK(miob->current_write_avail() == 4096);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == false);
+ CHECK(miob->write_avail() == 4096); ///< should have no side effect
+ }
+
+ SECTION("water_mark == half of block size")
+ {
+ miob->water_mark = 2048;
+ REQUIRE(miob->water_mark * 2 == miob->block_size());
+
+ // fill half of the current buffer
+ miob->write(buf, 2048);
+ CHECK(miob->max_read_avail() == 2048);
+ CHECK(miob->current_write_avail() == 2048);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 6144); ///< should have a side effect: add a new block
+
+ CHECK(miob->max_read_avail() == 2048);
+ CHECK(miob->current_write_avail() == 6144);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == false);
+ CHECK(miob->write_avail() == 6144); ///< should have no side effect
+
+ // fill all of the current buffer
+ miob->write(buf, 6144);
+ CHECK(miob->max_read_avail() == 8192);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == true);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 0); ///< should have no side effect
+
+ // consume half of the data
+ miob_r->consume(4096);
+ CHECK(miob->max_read_avail() == 4096);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == true);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 0); ///< should have no side effect
+
+ // consume all of the data
+ miob_r->consume(4096);
+ CHECK(miob->max_read_avail() == 0);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 4096); ///< should have a side effect: add a new block
+
+ CHECK(miob->max_read_avail() == 0);
+ CHECK(miob->current_write_avail() == 4096);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == false);
+ CHECK(miob->write_avail() == 4096); ///< should have no side effect
+ }
+
+ SECTION("water_mark == block_size()")
+ {
+ miob->water_mark = 4096;
+ REQUIRE(miob->water_mark == miob->block_size());
+
+ // fill half of the current buffer
+ miob->write(buf, 2048);
+ CHECK(miob->max_read_avail() == 2048);
+ CHECK(miob->current_write_avail() == 2048);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 6144); ///< should have a side effect: add a new block
+
+ CHECK(miob->max_read_avail() == 2048);
+ CHECK(miob->current_write_avail() == 6144);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == false);
+ CHECK(miob->write_avail() == 6144); ///< should have no side effect
+
+ // fill all of the current buffer
+ miob->write(buf, 6144);
+ CHECK(miob->max_read_avail() == 8192);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == true);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 0); ///< should have no side effect
+
+ // consume half of the data
+ miob_r->consume(4096);
+ CHECK(miob->max_read_avail() == 4096);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 4096); ///< should have a side effect: add a new block
+ IOBufferBlock *tail = miob->_writer->next.get();
+ CHECK(tail != nullptr);
+
+ CHECK(miob->max_read_avail() == 4096);
+ CHECK(miob->current_write_avail() == 4096);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 4096); ///< should have no side effect
+ CHECK(tail == miob->_writer->next.get()); ///< the tail block should not be changed
+
+ // consume all of the data
+ miob_r->consume(4096);
+ CHECK(miob->max_read_avail() == 0);
+ CHECK(miob->current_write_avail() == 4096);
+ CHECK(miob->high_water() == false);
+ CHECK(miob->current_low_water() == true);
+ CHECK(miob->write_avail() == 4096); ///< should have no side effect
+ CHECK(tail == miob->_writer->next.get()); ///< the tail block should not be changed
+ }
+
+ free_MIOBuffer(miob);
+ }
}
struct EventProcessorListener : Catch::TestEventListenerBase {
[trafficserver] 01/03: Convert check programs in
iocore/eventsystem/ into Catch based unit tests
Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit 59b78e5c297899d3a203a448bf2ed81f1e0f2406
Author: Masaori Koshiba <ma...@apache.org>
AuthorDate: Tue Aug 20 10:11:04 2019 +0900
Convert check programs in iocore/eventsystem/ into Catch based unit tests
(cherry picked from commit 39522703d7b9fdf4834b797e2d812f37f8970f71)
---
.gitignore | 4 +-
iocore/eventsystem/Makefile.am | 32 +++----
iocore/eventsystem/test_Buffer.cc | 64 --------------
iocore/eventsystem/test_Event.cc | 83 ------------------
iocore/eventsystem/unit_tests/test_EventSystem.cc | 101 ++++++++++++++++++++++
iocore/eventsystem/unit_tests/test_IOBuffer.cc | 72 +++++++++++++++
6 files changed, 189 insertions(+), 167 deletions(-)
diff --git a/.gitignore b/.gitignore
index c683ae3..23cdc5d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -117,8 +117,8 @@ iocore/net/quic/test_QUICType
iocore/net/quic/test_QUICTypeUtil
iocore/net/quic/test_QUICVersionNegotiator
iocore/aio/test_AIO
-iocore/eventsystem/test_Buffer
-iocore/eventsystem/test_Event
+iocore/eventsystem/test_IOBuffer
+iocore/eventsystem/test_EventSystem
iocore/eventsystem/test_MIOBufferWriter
iocore/hostdb/test_RefCountCache
diff --git a/iocore/eventsystem/Makefile.am b/iocore/eventsystem/Makefile.am
index 369bf55..970d0ba 100644
--- a/iocore/eventsystem/Makefile.am
+++ b/iocore/eventsystem/Makefile.am
@@ -69,7 +69,8 @@ libinkevent_a_SOURCES = \
UnixEvent.cc \
UnixEventProcessor.cc
-check_PROGRAMS = test_Buffer test_Event \
+check_PROGRAMS = test_IOBuffer \
+ test_EventSystem \
test_MIOBufferWriter
test_LD_FLAGS = \
@@ -85,6 +86,7 @@ test_CPP_FLAGS = \
-I$(abs_top_srcdir)/proxy/logging \
-I$(abs_top_srcdir)/mgmt \
-I$(abs_top_srcdir)/mgmt/utils \
+ -I$(abs_top_srcdir)/tests/include \
@OPENSSL_INCLUDES@
test_LD_ADD = \
@@ -92,29 +94,23 @@ test_LD_ADD = \
$(top_builddir)/lib/records/librecords_p.a \
$(top_builddir)/mgmt/libmgmt_p.la \
$(top_builddir)/iocore/eventsystem/libinkevent.a \
- $(top_builddir)/src/tscore/libtscore.la $(top_builddir)/src/tscpp/util/libtscpputil.la \
+ $(top_builddir)/src/tscore/libtscore.la \
+ $(top_builddir)/src/tscpp/util/libtscpputil.la \
$(top_builddir)/proxy/shared/libUglyLogStubs.a \
@HWLOC_LIBS@
-test_Buffer_SOURCES = \
- test_Buffer.cc
-
-test_Event_SOURCES = \
- test_Event.cc
-
-test_Buffer_CPPFLAGS = $(test_CPP_FLAGS)
-test_Event_CPPFLAGS = $(test_CPP_FLAGS)
-
-test_Buffer_LDFLAGS = $(test_LD_FLAGS)
-test_Event_LDFLAGS = $(test_LD_FLAGS)
-
-test_Buffer_LDADD = $(test_LD_ADD)
-test_Event_LDADD = $(test_LD_ADD)
+test_EventSystem_SOURCES = unit_tests/test_EventSystem.cc
+test_EventSystem_CPPFLAGS = $(test_CPP_FLAGS)
+test_EventSystem_LDFLAGS = $(test_LD_FLAGS)
+test_EventSystem_LDADD = $(test_LD_ADD)
+test_IOBuffer_SOURCES = unit_tests/test_IOBuffer.cc
+test_IOBuffer_CPPFLAGS = $(test_CPP_FLAGS)
+test_IOBuffer_LDFLAGS = $(test_LD_FLAGS)
+test_IOBuffer_LDADD = $(test_LD_ADD)
test_MIOBufferWriter_SOURCES = unit_tests/test_MIOBufferWriter.cc
-
-test_MIOBufferWriter_CPPFLAGS = $(test_CPP_FLAGS) -I$(abs_top_srcdir)/tests/include
+test_MIOBufferWriter_CPPFLAGS = $(test_CPP_FLAGS)
test_MIOBufferWriter_LDFLAGS = $(test_LD_FLAGS)
test_MIOBufferWriter_LDADD = $(test_LD_ADD)
diff --git a/iocore/eventsystem/test_Buffer.cc b/iocore/eventsystem/test_Buffer.cc
deleted file mode 100644
index ccef103..0000000
--- a/iocore/eventsystem/test_Buffer.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/** @file
-
- A brief file description
-
- @section license License
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
-#include "I_EventSystem.h"
-#include "tscore/I_Layout.h"
-#include "tscore/ink_string.h"
-
-#include "diags.i"
-
-#define TEST_TIME_SECOND 60
-#define TEST_THREADS 2
-
-int
-main(int /* argc ATS_UNUSED */, const char * /* argv ATS_UNUSED */ [])
-{
- RecModeT mode_type = RECM_STAND_ALONE;
-
- Layout::create();
- init_diags("", nullptr);
- RecProcessInit(mode_type);
-
- ink_event_system_init(EVENT_SYSTEM_MODULE_PUBLIC_VERSION);
- eventProcessor.start(TEST_THREADS);
-
- Thread *main_thread = new EThread;
- main_thread->set_specific();
-
- for (unsigned i = 0; i < 100; ++i) {
- MIOBuffer *b1 = new_MIOBuffer(default_large_iobuffer_size);
- IOBufferReader *b1reader ATS_UNUSED = b1->alloc_reader();
- b1->fill(b1->write_avail());
-
- MIOBuffer *b2 = new_MIOBuffer(default_large_iobuffer_size);
- IOBufferReader *b2reader ATS_UNUSED = b2->alloc_reader();
- b2->fill(b2->write_avail());
-
- // b1->write(b2reader, 2*1024);
-
- free_MIOBuffer(b2);
- free_MIOBuffer(b1);
- }
-
- exit(0);
-}
diff --git a/iocore/eventsystem/test_Event.cc b/iocore/eventsystem/test_Event.cc
deleted file mode 100644
index 78c47bb..0000000
--- a/iocore/eventsystem/test_Event.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/** @file
-
- A brief file description
-
- @section license License
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
-#include "I_EventSystem.h"
-#include "tscore/I_Layout.h"
-#include "tscore/TSSystemState.h"
-
-#include "diags.i"
-
-#define TEST_TIME_SECOND 60
-#define TEST_THREADS 2
-
-static int count;
-
-struct alarm_printer : public Continuation {
- alarm_printer(ProxyMutex *m) : Continuation(m) { SET_HANDLER(&alarm_printer::dummy_function); }
- int
- dummy_function(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
- {
- ink_atomic_increment((int *)&count, 1);
- printf("Count = %d\n", count);
- return 0;
- }
-};
-struct process_killer : public Continuation {
- process_killer(ProxyMutex *m) : Continuation(m) { SET_HANDLER(&process_killer::kill_function); }
- int
- kill_function(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
- {
- printf("Count is %d \n", count);
- if (count <= 0) {
- exit(1);
- }
- if (count > TEST_TIME_SECOND * TEST_THREADS) {
- exit(1);
- }
- exit(0);
- return 0;
- }
-};
-
-int
-main(int /* argc ATS_UNUSED */, const char * /* argv ATS_UNUSED */ [])
-{
- RecModeT mode_type = RECM_STAND_ALONE;
- count = 0;
-
- Layout::create();
- init_diags("", nullptr);
- RecProcessInit(mode_type);
-
- ink_event_system_init(EVENT_SYSTEM_MODULE_PUBLIC_VERSION);
- eventProcessor.start(TEST_THREADS, 1048576); // Hardcoded stacksize at 1MB
-
- alarm_printer *alrm = new alarm_printer(new_ProxyMutex());
- process_killer *killer = new process_killer(new_ProxyMutex());
- eventProcessor.schedule_in(killer, HRTIME_SECONDS(10));
- eventProcessor.schedule_every(alrm, HRTIME_SECONDS(1));
- while (!TSSystemState::is_event_system_shut_down()) {
- sleep(1);
- }
- return 0;
-}
diff --git a/iocore/eventsystem/unit_tests/test_EventSystem.cc b/iocore/eventsystem/unit_tests/test_EventSystem.cc
new file mode 100644
index 0000000..75faad2
--- /dev/null
+++ b/iocore/eventsystem/unit_tests/test_EventSystem.cc
@@ -0,0 +1,101 @@
+/** @file
+
+ Catch based unit tests for EventSystem
+
+ @section license License
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+
+#include "I_EventSystem.h"
+#include "tscore/I_Layout.h"
+#include "tscore/TSSystemState.h"
+
+#include "diags.i"
+
+#define TEST_TIME_SECOND 60
+#define TEST_THREADS 2
+
+TEST_CASE("EventSystem", "[iocore]")
+{
+ static int count;
+
+ struct alarm_printer : public Continuation {
+ alarm_printer(ProxyMutex *m) : Continuation(m) { SET_HANDLER(&alarm_printer::dummy_function); }
+
+ int
+ dummy_function(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
+ {
+ ink_atomic_increment((int *)&count, 1);
+
+ EThread *e = this_ethread();
+ printf("thread=%d (%p) count = %d\n", e->id, e, count);
+
+ return 0;
+ }
+ };
+
+ struct process_killer : public Continuation {
+ process_killer(ProxyMutex *m) : Continuation(m) { SET_HANDLER(&process_killer::kill_function); }
+
+ int
+ kill_function(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
+ {
+ EThread *e = this_ethread();
+ printf("thread=%d (%p) count is %d\n", e->id, e, count);
+
+ REQUIRE(count > 0);
+ REQUIRE(count <= TEST_TIME_SECOND * TEST_THREADS);
+
+ TSSystemState::shut_down_event_system();
+
+ return 0;
+ }
+ };
+
+ alarm_printer *alrm = new alarm_printer(new_ProxyMutex());
+ process_killer *killer = new process_killer(new_ProxyMutex());
+ eventProcessor.schedule_in(killer, HRTIME_SECONDS(10));
+ eventProcessor.schedule_every(alrm, HRTIME_SECONDS(1));
+
+ while (!TSSystemState::is_event_system_shut_down()) {
+ sleep(1);
+ }
+}
+
+struct EventProcessorListener : Catch::TestEventListenerBase {
+ using TestEventListenerBase::TestEventListenerBase;
+
+ void
+ testRunStarting(Catch::TestRunInfo const &testRunInfo) override
+ {
+ Layout::create();
+ init_diags("", nullptr);
+ RecProcessInit(RECM_STAND_ALONE);
+
+ ink_event_system_init(EVENT_SYSTEM_MODULE_PUBLIC_VERSION);
+ eventProcessor.start(TEST_THREADS, 1048576); // Hardcoded stacksize at 1MB
+
+ EThread *main_thread = new EThread;
+ main_thread->set_specific();
+ }
+};
+
+CATCH_REGISTER_LISTENER(EventProcessorListener);
diff --git a/iocore/eventsystem/unit_tests/test_IOBuffer.cc b/iocore/eventsystem/unit_tests/test_IOBuffer.cc
new file mode 100644
index 0000000..d3fd5d3
--- /dev/null
+++ b/iocore/eventsystem/unit_tests/test_IOBuffer.cc
@@ -0,0 +1,72 @@
+/** @file
+
+ Catch based unit tests for IOBuffer
+
+ @section license License
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+
+#define CATCH_CONFIG_MAIN
+#include "catch.hpp"
+
+#include "I_EventSystem.h"
+#include "tscore/I_Layout.h"
+
+#include "diags.i"
+
+#define TEST_THREADS 1
+
+TEST_CASE("MIOBuffer", "[iocore]")
+{
+ for (unsigned i = 0; i < 100; ++i) {
+ MIOBuffer *b1 = new_MIOBuffer(default_small_iobuffer_size);
+ int64_t len1 = b1->write_avail();
+ IOBufferReader *b1reader = b1->alloc_reader();
+ b1->fill(len1);
+ CHECK(b1reader->read_avail() == len1);
+
+ MIOBuffer *b2 = new_MIOBuffer(default_large_iobuffer_size);
+ int64_t len2 = b1->write_avail();
+ IOBufferReader *b2reader = b2->alloc_reader();
+ b2->fill(len2);
+ CHECK(b2reader->read_avail() == len2);
+
+ free_MIOBuffer(b2);
+ free_MIOBuffer(b1);
+ }
+}
+
+struct EventProcessorListener : Catch::TestEventListenerBase {
+ using TestEventListenerBase::TestEventListenerBase;
+
+ void
+ testRunStarting(Catch::TestRunInfo const &testRunInfo) override
+ {
+ Layout::create();
+ init_diags("", nullptr);
+ RecProcessInit(RECM_STAND_ALONE);
+
+ ink_event_system_init(EVENT_SYSTEM_MODULE_PUBLIC_VERSION);
+ eventProcessor.start(TEST_THREADS);
+
+ EThread *main_thread = new EThread;
+ main_thread->set_specific();
+ }
+};
+
+CATCH_REGISTER_LISTENER(EventProcessorListener);
[trafficserver] 02/03: Add unit tests for MIOBuffer:write()
Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch 9.0.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit d6d35100b9eb5cc71db3a1b908395062986484cf
Author: Masaori Koshiba <ma...@apache.org>
AuthorDate: Fri Aug 23 15:06:03 2019 +0900
Add unit tests for MIOBuffer:write()
(cherry picked from commit 6751fd0d41f083d6481a1387b89bb55f0d4c7261)
---
iocore/eventsystem/unit_tests/test_IOBuffer.cc | 159 ++++++++++++++++++++++---
1 file changed, 143 insertions(+), 16 deletions(-)
diff --git a/iocore/eventsystem/unit_tests/test_IOBuffer.cc b/iocore/eventsystem/unit_tests/test_IOBuffer.cc
index d3fd5d3..f380bf0 100644
--- a/iocore/eventsystem/unit_tests/test_IOBuffer.cc
+++ b/iocore/eventsystem/unit_tests/test_IOBuffer.cc
@@ -24,30 +24,154 @@
#define CATCH_CONFIG_MAIN
#include "catch.hpp"
-#include "I_EventSystem.h"
#include "tscore/I_Layout.h"
+#include "I_EventSystem.h"
+#include "RecordsConfig.h"
+
#include "diags.i"
#define TEST_THREADS 1
TEST_CASE("MIOBuffer", "[iocore]")
{
- for (unsigned i = 0; i < 100; ++i) {
- MIOBuffer *b1 = new_MIOBuffer(default_small_iobuffer_size);
- int64_t len1 = b1->write_avail();
- IOBufferReader *b1reader = b1->alloc_reader();
- b1->fill(len1);
- CHECK(b1reader->read_avail() == len1);
-
- MIOBuffer *b2 = new_MIOBuffer(default_large_iobuffer_size);
- int64_t len2 = b1->write_avail();
- IOBufferReader *b2reader = b2->alloc_reader();
- b2->fill(len2);
- CHECK(b2reader->read_avail() == len2);
-
- free_MIOBuffer(b2);
- free_MIOBuffer(b1);
+ // These value could be tweaked by `ink_event_system_init()` using `proxy.config.io.max_buffer_size`
+ REQUIRE(default_small_iobuffer_size == DEFAULT_SMALL_BUFFER_SIZE);
+ REQUIRE(default_large_iobuffer_size == DEFAULT_LARGE_BUFFER_SIZE);
+
+ REQUIRE(BUFFER_SIZE_FOR_INDEX(default_small_iobuffer_size) == 512);
+ REQUIRE(BUFFER_SIZE_FOR_INDEX(default_large_iobuffer_size) == 4096);
+
+ SECTION("new_MIOBuffer 100 times")
+ {
+ int64_t read_avail_len1 = 0;
+ int64_t read_avail_len2 = 0;
+
+ for (unsigned i = 0; i < 100; ++i) {
+ MIOBuffer *b1 = new_MIOBuffer(default_small_iobuffer_size);
+ int64_t len1 = b1->write_avail();
+ IOBufferReader *b1reader = b1->alloc_reader();
+ b1->fill(len1);
+ read_avail_len1 += b1reader->read_avail();
+
+ MIOBuffer *b2 = new_MIOBuffer(default_large_iobuffer_size);
+ int64_t len2 = b2->write_avail();
+ IOBufferReader *b2reader = b2->alloc_reader();
+ b2->fill(len2);
+ read_avail_len2 += b2reader->read_avail();
+
+ free_MIOBuffer(b2);
+ free_MIOBuffer(b1);
+ }
+
+ CHECK(read_avail_len1 == 100 * BUFFER_SIZE_FOR_INDEX(default_small_iobuffer_size));
+ CHECK(read_avail_len2 == 100 * BUFFER_SIZE_FOR_INDEX(default_large_iobuffer_size));
+ }
+
+ SECTION("write")
+ {
+ MIOBuffer *miob = new_MIOBuffer();
+ IOBufferReader *miob_r = miob->alloc_reader();
+ const IOBufferBlock *block = miob->first_write_block();
+
+ SECTION("initial state")
+ {
+ CHECK(miob->size_index == default_large_iobuffer_size);
+ CHECK(miob->water_mark == 0);
+ CHECK(miob->first_write_block() != nullptr);
+ CHECK(miob->block_size() == 4096);
+ CHECK(miob->block_write_avail() == 4096);
+ CHECK(miob->current_write_avail() == 4096);
+ CHECK(miob->write_avail() == 4096);
+
+ CHECK(miob->max_read_avail() == 0);
+ CHECK(miob_r->read_avail() == 0);
+ }
+
+ SECTION("write(const void *rbuf, int64_t nbytes)")
+ {
+ SECTION("1K")
+ {
+ uint8_t buf[1024];
+ memset(buf, 0xAA, sizeof(buf));
+
+ int64_t written = miob->write(buf, sizeof(buf));
+
+ REQUIRE(written == sizeof(buf));
+
+ CHECK(miob->block_size() == 4096);
+ CHECK(miob->block_write_avail() == 3072);
+ CHECK(miob->current_write_avail() == 3072);
+ CHECK(miob->write_avail() == 3072);
+
+ CHECK(miob->first_write_block() == block);
+
+ CHECK(miob->max_read_avail() == sizeof(buf));
+ CHECK(miob_r->read_avail() == sizeof(buf));
+ }
+
+ SECTION("4K")
+ {
+ uint8_t buf[4096];
+ memset(buf, 0xAA, sizeof(buf));
+
+ int64_t written = miob->write(buf, sizeof(buf));
+
+ REQUIRE(written == sizeof(buf));
+
+ CHECK(miob->block_size() == 4096);
+ CHECK(miob->block_write_avail() == 0);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->write_avail() == 0);
+
+ CHECK(miob->first_write_block() == block);
+
+ CHECK(miob->max_read_avail() == sizeof(buf));
+ CHECK(miob_r->read_avail() == sizeof(buf));
+ }
+
+ SECTION("5K")
+ {
+ uint8_t buf[5120];
+ memset(buf, 0xAA, sizeof(buf));
+
+ int64_t written = miob->write(buf, sizeof(buf));
+
+ REQUIRE(written == sizeof(buf));
+
+ CHECK(miob->block_size() == 4096);
+ CHECK(miob->block_write_avail() == 3072);
+ CHECK(miob->current_write_avail() == 3072);
+ CHECK(miob->write_avail() == 3072);
+
+ CHECK(miob->first_write_block() != block);
+
+ CHECK(miob->max_read_avail() == sizeof(buf));
+ CHECK(miob_r->read_avail() == sizeof(buf));
+ }
+
+ SECTION("8K")
+ {
+ uint8_t buf[8192];
+ memset(buf, 0xAA, sizeof(buf));
+
+ int64_t written = miob->write(buf, sizeof(buf));
+
+ REQUIRE(written == sizeof(buf));
+
+ CHECK(miob->block_size() == 4096);
+ CHECK(miob->block_write_avail() == 0);
+ CHECK(miob->current_write_avail() == 0);
+ CHECK(miob->write_avail() == 0);
+
+ CHECK(miob->first_write_block() != block);
+
+ CHECK(miob->max_read_avail() == sizeof(buf));
+ CHECK(miob_r->read_avail() == sizeof(buf));
+ }
+ }
+
+ free_MIOBuffer(miob);
}
}
@@ -61,6 +185,9 @@ struct EventProcessorListener : Catch::TestEventListenerBase {
init_diags("", nullptr);
RecProcessInit(RECM_STAND_ALONE);
+ // Initialize LibRecordsConfig for `proxy.config.io.max_buffer_size` (32K)
+ LibRecordsConfigInit();
+
ink_event_system_init(EVENT_SYSTEM_MODULE_PUBLIC_VERSION);
eventProcessor.start(TEST_THREADS);