Commit Graph

1749 Commits

Author SHA1 Message Date
Saleem Abdulrasool f44d524d56
NIO: use `Posix` "namespace" more aggressively (#1439)
Convert many more cases of the raw address family constant to the
definition in the System version.
2020-03-11 17:31:53 +00:00
Kaitlin Mahar a8e08d9757
BlockingIOThreadPool -> NIOThreadPool (#1438)
Update NonBlockingFileIO.init documentation to match the new type name.
2020-03-11 08:35:39 +00:00
Saleem Abdulrasool 7103febd74
NIO: undo exclusion of UDS on Windows (#1437)
This is in-scope for Windows now.
2020-03-09 17:38:10 +00:00
Saleem Abdulrasool 35078406c7
CNIOSHA1: make the code more portable (#1399)
Replace the non-portable `u_*_t` types with the C standard `u*_t` types
instead.  Remove the Unix headers as the only headers really needed are
the C standard headers.  Provide shims for deprecated `strings.h`
functions in terms of "modern" (C89+) functions from `string.h`.  Move
an android only include into the implementation from the interface.

This enables building this library on Windows.

Co-Authored-By: George Barnett <gbrntt@gmail.com>
Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-03-09 16:15:38 +00:00
Johannes Weiss ffb196f544
Thread: repair build on Windows after #1433 (#1434)
This repairs the build on Windows after the thread implementation was
split out.
2020-03-05 08:32:51 +00:00
Doug Friedman 51238f4df8
Prevent execution of tasks on an already shutdown EL (#1395)
* prevent execution of tasks on an already shutdown EL

* fixup! prevent execution of tasks on an already shutdown EL

* fixup! prevent execution of tasks on an already shutdown EL

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-03-04 17:20:13 +00:00
Shekhar Rajak 95f014c9ba
use Posix.read instead of Glibc.read for timerfd (#1432)
Motivation:

To read the bytes from timerfd, we use Glibc.read directly but we should use try! Posix.read

Modifications:

Using Posix instead of Glibc for read operation with try! to check for any error.

Result:

Fixes #1341

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-03-04 16:51:30 +00:00
Shekhar Rajak 2900f03352
ByteToMessageDecoder: Default implementation for decodeLast should be provided (#1426)
* removed decodeLast function from NIOChatServer

* updated decodeLast function from WebSocketFrameDecoder

* default implementation of decodeLast function

* removed implementation of decodeLast in WebSocketFrameDecoder
2020-03-04 16:22:06 +00:00
Johannes Weiss a5e35655e6
fix macOS build & cleanup Thread (#1433)
Motivation:

The macOS build was broken by #1424, also the Thread.swift file became
a bit of a mess with `#if os(...)/#else` everywhere.

Modifications:

- fix macOS build
- cleanup Thread by splitting it into ThreadPosix & ThreadWindows

Result:

- build working again
- cleaner code
2020-03-04 15:12:10 +00:00
Saleem Abdulrasool 546a84c4e1
Thread: port to Windows (#1424)
This restructures `Thread` to have a more generic representation of a
thread handle.  Using that it is possible to have an implementation of
the threading APIs for Windows.

Similarly, introduce an abstraction over the Thread Specific Key.  This
allows us to abstract away the key type and the usage.

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-03-03 20:21:45 +00:00
Saleem Abdulrasool 5e728b5786
NIOConcurrencyHelpers: port to Windows (#1403)
Add support for Windows to the `NIOConcurrencyHelpers`, replacing the
`pthreads` usage for Windows threading primitives.

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-03-03 19:18:59 +00:00
Johannes Weiss 8912d1a48b
tests: improve tests that are supposed to throw (#1430)
Motivation:

The

    do {
        try someOperation()
	XCTFail("should throw") // easy to forget
    } catch error as SomethingError {
        XCTAssertEqual(.something, error as? SomethingError)
    } catch {
        XCTFail("wrong error")
    }

pattern is not only very long, it's also very error prone. If you forget
any of the XCTFails, you might not tests what it looks like

    XCTAssertThrowsError(try someOperation) { error in
        XCTAssertEqual(.something, error as? SomethingError)
    }

is much safer and shorter.

Modifcations:

Do many of the above replaces.

Result:

Cleaner, shorter, and safer tests.
2020-03-03 18:14:49 +00:00
Johannes Weiss 2512b8e277
fix more warnings from master Swift compilers (#1396)
Motivation:

The latest Swift compilers have again added new (great) warnings which
some NIO tests tripped over.

Modifications:

- fix the warnings
- fix/improve some tests

Result:

better code, fewer warnings
2020-03-03 11:59:06 +01:00
Johannes Weiss 4d4b9ab4b9
list_topsorted_deps: multiple fixes (#1420)
Motivation:

list_topsorted_dependencies had multiple issues:
- it would list some executable targets (even in libs-only mode)
- it confused packages with modules
- it would also list dependencies from outside the current package

Modifications:

Address all of the above.

Result:

Script more useful, inside and outside of swift-nio.

Co-authored-by: David Evans <david.evans@blackpoint.co>
2020-03-02 15:49:09 +00:00
Marcus Liotta 5755c21a61
Add offset writes and file size support to NonBlockingFileIO (#1408)
* Add offset writes and file size support to NonBlockingFileIO

Motivation:

NonBlockingFileIO currently only supports writes from 0 or appending,
if opened with O_APPEND. To facilitate random read/write file access
the API needs to evolve.

Modifications:

- Add toOffset function parameter to write for offset file write access
- Add changeFileSize function for growing or shrinking the file
- Add readFileSize function for asynchronously reading the file size

Result:

- Improve API for random access scenarios
- Provide method for reading and writing file size

* Conform to code review

* Formatting

* Update Sources/NIO/NonBlockingFileIO.swift

Co-Authored-By: Johannes Weiss <johannesweiss@apple.com>

* Update Sources/NIO/NonBlockingFileIO.swift

Co-Authored-By: Johannes Weiss <johannesweiss@apple.com>

* Modify offset handling to support partial writes.
Clean up stray comment.

* Fix precondition check within offset pwrite handling

* Improve guard for readability

* White space cleanup

* Single spacing issue

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-03-02 11:02:05 +00:00
tomer doron 9030326196
update docs generation script to work better with selinux (#1419)
motivation: docs scripts is broken on selinux due to restriction on ssh-agent

changes: change the jazzy workspace to a directory accessible by the CI node so we can push from the agent instead of from the docker container
2020-02-28 12:48:43 -08:00
George Barnett 0bb5b77cee
Add SSWG badge to README (#1421)
Motivation:

SSWG guidelines recommend that accepted projects list their maturity
level in their README with an appropriate badge.

Modifications:

- Add SSWG graduated badge to README
- Add that gRPC is a SSWG community project

Result:

- A badgier README
2020-02-28 15:37:34 +00:00
Kyle Browning 06cdd7f619
Allow discardable results on NIOAtomic for mutating functions (#1417)
* Allow discardable results on NIOAtomic for mutating functions

* Address nits.

* add a tests.

* Removes discards.
2020-02-26 21:43:35 +00:00
Saleem Abdulrasool 1595c42b9a
CNIOAtomics: define types for `uintptr_t` and `intptr_t` (#1401)
On LLP64 hosts, `Int` is mapped to `intptr_t` and `UInt` to `uintptr_t`.
As a result, we need to ensure that we map the atomic extensions to
those types for type conversions.

Add the types for `uintptr_t` and `intptr_t` so that they can be used to
implement `CNIOConcurrencyHelpers` on Windows.

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-02-26 17:07:39 +00:00
trungducc 8ad2549a49
Stop copying Strings into Arrays for SHA1 (#1413)
Motivation:

Resolve #1409

Modifications:

Using withContiguousStorageIfAvailable if string.utf8 supports an internal representation in a form. Otherwise, fall back to use withUnsafeBufferPointer.

Result:

Save an allocation for each hash function update
2020-02-25 08:52:36 +00:00
Shekhar Rajak dfd56c8b56
undo @convention(c) hacks in System.swift (#1412)
Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-02-25 07:51:07 +00:00
Shekhar Rajak 58a80c300e
Use UInt instead of ObjectIdentifier in promiseCreationStore (#1411)
* Use UInt instead of ObjectIdentifier in promiseCreationStore

* defined obfuscatePointerValue method
2020-02-24 17:01:16 +00:00
Saleem Abdulrasool 2c555d144a
NIOConcurrencyHelpers: make LLP64 friendly (#1402)
On LLP64 platforms, `Int` is mapped to `intptr_t` and `UInt` is mapped
to `uintptr_t`.  Use the newly minted `CNIOAtomics` operations to
support these semantics.

Co-authored-by: Cory Benfield <lukasa@apple.com>
Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-02-19 19:05:58 +00:00
PeterAdams76 0db1cd5318
Add custom index methods to ByteBufferView (#1394)
Motivation:

The performance of firstIndex and lastIndex is
dramatically improved by addding custom
indexing methods as detailed in issue 1385.

Modifications:

Added methods to ByteBufferView:
_customIndexOfEquatableElement
for firstIndex
_customLastIndexOfEquatableElement
for lastIndex

Added a unit test for firstIndex and lastIndex
to ensure functional behaviour is unchanged.

Result:

firstIndex and lastIndex behave as before.

Performance is improved by approximately 20% for
the shortest searches.
When tested searching over 1024 byte buffer
with either no match or a match at the end
I observed approximately 15 times performance

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-02-19 18:12:38 +00:00
Johannes Weiss 4022c91507
test that massive chunked encoding chunks behave sensibly (#1407)
Motivation:

Was talking about chunked encoding with @adtrevor, so I thought let's
actually capture it in a test.

Modifications:

- add a test

Result:

- more tests
2020-02-19 13:24:24 +00:00
Saleem Abdulrasool 1832cff669
CNIOAtomics: declare atomic operations using a macro (#1400)
Use a macro to define the interface for the typed atomics.  This reduces
the boiler plate that is expanded by hand.  More importantly, it makes
it easier to add new types in the future.

Co-authored-by: Cory Benfield <lukasa@apple.com>
2020-02-18 10:24:20 +00:00
Saleem Abdulrasool ca9f613bbc
NIO: excise UDS support for Windows (#1404)
This removes support for Unix Domain Sockets from NIO on Windows.
Although Windows 10.17063 introduced basic support for UDS, the support
is incomplete and has differences from the tradtional UDS sockets in
terms of behaviour.  Excise the support initially to get NIO to build on
Windows.

Co-authored-by: Cory Benfield <lukasa@apple.com>
2020-02-18 09:36:18 +00:00
Saleem Abdulrasool e5f32c0b6e
gitignore: ignore vim swap files (#1398) 2020-02-18 07:46:42 +00:00
Johannes Weiss 16ab4d657e
add AcceptHandler after serverChannelInitializer runs (#1393)
Motivation:

For compatibility with 2.13.1 and earlier, we're adding the
AcceptHandler after the serverChannelInitializer runs. If that's the
best solution is discussed in #1392.

Modifications:

- add AcceptHandler after the serverChannelInitializer
- give the AcceptHandler the name AcceptHandler

Result:

- better compatibility
2020-02-13 12:55:52 +00:00
Johannes Weiss 589bc7cf08
improve pod updater script (#1391)
Motivation:

Somewhere in github or Cocoapods, there seems to be a problem that if
you push a pod A and quickly after a pod B that depends on A with
exactly the version you just pushed, the validation sometimes fails
claiming that the right version of A is not available. The workaround is
to wait a bit and to call `pod repo update`.
The modifications in this PR alleviate this problem somewhat, it now
calls `pod repo update` by itself and should it still go wrong, there's
a new `-f` (from) option that can be used to skip over all pods until
the one that failed last. Example

    scripts/build_podspecs.sh -u -f SwiftNIO 2.13.1

Modifications:

- update the pod repo often
- provide a skipping option to skip over earlier repos in case something
  still goes wrong

Result:

Easier way to update the pods.
2020-02-13 07:32:11 +00:00
Cory Benfield bfde40cac8
Update http-parser for CVE. (#1387)
Motivation:

http-parser shipped a patche for node.js CVE-2019-15605, which allowed
HTTP request smuggling. This affected SwiftNIO as well, and so we need
to immediately ship an update to help protect affected users.

A CVE for SwiftNIO will follow, but as this patch is in the wild and
SwiftNIO is known to be affected we should not delay shipping this fix.

Modifications:

- Update http-parser.
- Add regression tests to validate this behaviour.

Result:

Close request smugging vector.
2020-02-10 16:44:44 +00:00
George Barnett ddb7109142
Include stackdiff-ing in the debugging-allocations doc (#1384)
Motivation:

We recently grew a script to diff the output of `malloc-aggregation.d`,
we should document how this can be used when debugging allocation
regressions.

Modifications:

- Update the doc to include an example of using the script to debug an
  allocation regression
- Fix a bug in the script where before/after were mixed up
- Fix a bug in the script where usage would print '()\n' instead of '\n'

Result:

- Better info on debugging allocations

Co-authored-by: Johannes Weiss <johannesweiss@apple.com>
2020-02-06 16:10:04 +00:00
Johannes Weiss e800e7cc5c
add Swift 5.2 to the readme (#1386)
Motivation:

Swift 5.2 is already available as developer snapshots and Xcode 11.4
beta got released which also includes Swift 5.2.

Modifications:

- add 5.2 support to the readme
- showcase SwiftPM's package syntax for 5.2

Result:

the future is here.
2020-02-06 16:09:27 +00:00
Johannes Weiss c6e5fe88e1
ByteBuffer: make getInteger for UInt8 faster (#1380)
Motivation:

getInteger used the normal, generic implementation for UInt8s, however
they can be made considerably faster by using a specialised method.
ByteBufferIterator was also affected by this.

Modifications:

Use a specialised version for UInt8s for getInteger.

Result:

- ByteBufferView can be iterated about 20% faster.
2020-02-06 11:59:10 +00:00
Johannes Weiss d1ef9be53c
update vendored code & attribute it correctly (#1382)
Motivation:

This updates all vendored code and also lets github know what's vendored
code through `.gitattributes`.

Modifications:

- http_parser update
- attribution

Result:

- better github stats
- up to date software
2020-02-05 15:04:35 +00:00
George Barnett a678727747
Provide descriptions for EventLoopError (#1381)
Motivation:

EventLoopError does not conform to CustomStringConvertible. When these
errors appear in programs depending on NIO the source of the error is
non-obvious to the user.

EventLoopError.shutdown, for example, would appear in logs as
"shutdown" with no indication that it was the event loop being referred
to.

Modifications:

- Conform EventLoopError to CustomStringConvertible

Result:

- More helpful error descriptions for EventLoopError
2020-02-05 11:26:41 +00:00
George Barnett c92a9c638c
Reserve capacity in terms of writable bytes (#1378)
Motivation:

Often we know ahead of time that we will need to write a certain number
of bytes into a buffer. It is useful to ensure the buffer has enough
capacity to store these bytes without causing unnecessary allocations.
However, `reserveCapacity()` is defined in terms of the capacity of the
buffer and it's can be easy to forget that this does not take into
account the writer index.

Modifications:

- Add a method which reserves enough capacity to write at least the
  specified number of bytes.
- Update `writeWithUnsafeMutableBytes(minimumWritableBytes:body:)` to use the
  new method.

Result:

It's easier for users to reserve enough writable capacity ahead of time.
2020-02-04 14:38:11 +00:00
Doug Friedman a4fe7d4840
get IOError down to git in an existential container (#1355) (#1376)
resolves #1355 shaving off some bytes from IOError struct

Motivation:

It's important for frequently used errors to fit in existential containers because otherwise throwing them leads to allocations.

Modifications:

- Don't store `StaticString`s anymore which are 2 words + 1 bytes wide

Result:

Fewer allocations when IOErrors are thrown.
2020-02-03 12:30:37 +00:00
Johannes Weiss a76a98eb00
dev/stackdiff-dtrace: stack aggregation diffing script (#1373)
Motivation:

NIO has allocation counter tests, NIO also has dev/malloc-aggregation.d
which can give you aggregated stacks that allocated alongside how many
times they allocated. What's missing is a script that can diff two
aggregated stack traces.

Modifications:

Add dev/stacktrace-dtrace which allows aggregated stack trace diffing.

Result:

Easier to track performance regressions.
2020-02-03 09:09:20 +00:00
Johannes Weiss a8fe2f343b
SR-12094 is fixed, no need to skip tests (#1371) 2020-02-01 10:28:06 +00:00
Johannes Weiss ba37512da9
apply ChannelOptions before channel initializer runs (#1372)
Motivation:

The channel initializers should see the the Channel after the options
have been applied so they can potentially override the options.

Modifications:

Set the options before the channel initialiser rather than after.

Result:

- More sense, more compatibility with Netty
- fixes #1114

Co-authored-by: George Barnett <gbrntt@gmail.com>
Co-authored-by: Cory Benfield <lukasa@apple.com>
2020-02-01 10:21:54 +00:00
tomer doron 25583d5ad8
improve docker security (#1375)
motivation: more secured ci setup

changes:
* enable :z selinux flag on bind mounts so we can enable selinux on ci
* drop potentially exploitable capabilities from docker-compose
2020-02-01 07:40:06 +00:00
George Barnett b4483e5c49
Avoid curried thunks (workaround SR-12115) (#1374)
Motivation:

Calling `function(otherFunction)` allocates, but
`function({ otherFunction($0) }` does not.

See: SR-12115 and SR-12116.

Modifications:

Avoid passing functions directly; pass them in new closures instead.

Result:

Fewer allocations.
2020-01-31 17:57:30 +00:00
Johannes Weiss 2bf296958b
switch swift-tools-version to 5.0 for integration tests (#1369)
Motivation:

Some integration tests still used swift-tools-version:4.0.

Modifications:

Make it 5.0

Result:

Run the compiler in a sensible mode.
2020-01-29 18:31:37 +00:00
Johannes Weiss 4a2746cbc8
include clang modularised headers last (#1368)
Motivation:

Clang modules seem to mess with stuff like _GNU_SOURCE as soon as
they're included. We do need _GNU_SOURCE (but don't like the
`#define __USE_GNU` hack).

Modifications:

Include the modularised headers last.

Result:

Alloc counter tests work without `#define __USE_GNU`.
2020-01-29 18:31:21 +00:00
Johannes Weiss d220737da7
make more tests faster (#1367)
Motivation:

Some tests are slow (#1358), they should be faster.

Modifications:

Make more tests faster.

Result:

Faster test suite
2020-01-29 17:00:13 +00:00
Johannes Weiss 9f9976adae
make some unnecessarily slow tests faster (#1365)
Motivation:

As can be seen in #1358, we have a bunch of very slow tests.
Some of them are unnecessarily slow.

Modifications:

Make easy to make fast tests faster.

Result:

Faster test suite.
2020-01-29 15:26:57 +00:00
Johannes Weiss 7f8e96cf02
fix 5.2 builds (#1366)
motivation: tsan is broken on ubuntu 18.04.use 16.04 so 5.2 build can pass

changes:
* change 5.2 docker setup to use 16.04 instead of 18.04
* add the ability to pipe arguments to the integration tests via the docker setup
* skip tests_02 integration tests suite since it broken on 5.2 (swift-pm issue?)

fake the new limits from #1362

Co-authored-by: tomer doron <tomer@apple.com>
2020-01-29 14:39:28 +00:00
Johannes Weiss 6e02bf0057
fix #1363: fix race between EL exit and wakeup call (#1364)
Motivation:

The problem that manifested in #1363 was that when we told the EL to exit, it would sometimes exit straight away and sometimes go around its loop one more time and call whenReady, waiting for a wakeup. Previously, we assumed that it would always wait for a wakeup which isn't true.

Modifications:

Offer it a wakeup if it needs to but don't require it.

Result:

fixes #1363
2020-01-29 12:12:38 +00:00
Johannes Weiss 52a4cae14d
add SAL (Syscall Abstraction Layer) and new SALChannelTests
## Motivation:

In SwiftNIO's codebase, most things were always testable just as well as user code is. With one big missing piece: We could never make the `Selector` do arbitrary things to the `Channel` implementations which lead to super expensive to (create, read, understand) integration tests like [`testWriteAndFlushFromReentrantFlushNowTriggeredOutOfWritabilityWhereOuterSaysAllWrittenAndInnerDoesNot `](5dc9083c6a/Tests/NIOTests/StreamChannelsTest.swift (L468-L760)).

## Modification

Add SAL, a 'syscall abstraction layer' which makes it possible to assert all syscalls that come through a `Socket` or the `Selector` by mocking them. It lets the NIO programmer play the kernel in these "SAL tests" which makes it possible to assert the exact syscalls (with their parameters) and decide the syscalls' returns.

## Result

Finally, we're able to write proper unit tests for scenarios where the `Channel` drove the `Selector` incorrectly.
2020-01-28 12:36:36 +00:00