Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
35865e2
[maven-release-plugin] prepare for next development iteration
netty-project-bot Jun 2, 2026
344d6db
SingleThreadEventExecutor: document Throwable safety contract on run(…
daguimu Jun 4, 2026
13b6e99
Make HTTP/2 frame hashCode consistent with equals (#16692)
daguimu Jun 4, 2026
66cb6f1
Add BlockHound exception for DnsQueryIdSpace (#16896) (#16915)
chrisvest Jun 5, 2026
d2bbe5e
FlowControlHandler: Fix autoRead behavior (#16912)
chrisvest Jun 5, 2026
fd1b64c
Auto-port 4.1: Fix incorrect bounds in error message of HpackDecoder.…
netty-project-bot Jun 5, 2026
eeb6378
MQTT: Fix MQTT decoder size check after variable header replay (#16916)
daguimu Jun 5, 2026
2d781e2
MQTT: Make the decodeProperties early-REPLAY check actually fire (#16…
daguimu Jun 5, 2026
e45c3cf
Reject control characters at the boundary of HTTP method names (#1672…
chrisvest Jun 11, 2026
465c9e6
Auto-port 4.1: Update to latest tcnative release (#16941)
netty-project-bot Jun 11, 2026
13ff5ca
Auto-port 4.1: Fix HTTP 2 PUSH_PROMISE stream association validation …
netty-project-bot Jun 16, 2026
7a95c67
Auto-port 4.1: Fix GZIP FEXTRA extra-field handling in JdkZlibDecoder…
netty-project-bot Jun 16, 2026
a1e9aac
Auto-port 4.1: Add opt-in validation of mandatory pseudo-header field…
netty-project-bot Jun 16, 2026
82e3dc1
Strictly validate MQTT UTF-8 Encoded String (#16939) (#16965)
chrisvest Jun 17, 2026
dc68016
Auto-port 4.1: Stop DateFormatter trailing token from running past th…
netty-project-bot Jun 18, 2026
74b2fcf
Auto-port 4.1: IpFilter: Deprecate constructor which use accept by de…
netty-project-bot Jun 18, 2026
ec224a0
Add RFC 10008 QUERY Method support (#16966) (#16978)
normanmaurer Jun 19, 2026
d6be98b
Correctly release and fail queued traffic-shaping writes on close (#1…
normanmaurer Jun 19, 2026
e9eab3d
Auto-port 4.1: FlowControlHandler: respect auto-read when toggled whi…
netty-project-bot Jun 24, 2026
4e7dc11
IdleStateHandler: reset firstWriter/ReaderIdleEvent in resetWriteTime…
chrisvest Jun 25, 2026
a362ee1
Auto-port 4.1: Fix typo in AbstractSniHandler Javadoc (#16995)
netty-project-bot Jun 25, 2026
26bb273
Auto-port 4.1: Reconcile `AbstractCoalescingBufferQueue` readableByte…
netty-project-bot Jun 26, 2026
df54c37
Reject control characters at the boundary of the HTTP version token (…
normanmaurer Jun 26, 2026
666c3b2
Auto-port 4.1: Reset UTF-8 decode state on CR in StompSubframeDecoder…
netty-project-bot Jun 26, 2026
42e7103
Auto-port 4.1: HTTP2: Pass the correct number of arguments when loggi…
netty-project-bot Jun 30, 2026
7fd5cc7
FastLz: Guard decompression against truncated input (#17000) (#17015)
chrisvest Jun 30, 2026
b12bd11
Backport 4.1 Fix propagation of startTls for client SslContext handle…
skyguard1 Jun 30, 2026
d7dcf6c
Auto-port 4.1: Reject non-token characters in HTTP/2 header names (#1…
netty-project-bot Jun 30, 2026
50e6e1d
Update lz4-java to 1.11.1 (#17060)
yawkat Jul 6, 2026
7b44dc9
Pin github actions to reduce risk (#17043) (#17044)
normanmaurer Jul 7, 2026
bb2ff68
Merge branches from forks (#17063) (#17065)
normanmaurer Jul 8, 2026
fca0764
[maven-release-plugin] prepare release netty-4.1.136.Final
netty-project-bot Jul 8, 2026
7163618
[maven-release-plugin] prepare for next development iteration
netty-project-bot Jul 8, 2026
f257630
Auto-port 4.1: AsciiString.cached(String) should sanitize the provide…
netty-project-bot Jul 9, 2026
24c2e38
AsciiString.cached(String) should sanitize the provided String (#1374…
normanmaurer Jul 9, 2026
8b95db0
Fix AsciiString.cached(String) performance regression (#17074) (#17080)
normanmaurer Jul 10, 2026
63e69df
Auto-port 4.1: SslHandler: Fix possible buffer leak when an OOME is t…
netty-project-bot Jul 10, 2026
86d4609
Fix AsciiString.cached(String) performance regression (#17074) (#17083)
normanmaurer Jul 10, 2026
f2281ac
Fix deploy workflow
normanmaurer Jul 10, 2026
9a2c826
Auto-port 4.1: Add HttpContentCompressor constructor with ability to …
netty-project-bot Jul 10, 2026
0cfdb08
Auto-port 4.1: Fix AdaptiveByteBuf._setLongLE calling checked setLong…
netty-project-bot Jul 15, 2026
3caae46
Auto-port 4.1: Reject negative maxOrder in PooledByteBufAllocator (#1…
netty-project-bot Jul 18, 2026
8b6eb02
Auto-port 4.1: Snappy: Guard decoder against invalid chunk lengths (#…
netty-project-bot Jul 22, 2026
9312227
Backport #16079 and #17114 (#17134)
hyperxpro Jul 24, 2026
c69f043
Auto-port 4.1: Use safe decompressor in Lz4FrameDecoder (#17121)
netty-project-bot Jul 24, 2026
b94986e
Auto-port 4.1: Configure TestLens for the PR builds (#17133)
netty-project-bot Jul 24, 2026
ac9ec25
Fix maxAllocation for brotli-encoded content in HttpContentDecompress…
chrisvest Jul 24, 2026
8aab580
Propagate the CI envionment variables through to the docker builds (#…
chrisvest Jul 27, 2026
d7e5efa
Auto-port 4.1: fix(mqtt): drop UNSUBACK reason codes for MQTT 3.x enc…
netty-project-bot Jul 27, 2026
8689960
Fix buddy cache evicting chunks with live buffers (#17154) (#17176)
franz1981 Jul 30, 2026
287dd71
Auto-port 4.1: Avoid classloader leak via GlobalEventExecutor termina…
netty-project-bot Aug 3, 2026
25f7e5e
Auto-port 4.1: `HttpObjectEncoder` / `DefaultHttp2FrameWriter`: fix b…
netty-project-bot Aug 3, 2026
f4f1b9d
BrotliEncoder: Prevent duplicate close scheduling (#17175) (#17193)
normanmaurer Aug 3, 2026
9cdfef4
Auto-port 4.1: Update compress-lzf to 1.2.1 (#17197)
netty-project-bot Aug 3, 2026
95bc09d
Do not write WebSocket handshake response to the tail of the pipeline…
normanmaurer Aug 3, 2026
1b8faad
`HttpServerCodec`: do not consume the method queue for 1xx interim re…
normanmaurer Aug 3, 2026
b8a40d2
Adaptive allocator backports (#17206)
chrisvest Aug 4, 2026
b75a281
Weakly reference engines from the OpenSSL engine map (#17199) (#17205)
chrisvest Aug 4, 2026
576765b
Auto-port 4.1: Add `.editorconfig` to enforce consistent coding style…
netty-project-bot Aug 4, 2026
cba4420
Update surefire plugin to latest version (#17210) (#17212)
normanmaurer Aug 4, 2026
c602219
Update to latest netty-tcnative release (#17056) (#17122)
chrisvest Aug 6, 2026
9e05192
Merge changes from forks (#17213) (#17217)
normanmaurer Aug 6, 2026
5471f0a
[maven-release-plugin] prepare release netty-4.1.137.Final
netty-project-bot Aug 6, 2026
260ddd2
Merge tag 'netty-4.1.137.Final' into dse-netty-4.1.137
emerkle826 Aug 14, 2026
c8b8ea8
Update Maven publishing
emerkle826 Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.java]
indent_style = space
indent_size = 4
max_line_length = 120

[*.c]
indent_style = space
indent_size = 4

[*.h]
indent_style = space
indent_size = 4

[*.xml]
indent_style = space
indent_size = 4

[*.{yml,yaml,json,js,css}]
indent_style = space
indent_size = 2

[*.{md,txt}]
indent_style = space
indent_size = 2

[*.properties]
indent_style = space
indent_size = 2

[*.sh]
indent_style = space
indent_size = 4
[Makefile]
indent_style = tab
101 changes: 101 additions & 0 deletions .github/scripts/deploy_maven_packages.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
#!/bin/bash
# ----------------------------------------------------------------------------
# Deploy pre-built artifacts from a local Maven repository layout directory
# to a remote Maven registry using deploy:deploy-file.
#
# Usage:
# deploy_maven_packages.sh <staging-dir> <repository-url> <repository-id>
#
# Arguments:
# staging-dir - Path to a directory in standard Maven repository layout
# (e.g. ~/local-staging containing io/netty/...)
# repository-url - Full URL of the target Maven registry
# (e.g. https://maven.pkg.github.com/org/repo
# https://your-org.jfrog.io/artifactory/libs-release-local)
# repository-id - Server ID matching an entry in ~/.m2/settings.xml
# that holds the credentials for the target registry
#
# Each .pom file found under <staging-dir> is treated as one artifact.
# The corresponding .jar (and any classified jars) alongside it are
# uploaded together. Files that are themselves classifiers of a pom
# already handled are skipped to avoid double-uploading.
# ----------------------------------------------------------------------------
set -euo pipefail

if [ "$#" -ne 3 ]; then
echo "Usage: $0 <staging-dir> <repository-url> <repository-id>"
exit 1
fi

STAGING_DIR="$1"
REPO_URL="$2"
REPO_ID="$3"

if [ ! -d "$STAGING_DIR" ]; then
echo "Error: staging directory '$STAGING_DIR' does not exist"
exit 1
fi

echo "Deploying artifacts from '$STAGING_DIR' to '$REPO_URL' (repositoryId=$REPO_ID)"

# Find every .pom in the staging directory. Each .pom represents one
# artifact coordinate (groupId:artifactId:version[:classifier]).
find "$STAGING_DIR" -name "*.pom" | sort | while read -r POM_FILE; do
DIR="$(dirname "$POM_FILE")"
BASENAME="$(basename "$POM_FILE" .pom)"

# Derive the main jar alongside this pom (same basename, no classifier).
MAIN_JAR="$DIR/$BASENAME.jar"

# Build the -Dfiles= and -Dclassifiers= and -Dtypes= lists for any
# additional classified artifacts sitting next to this pom.
EXTRA_FILES=""
EXTRA_CLASSIFIERS=""
EXTRA_TYPES=""

for EXTRA in "$DIR/$BASENAME"-*.jar; do
[ -f "$EXTRA" ] || continue
# Extract the classifier from the filename: strip prefix "<basename>-" and suffix ".jar"
CLASSIFIER="${EXTRA#$DIR/$BASENAME-}"
CLASSIFIER="${CLASSIFIER%.jar}"
if [ -n "$EXTRA_FILES" ]; then
EXTRA_FILES="$EXTRA_FILES,$EXTRA"
EXTRA_CLASSIFIERS="$EXTRA_CLASSIFIERS,$CLASSIFIER"
EXTRA_TYPES="$EXTRA_TYPES,jar"
else
EXTRA_FILES="$EXTRA"
EXTRA_CLASSIFIERS="$CLASSIFIER"
EXTRA_TYPES="jar"
fi
done

# Build the deploy:deploy-file command.
DEPLOY_ARGS=(
--batch-mode
deploy:deploy-file
"-Durl=$REPO_URL"
"-DrepositoryId=$REPO_ID"
"-DpomFile=$POM_FILE"
"-DgeneratePom=false"
)

if [ -f "$MAIN_JAR" ]; then
DEPLOY_ARGS+=("-Dfile=$MAIN_JAR")
else
# pom-only artifact (e.g. parent pom, BOM)
DEPLOY_ARGS+=("-Dfile=$POM_FILE" "-Dpackaging=pom")
fi

if [ -n "$EXTRA_FILES" ]; then
DEPLOY_ARGS+=("-Dfiles=$EXTRA_FILES")
DEPLOY_ARGS+=("-Dclassifiers=$EXTRA_CLASSIFIERS")
DEPLOY_ARGS+=("-Dtypes=$EXTRA_TYPES")
fi

echo "--- Deploying: $BASENAME"
if ! mvn "${DEPLOY_ARGS[@]}"; then
echo "WARNING: Failed to deploy $BASENAME (may already exist in registry — skipping)"
fi
done

echo "Deployment complete."
77 changes: 38 additions & 39 deletions .github/workflows/README-build-and-publish.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,37 @@ This GitHub Actions workflow (`build-and-publish.yml`) builds the Netty library

## Workflow Architecture

The workflow consists of 4 stages that run in sequence:
The workflow consists of 5 stages. Stages 2, 3, and 4 run in parallel after Stage 1 completes:

```
┌─────────────────────────────────────────────────────────────┐
│ Stage 1: Linux x86_64 Full Build │
│ - Builds all Netty modules │
│ - Uses Docker with CentOS 6 for compatibility │
│ - Produces complete JAR artifacts │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Stage 2: macOS Intel x86_64 Native Libraries │
│ - Builds native modules only: │
│ • resolver-dns-native-macos │
│ • transport-native-unix-common │
│ • transport-native-kqueue │
│ - Runs on GitHub-hosted Intel Mac │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Stage 3: macOS ARM aarch64 Native Libraries │
│ - Builds same native modules as Stage 2 │
│ - Runs on GitHub-hosted Apple Silicon Mac │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Stage 4: Merge and Publish │
│ - Downloads all artifacts from previous stages │
│ - Merges staging repositories │
│ - Generates netty-all module │
│ - Publishes to GitHub Packages │
└─────────────────────────────────────────────────────────────┘
Stage 1: Linux x86_64 Full Build
- Builds all Netty modules
- Uses Docker with CentOS 6 for compatibility
- Produces complete JAR artifacts

+------------------+------------------+
| | |
Stage 2: Stage 3: Stage 4:
Linux aarch64 macOS Intel macOS ARM aarch64
Native Libs x86_64 Native Libs
Native Libs
- transport- - resolver-dns - resolver-dns
native-epoll -native-macos -native-macos
- transport- - transport- - transport-
native-unix- native-unix- native-unix-
common common common
- transport- - transport-
ubuntu-24.04-arm native-kqueue native-kqueue
runner
GitHub Intel Mac GitHub Apple
Silicon Mac
+------------------+------------------+
|
Stage 5: Merge and Publish
- Downloads all artifacts from previous stages
- Merges staging repositories
- Generates netty-all module
- Publishes to GitHub Packages
```

## Triggers
Expand Down Expand Up @@ -98,7 +94,8 @@ The workflow will automatically start building and publishing.
### Intermediate Artifacts

Each build stage uploads its artifacts to GitHub Actions:
- `linux-x86_64-local-staging` - Linux build artifacts
- `linux-x86_64-local-staging` - Linux x86_64 build artifacts
- `linux-aarch64-local-staging` - Linux aarch64 native libraries
- `macos-x86_64-local-staging` - Intel Mac native libraries
- `macos-aarch64-local-staging` - ARM Mac native libraries
- `merged-local-staging` - Final merged artifacts (for debugging)
Expand Down Expand Up @@ -156,11 +153,13 @@ Add to your `~/.m2/settings.xml`:
## Build Times

Approximate build times (may vary):
- **Stage 1 (Linux)**: 15-25 minutes
- **Stage 2 (macOS Intel)**: 10-15 minutes
- **Stage 3 (macOS ARM)**: 10-15 minutes
- **Stage 4 (Merge & Publish)**: 5-10 minutes
- **Total**: ~40-65 minutes
- **Stage 1 (Linux x86_64)**: 15-25 minutes
- **Stages 2-4 run in parallel after Stage 1 completes**
- **Stage 2 (Linux aarch64)**: 10-15 minutes
- **Stage 3 (macOS Intel)**: 10-15 minutes
- **Stage 4 (macOS ARM)**: 10-15 minutes
- **Stage 5 (Merge & Publish)**: 5-10 minutes
- **Total**: ~30-50 minutes

## Troubleshooting

Expand Down
82 changes: 70 additions & 12 deletions .github/workflows/build-and-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:
# Trigger on version tags
push:
branches:
- dse-netty-4.1.135.2
- dse-netty-4.1.137
tags:
- '*.dse'
- 'dse-netty-*'
Expand Down Expand Up @@ -87,7 +87,57 @@ jobs:
if-no-files-found: error
include-hidden-files: true

# Stage 2: Build macOS Intel x86_64 native libraries
# Stage 2: Build Linux aarch64 native libraries on a native ARM64 runner
build-linux-aarch64:
runs-on: ubuntu-24.04-arm
name: Build Linux aarch64 (Native Libraries)
needs: [build-linux-x64]

steps:
- uses: actions/checkout@v4

- name: Set up JDK 8
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '8'

# Cache .m2/repository
- name: Cache local Maven repository
uses: actions/cache@v4
continue-on-error: true
with:
path: ~/.m2/repository
key: cache-maven-linux-aarch64-${{ hashFiles('**/pom.xml') }}
restore-keys: |
cache-maven-linux-aarch64-${{ hashFiles('**/pom.xml') }}
cache-maven-

- name: Install native build toolchain
run: |
sudo apt-get update -q
sudo apt-get install -y autoconf automake libtool make gcc libaio-dev

- name: Create local staging directory
run: mkdir -p ~/local-staging

- name: Build and stage Linux aarch64 native libraries
run: |
./mvnw -B \
-pl transport-native-unix-common,transport-native-epoll \
-am deploy \
-DskipTests=true \
-DaltDeploymentRepository=local-staging::default::file://$(pwd)/local-staging

- name: Upload local staging directory
uses: actions/upload-artifact@v4
with:
name: linux-aarch64-local-staging
path: ${{ github.workspace }}/local-staging
if-no-files-found: error
include-hidden-files: true

# Stage 3: Build macOS Intel x86_64 native libraries
build-macos-intel:
runs-on: macos-15-intel
name: Build macOS x86_64 (Native Libraries)
Expand Down Expand Up @@ -139,7 +189,7 @@ jobs:
if-no-files-found: error
include-hidden-files: true

# Stage 3: Build macOS ARM aarch64 native libraries
# Stage 4: Build macOS ARM aarch64 native libraries
build-macos-arm:
runs-on: macos-15
name: Build macOS aarch64 (Native Libraries)
Expand Down Expand Up @@ -190,11 +240,11 @@ jobs:
if-no-files-found: error
include-hidden-files: true

# Stage 4: Merge artifacts and publish to GitHub Packages
# Stage 5: Merge artifacts and publish to GitHub Packages
publish-to-github-packages:
runs-on: ubuntu-latest
name: Merge and Publish to GitHub Packages
needs: [build-linux-x64, build-macos-intel, build-macos-arm]
needs: [build-linux-x64, build-linux-aarch64, build-macos-intel, build-macos-arm]

steps:
- uses: actions/checkout@v4
Expand All @@ -216,7 +266,7 @@ jobs:
cache-maven-${{ hashFiles('**/pom.xml') }}
cache-maven-

# Configure Maven settings for GitHub Packages
# Configure Maven settings for all registries
- name: Configure Maven settings
uses: s4u/maven-settings-action@v3.0.0
with:
Expand Down Expand Up @@ -244,6 +294,12 @@ jobs:
name: linux-x86_64-local-staging
path: ~/linux-x86_64-local-staging

- name: Download Linux aarch64 staging directory
uses: actions/download-artifact@v4
with:
name: linux-aarch64-local-staging
path: ~/linux-aarch64-local-staging

- name: Download macOS x86_64 staging directory
uses: actions/download-artifact@v4
with:
Expand All @@ -262,6 +318,7 @@ jobs:
bash ./.github/scripts/local_staging_install_release.sh \
~/.m2/repository \
~/linux-x86_64-local-staging \
~/linux-aarch64-local-staging \
~/macos-x86_64-local-staging \
~/macos-aarch64-local-staging

Expand All @@ -278,6 +335,7 @@ jobs:
bash ./.github/scripts/local_staging_install_release.sh \
~/local-staging \
~/linux-x86_64-local-staging \
~/linux-aarch64-local-staging \
~/macos-x86_64-local-staging \
~/macos-aarch64-local-staging

Expand All @@ -289,12 +347,12 @@ jobs:
# Deploy to GitHub Packages
- name: Deploy to GitHub Packages
run: |
./mvnw -B --file pom.xml \
org.sonatype.plugins:nexus-staging-maven-plugin:deploy-staged \
-DaltStagingDirectory=$HOME/local-staging \
-DserverId=github \
-DnexusUrl=https://maven.pkg.github.com/${{ github.repository }} \
-DrepositoryId=github
bash ./.github/scripts/deploy_maven_packages.sh \
~/local-staging \
https://maven.pkg.github.com/${{ github.repository }} \
github
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload merged staging directory (for debugging)
uses: actions/upload-artifact@v4
Expand Down
Loading
Loading