Commit Graph

39 Commits

Author SHA1 Message Date
Norman Maurer
381493999d WIP 2020-09-07 15:47:44 +02:00
Norman Maurer
ddb503f76d Fix checkstyle errors 2020-09-07 10:29:41 +02:00
Norman Maurer
6545d80d23 Submit IO in batches to reduce overhead
Motivation:

We should submit multiple IO ops at once to reduce the syscall overhead.

Modifications:

- Submit multiple IO ops in batches
- Adjust default ringsize

Result:

Much better performance
2020-09-04 17:09:46 +02:00
Norman Maurer
3b35976559 Fix bug related to reset the RecvByteBufAllocator.Handle on each read
Motivation:

We should only reset the RecvByteBufAllocator.Handle when a new "read
loop" starts. Otherwise the handle will not be able to correctly limit
reads.

Modifications:

- Move reset(...) call into pollIn(...)
- Remove all @Ignore

Result:

The whole testsuite passes
2020-09-03 16:14:24 +02:00
Norman Maurer
74fd0c1375 Obtain static fields via JNI and not duplicate their values
Motivation:

To ensure we use the correct values when passing values from Java to C and the other way around it is better to use JNI to lookup the values.

Modifications:

Add NativeStaticallyRefererencedJniMethods and use it (just as we do in kqueue / epoll)

Results:

More robust code
2020-09-02 14:14:29 +02:00
Norman Maurer
c0ddac2c83 Correctly obtain localAddress after connect was complete
Motivation:

We need to cache the localAddress after the connect was complete

Modifications:

- Call socket.localAddress() after the connect was complete
- Enable test again

Result:

Correctly set localAddress after connect was successful
2020-09-02 10:25:03 +02:00
Norman Maurer
5423eb9401 Fix bug that would case an IllegalStateException when closeForcibly() is called and the Channel is not registered yet. 2020-09-02 09:25:27 +02:00
Norman Maurer
3e8e2cc0eb Use bitmasking to reduce the number of boolean variables and so save some memory per instance 2020-09-02 09:16:26 +02:00
Norman Maurer
5d7d52954b Correctly handle CompositeByteBuf when using IOURING
Motivation:

CompositeByteBuf need some special handling as well as we have multiple buffers wrapped that needs to be written via writev.

Modification:

Also handle ByteBuf with more then one nioBuffer special.

Result:

Writing CompositeByteBuf works
2020-09-01 16:06:01 +02:00
Norman Maurer
614323e132 Fix failure during accept(...)
Motivation:

Sometimes accept failed as we not correctly set the active variable when constructing the server channel. This lead to the situation that we tried to add POLLIN before the channel become active and so tried to call accept before it was listen.

Modifications:

- Use the correct constructor
- Cleanup

Result:

No more accept failures.
2020-09-01 14:10:39 +02:00
Norman Maurer
28db67c42b Correctly stop reading when AUTO_READ is set to off and also ensure we cancel the right poll operations 2020-08-31 17:39:08 +02:00
Norman Maurer
186b9eb6ab Correctly release memory for remote address and some code cleanup 2020-08-31 13:22:34 +02:00
Norman Maurer
e41c68b151 Only register for POLLRDHUP when the channel is active and include IURING for client side in tests
Motivation:

Due a bug we did not include the IOURING based transport for clients in the testsuite. When enabling this it failed due a bug related to when we register POLLRDHUP.

Modification:

- Include IOURING clients in testsuite
- Register for RDHUP on the right time

Result:

Correctly handle RDHUP and also test IOURING for clients
2020-08-31 11:38:56 +02:00
Josef Grieb
242890899e Fixed segmentation fault error in IovecArrayPool
Motivation:

segmentation is caused in IovecArrayPool.release because the default of iovecMemoryAddress is 0

Modification:

-set default to -1
-some cleanups
-added new testsuite tests

Result:

fixed segmentation error
2020-08-31 06:41:46 +02:00
Norman Maurer
076c35f785 Fallback to simple write when we can not allocate iovec array and correctly handle poll mask 2020-08-30 21:13:52 +02:00
Norman Maurer
a3585492e9 Correctly handle POLL*, handle errors, cleanup
Motivation:

We not correctly handled errors and also had some problems with home POLL* was handled.

Modifictions:

- Cleanup
- No need to for links anymore
- Add error handling for most operations (poll still missing)
- Add better handling for RDHUP
- Correctly handle writeScheduled flag for writev

Result:

Cleaner and more correct code
2020-08-30 14:41:39 +02:00
Josef Grieb
37944ccffd Add writev operation
Motivation:

writev which allows to write data into multiple buffers

Modification:

-Added iovec array pool to manage iov memory
-flush override to make sure that write is not called

Result:

performance is much better
2020-08-29 21:22:15 +02:00
Josef Grieb
9a5449a790 Poll & tests cleanups
Motivation:

we should remove pollIn link, as we don't use pollIn linking anymore

Modification:

-some cleanups in the tests and in IOUring
-pollIn linking was removed

Result:

clean code
2020-08-29 10:40:17 +02:00
Norman Maurer
b863aacad4 Correctly handle polling
Motivation:

We must correctly use the polling support of io_uring to reduce the number of events in flight + only allocate buffers if really needed. For this we should respect the different poll masks and only do the corresponding IO action once the fd becomes ready for it.

Modification:

- Correctly respect poll masks and so only schedule an IO event if the fd is ready for it
- Move some code for cleanup

Result:

More correct usage of io_uring and less memory usage
2020-08-28 17:00:03 +02:00
Josef Grieb
8096b2c15f Add connect
Motivation:

if connect returns EINPROGRESS we send POLL OUT and check
via socket.finishConnect if the connection is successful

Modifications:

-added new io_uring connect op
-use a directbuffer for the socket address

Result:

you are able to connect to a peer
2020-08-28 09:26:35 +02:00
Josef Grieb
56ace4228f Fix server socket address already in use error even if close is called
Motivation:

when you submit a poll, io_uring still hold reference to it even if close is called
source io_uring mailing list(https://lore.kernel.org/io-uring/27657840-4E8E-422D-93BB-7F485F21341A@kernel.dk/T/#t)

Modification:

-To delete fd reference in io_uring, we use POLL_REMOVE to avoid a server socket address error
-Added a POLL_REMOVE test

Result:

server can be closed and restarted
2020-08-27 06:33:17 +02:00
Josef Grieb
6ab424f3c6 Fix checkstyle errors
Motivation:

-to fix checkstyle error and missing licence

Modification:

-Added missing license and fixed checkstyle error

Result:

it's a non functional change
2020-08-26 14:12:41 +02:00
Norman Maurer
49449b300e Reduce GC by remove creation of objects related to completion queue and submission queue
Motivation:

We did create a lot of objects related to the completion queue and submission queue which produced a lot of GC. Beside this we also did maintain an extra map which is not really needed as we can encode everything that we need in the user_data field.

Modification:

- Reduce complexity and GC pressure by store needed informations in the user_data field
- Small refactoring of the code to move channel related logic to the channel
- Remove unused classes
- Use callback to process stuff in the completion queue and so remove all GC created by it
- Simplify by not storing channel and buffer in the event

Result:

Less GC pressure and no extra lookups for events needed
2020-08-26 12:32:27 +02:00
Norman Maurer
191f0de6ee Make logging less noisy 2020-08-25 17:22:30 +02:00
Josef Grieb
d9b3f293a5 Add read exception handling to shutdown channels
Motivation:

-at the moment we dont shutdown when we get a read error message
-missing autoread support

Modifications:

-even if autoread is disable, should do check if the read event is already submitted
-added new Handle exception method to shutdown the channels

Result:

EL read event can handle read errors
2020-08-24 11:12:40 +02:00
Josef Grieb
b10b4ca6e7 Add polling POLLOUT
Motivation:

no checks for non writeable sockets

Modifications:

-Added a linked write poll to make sure that the socket does not write if it is not writeable
-Added a new boolean to avoid to submit a second write operation

Result:

writeable socket check
2020-08-24 11:12:40 +02:00
Josef Grieb
0160284301 Add abstract stream channel
Motivation:

to shutdown child channels we should create new abstact client class instead of using AbstractIOUringChannel

Modifications:

-Added new child channel abstract class
-Add shutdown methods to close a channel when the connection is lost

Result:

the channels can be closed when the connection is lost
2020-08-24 11:12:40 +02:00
Josef Grieb
8d464d5ab4 Include LinuxSocket TCP options
Motivation:

some tcp options (like TcpFastopen or TcpFastopenConnect etc.) are required for testsuite tests

Modification:

-copied the class LinuxSocket from epoll and  JNI to load this module in io_uring jni
-some configurations have been adjusted

Result:

more tcp options are available
2020-08-24 11:12:40 +02:00
Josef Grieb
71c33eaec3 Add Poll before the accept/read operation
Motivation:

The problem is that if io_uring accept/read non blocking doesnt return -EAGAIN for non-blocking sockets
in general, then it removes a way for the application to tell if
there's ever any data there.
There is a fix in Kernel 5.8 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v5.8&id=e697deed834de15d2322d0619d51893022c90ea2 which means we need to add poll before the accept/read event(poll<link>read/accept) to fix in netty as well

Modification:

-add poll before the accept/read event with this flag IOSQE_IO_LINK

Result:

netty prototype works on Kernel 5.8
2020-08-10 09:53:38 +02:00
Josef Grieb
d3c28143a8 Cleanup PR
Motivation:

unnecessary use of LinuxSocket class, missing CRLF etc.

Modification:

-Add CRLF
-remove IOUringChannelConfig and LinuxSocket class

Result:
less code and cleanup
2020-07-28 22:52:32 +02:00
Josef Grieb
a29b8c5cb3 write all messages
Motivation:

write until there is nothing left in the buffer

Modification:

eventloop executes the next write event

Result:
write all messages
2020-07-28 21:36:11 +02:00
Josef Grieb
97b4537ab1 Use socket non-blocking instead of blocking
Motivation:

non-blocking sockets are more efficient

Modification:
-use socket non blocking
-some PR cleanups

Result:
probably better performance
2020-07-27 20:41:26 +02:00
Josef Grieb
eb1c8e4991 Cleanup
Motivation:

fix checkstyle errors and many classes are unnecessarily public

Modification:
-fixed maven checkstyle errors
-using package-private and final classes

Result:
better code quality
2020-07-22 14:01:48 +02:00
Josef Grieb
8c9b874a2d First running prototype 🎉
Motivation:
missing eventLoop completionQueue logic

Modification:
-mapping between channel and eventloop
-added new prototype blocking example

Result:
First running prototype
2020-07-20 23:49:00 +02:00
Josef Grieb
247e14a2b1 Add channel configs
Motivation:
-missing channel configs
-we dont store byteBuf and channel for the read operation to execute channel.fireChannelReadComplete

Modifications:
-add channels configs
-new Event properties for the processing completionQueue

Result:
with these changes it will be much easier to implement the eventloop
2020-07-15 17:51:51 +02:00
Josef Grieb
692238f6da Move ring buffer logic to Java
Motivation:
JNI ring buffer implementation is inflexible and not really efficient

Modifications:

-RingBuffer instance is created in JNI which contains io_uring ring buffer information
-move the JNI ring buffer logic to Java
-added Todos
-using unsafe memory barriers loadFence and storeFence
-revert epoll file

Result:

this java ring buffer implementation is more flexible and efficient
2020-07-07 13:06:45 +02:00
Josef Grieb
962a3433ca Added io_uring JNI
Motivation:

prototype is not buildable and JNI io_uring implementation is missing

Modifications:

-added io_uring implementation(source from https://github.com/axboe/liburing)
-eventloop stores netty io_uring pointer which is used for two ring buffers to execute events like read and write operations in JNI
-memory barriers already included in JNI(will be changed in the future)
-pom file adopted from native epoll

Result:

prototype can finally be built
2020-06-28 15:25:19 +02:00
Josef Grieb
187ec6dffd Cleanup
Motivation:
licenses and netty dependencies are missing

Modification:
added licenses and netty dependencies

Result:
netty io_uring is buidable
2020-06-26 09:18:36 +02:00
Josef Grieb
07e2e23a7d Draft - Add native io_uring transport
Motivation:
to get a better feeling of how it could be implemented

Result:
- cant be build yet -> still work in progress
2020-06-19 13:01:33 +02:00