93 Commits

Author SHA1 Message Date
Josef Grieb
d990b99a6b
Added error handling for io_uring creation failure (#10561)
Motivation:

we should throw a jvm runtime exception for io_uring creation failure to avoid a NullPointerException

Modifications:

-error handling for creation ring fd and mmap io_uring ring buffer
-some cleanups

Result:

better error handling
2020-09-10 16:25:17 +02:00
Nick Hill
90674b4fce
Simplify SQE handling (#10544)
Motivation

SQE handling can be simplified in terms of code and operations
performed

Modifications

- Zero SQE array up front - no need to set never-used fields each time
- Fill SQ array up front with corresponding indicies - no need to set
each time since they are 1-1 with SQE array entries
- Keep local head and tail vars and don't track separate sqe array
head/tail
- Allocate memory for timespec directly (no need for ByteBuffer)
- Avoid some unnecessary casts / type conversions (no need to convert
uints to longs)

Result

Fewer operations, less code
2020-09-10 13:25:34 +02:00
Nick Hill
2316c2ce45
Exploit blocking FAST_POLL for eventfd reads (#10543)
Motivation

If we make eventfd blocking then read can take the place of poll+read

Modification

Make eventfd blocking, use READ instead of POLLIN, allocating a static
64bit buffer to read into

Result

Fewer kernel roundtrips for event loop wakeups
2020-09-10 07:37:39 +02:00
Norman Maurer
d933a9dd56
Move IovArray handling code in an extra class to better seperate it and (#10559)
easier to test.

Motivation:

We should move the IovArray related code to an extra class so its easier
to test

Modifications:

- Move into extra class
- Add dedicated test

Result:

Cleanup
2020-09-09 20:30:48 +02:00
Norman Maurer
dd63d1c8d0
Allow to specify a callback that is executed once submit was called and (#10555)
use it for clearing the IovArrays

Motivation:

IOUringSubmissionQueue may call submit() internally when there is no
space left in the buffer. Once this is done we can reuse for example
IovArrays etc. Because of this its useful to be able to specify a
callback that is executed after submission

Modifications:

- Allow to specify a Runnable that is called once submission was
complete
- Use this callback to clear the IovArrays

Result:

IovArrays are automatically cleared on each submit call.
2020-09-09 17:18:47 +02:00
Norman Maurer
044ec159b9
Only schedule another read if the FD is still open (#10551)
Motivation:

We should only keep on reading if the fd is still open, otherwise we
will produce a confusing exception

Modifications:

check if fd is still open before schedule the read.

Result:

Dont produce a confusing excepion when the fd was closed during a read
loop.
2020-09-09 11:43:46 +02:00
Norman Maurer
8ef5dbc24b
Only execute the close once the already added write operations completes (#10538)
Motivation:

We need to be careful that we only execute the close(...) once the write
operation completes as otherwise we may close the underlying socket too
fast and also the writes

Modifications:

Keep track of if we need to delay the close or not and if so execute it
once the write completes

Result:

No more test failures
2020-09-09 11:42:37 +02:00
Norman Maurer
5ee1f2c7ec
Handle when io_uring_enter(...) fails with EINTR (#10540)
Motivation:

It is possible that io_uring_enter(...) fails with EINTR. In this case
we should just retry the operation

Modifications:

Retry when EINTR was detected

Result:

More correct use of io_uring_enter(...)
2020-09-09 10:05:14 +02:00
Norman Maurer
5bd6611c0e
Explicit need to specify -Piouring-native to compile the native bits … (#10546)
Motivation:

At the moment our CI can not build and run the native bits for the iouring transport so we should just not compile this at the moment. The java classes itself should still be compiled tho

Modifications:

Add explicit profile to compile native bits of iouring

Result:

CI passes with iouring transport
2020-09-09 09:50:36 +02:00
Norman Maurer
7a34f1e6c5
Fix AssertionError caused by incorrect for loop (#10554)
Motivation:

incorrect for loop we could end up with an AssertionError (this is
sometimes triggered during testsuite run)

Modifications:

Fix for loop that calls IovArray.clear()

Result:

No more AssertionError
2020-09-09 09:18:29 +02:00
Norman Maurer
f6474e66de
Use multiple IovArray for writev when using io_uring based transport (#10549)
Motivation:

How we did manage the memory of writev was quite wasteful and could
produce a lot of memory overhead. We can just keep it simple by using
an array of IovArrays. Once these are full we can just submit and clear these as at this
point the kernel did take over a copy and its safe to reuse

Modifications:

Use an array of IovArrays and submit once it is full.

Result:

Less memory overhead and less code duplication
2020-09-08 21:23:38 +02:00
Norman Maurer
47bfcd2e80
Remove workaround for previous io_uring bug related to IOSQE_ASYNC and (#10547)
IOURING_OP_WRITEV

Motivation:

The bug related to IOSQE_ASYNC and IORING_OP_WRITEV was fixed so no need
to have the workaround

Modifications:

Remove workaround

Result:

Use IOSQE_ASYNC all the time
2020-09-08 10:50:41 +02:00
Norman Maurer
9da59c3894
Fix reentrancy bug in io_uring transport implementation related to (#10541)
writes

Motivation:

We need to carefully manage state in terms of writing to guard against
rentrancy problems that could lead to corrupt state in the
ChannelOutboundBuffer

Modifications:

Only reset the flag once removeBytes(...) was called

Result:

No more reentrancy bug related to writes.
2020-09-08 08:43:46 +02:00
Norman Maurer
9b296c8034
Update README to reflect kernel requirements for iouring transport (#10539)
Motivation:

kernel 5.9-rc4 was released that ships all fixes we need

Modifications:

Update readme

Result:

Make it clear what kernel is needed
2020-09-07 12:05:49 +02:00
Norman Maurer
ddb503f76d Fix checkstyle errors 2020-09-07 10:29:41 +02:00
Josef Grieb
8c465e2f1b
Merge pull request #35 from normanmaurer/jni_constants
Lookup constants via JNI
2020-09-05 11:10:08 +02:00
Norman Maurer
ccd5a6e411 Add workaround for current kernel bug related to WRITEV and IOSEQ_ASYNC
Motivation:

There is currently a bug in the kernel that let WRITEV sometimes fail
when IOSEQ_ASYNC is enabled

Modifications:

Don't use IOSEQ_ASYNC for WRITEV for now

Result:

Tests pass
2020-09-05 10:22:02 +02:00
Norman Maurer
dfca811648 Lookup constants via JNI
Motivation:

We should better use JNI to lookup constants so we are sure we not mess
things up

Modifications:

Use JNI calls to lookup constants once

Result:

Less error prone code
2020-09-05 09:40:02 +02:00
Norman Maurer
1c42a37f67 Use IOSQE_ASYNC flag when submitting
Motivation:

At least in the throughput benchmarks it has shown that IOSQE_ASYNC
gives a lot of performance improvements. Lets enable it by default for
now and maybe make it configurable in the future

Modifications:

Use IOSEQ_ASYNC

Result:

Better performance
2020-09-04 20:22:28 +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
Josef Grieb
9e13c5cfd9
Merge pull request #30 from normanmaurer/handle_complete_cleanup
Call handle.readComplete() before fireChannlReadComplete() and also c…
2020-09-04 06:43:20 +02:00
Norman Maurer
0631824dcd Call handle.readComplete() before fireChannlReadComplete() and also cleanup some code 2020-09-03 18:40:44 +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
1440b4fa0c Add more missing tests 2020-09-03 14:51:54 +02:00
Josef Grieb
a55313ed75
Merge pull request #27 from normanmaurer/close_group
Call IOUringEventLoopGroup.shutdownGracefully() after test is done.
2020-09-03 10:15:12 +02:00
Norman Maurer
e1c6f111f5 Call IOUringEventLoopGroup.shutdownGracefully() after test is done. 2020-09-03 09:47:36 +02:00
Norman Maurer
f57fcd6c4a Do support SO_BACKLOG in io_uring
Motivation:

Due a bug SO_BACKLOG was not supported via ChannelOption when using io_uring. Be

Modification:

- Add SO_BACKLOG to the supported ChannelOptions.
- Merge IOUringServerChannelConfig into IOUringServerSocketChannelConfig

Result:

SO_BACKLOG is supported
2020-09-03 09:40:55 +02:00
Josef Grieb
5691fe8a44 Fix addTimeout when sqe is full
Motivation:

when sqe is full -> no timeout is added to the sqe

Modifications:

it is called submit() to flush the sqe entries to add timeout

Result:
2020-09-03 07:48:58 +02:00
Josef Grieb
59f77c24b9 Move initAddress to LinuxSocket JNI
Motivation:

we should move the initAddress to LinuxSocket JNI as it is only used there

Modifications:

- cleanup
- move initAddress to linux socket JNI

Result:

it's cleaner
2020-09-03 07:22:02 +02:00
Josef Grieb
66ff2a2e23
Merge pull request #24 from normanmaurer/missing_tests
Add last missing tests
2020-09-02 14:46:47 +02:00
Norman Maurer
c0dc26a2f6 Add last missing tests 2020-09-02 14:45:03 +02:00
Josef Grieb
823eaaffb3
Merge pull request #22 from normanmaurer/static_native
Obtain static fields via JNI and not duplicate their values
2020-09-02 14:32:53 +02:00
Norman Maurer
47f199653f Remove @Ignore from test 2020-09-02 14:18:49 +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
0a0cc8a7c0 Correctly implement IOUringSubmissionQueue.addTimeout(...) and ensure we always call runAllTasks()
Motivation:

We did have a bug in how we calculated the values for the timespec which lead to incorrect wakeups. Beside this we also missed to always call runAllTasks() which is needed to fetch the ready to be executed scheduled tasks.

Modifications:

- Fix timespec setup
- Always call runAllTasks()
- Add extra testcase
- Remove @Ignore from previous failing test

Result:

Timeouts work as expected
2020-09-02 10:16:26 +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
9e6a3d6483 Add more tests from the testsuite for io_uring
Motivation:

We need more testing for io_uring to be consistent with the others transports

Modifications:

Add more tests by extending the testsuite (still some to add) and mark failing tests as ignore. These ignored tests should be fixed one by one in followup commits

Results:

More testing
2020-09-01 21:22:07 +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
05d8897025 Correctly handle POLLRDHUP registration in all cases
Motivation:

When accepting a Channel we did register it for POLLRDHUP, but unfortunally we used the IOUringSubmissionQueue that is tied to the IOUringEventLoop that is used for the ServerChannel. This is not correct as the EventLoop used for the accepted Channel may be different.

Modification:

Move logic into doRegister() and so register for POLLRDHUP on the right IOURingSubmissionQueue

Result:

Correct POLLRDHUP handling
2020-09-01 10:57:06 +02:00
Norman Maurer
663c44cd45 Correctly respect RecvByteBufAllocator.Handle when reading
Motivation:

We need to respect RecvByteBufAllocator.Handle.continueReading() so settings like MAX_MESSAGES_PER_READ are respected. This also ensures that AUTO_READ is correctly working in all cases

Modifications:

- Correctly respect continueReading();
- Fix IOUringRecvByteAllocatorHandle
- Cleanup

Result:

Correctly handling reading
2020-09-01 10:49:09 +02:00
Norman Maurer
8e5b5400e6 Correctly build up entry for POLL_REMOVE so we find the right operation
Motivation:

We did not correctly compute all fields when POLL_REMOVE entry was calculate. Which could lead to not finding the right operation.

Modifications:

- Correctly fill all fields
- Fix unit tests

Result:

Remove IO_POLL operations work again as expected
2020-08-31 21:23:45 +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
2820edc207 Fixed SubmissionQueue full issue
Motivation:

we should use kHead(with acquire memory barrier) instead of sqeHead as submit() is called internally when sqe is full

Modification:

-submit is called internally when sqe is full
-added a new sqe full test

Result:

you no longer need to check if the sqe is full when you add a new event
2020-08-31 07:01:25 +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