From f8f865765999ec34ddeb05f3e984be6731beab16 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 3 Oct 2017 02:45:29 +0300 Subject: [PATCH 1/4] extract java, google java format and jmh to separate script plugins configuration: explicitly set gradle version and distribution type (upgrade later) versions: move dependency versions to separate file java: set encoding to UTF-8 disable specific compiler warnings (fix later) codestyle: set google java format version for plugin (upgrade later) run formatting before compilation benchmark: exclude test dependencies from jmh jar fix duplicate jmh generated classes (jmh-generated-classes, jmh-generated-sources) fix broken jmh metadata files (BenchmarkList, CompilerHints) fix jmh command line jar (inline dependencies with shadow plugin) fix jmh task for root scope (stop generate dummy jar) cleanup redundant out directory generated by IDEA remove slf4j and log4j dependencies (replace with slf4j-nop logger) add visual jmh report --- build.gradle | 64 +++++-------------- gradle/benchmark.gradle | 51 +++++++++++++++ gradle/codestyle.gradle | 11 ++++ gradle/configuration.gradle | 17 +++++ gradle/java.gradle | 13 ++++ gradle/versions.gradle | 24 +++++++ rsocket-core/build.gradle | 15 +---- .../java/io/rsocket/FragmentationPerf.java | 5 +- .../src/jmh/java/io/rsocket/RSocketPerf.java | 3 +- rsocket-examples/build.gradle | 16 +---- 10 files changed, 140 insertions(+), 79 deletions(-) create mode 100644 gradle/benchmark.gradle create mode 100644 gradle/codestyle.gradle create mode 100644 gradle/configuration.gradle create mode 100644 gradle/java.gradle create mode 100644 gradle/versions.gradle diff --git a/build.gradle b/build.gradle index 9bf0d5cfc..3f4f8f754 100644 --- a/build.gradle +++ b/build.gradle @@ -14,24 +14,33 @@ * limitations under the License. */ +/* +NOTE: plugins block cannot be used in script plugins +TODO: future versions of Gradle will remove this restriction +*/ plugins { - id "com.gradle.build-scan" version "1.9" - id 'com.jfrog.bintray' version '1.7.3' - id 'com.github.sherter.google-java-format' version '0.6' + id 'com.gradle.build-scan' version '1.9' // declare before any other plugin + + id 'com.github.sherter.google-java-format' version '0.6' apply false + id 'com.github.johnrengelman.shadow' version '2.0.1' apply false + id 'me.champeau.gradle.jmh' version '0.4.4' apply false + id 'io.morethan.jmhreport' version '0.6.2.1' apply false + id 'com.jfrog.artifactory' version '4.5.2' - id 'me.champeau.gradle.jmh' version '0.4.4' + id 'com.jfrog.bintray' version '1.7.3' } -repositories { - jcenter() -} +apply from: "$rootDir/gradle/configuration.gradle" +apply from: "$rootDir/gradle/versions.gradle" description = 'RSocket: stream oriented messaging passing with Reactive Stream semantics.' buildScan { licenseAgreementUrl = 'https://gradle.com/terms-of-service'; licenseAgree = 'yes' } subprojects { - apply plugin: 'java' + apply from: "$rootDir/gradle/java.gradle" + apply from: "$rootDir/gradle/codestyle.gradle" + apply plugin: 'maven' apply plugin: 'maven-publish' apply plugin: 'com.jfrog.bintray' @@ -40,38 +49,6 @@ subprojects { group = 'io.rsocket' version = mavenversion - compileJava { - sourceCompatibility = 1.8 - targetCompatibility = 1.8 - options.compilerArgs << "-Xlint:deprecation" // << "-Xlint:unchecked" - } - - ext { - // common - jsr305Version = '3.0.2' - reactorVersion = '3.1.0.RELEASE' - nettyVersion = '4.1.15.Final' - reactiveStreamsVersion = '1.0.1' - slf4jVersion = '1.7.25' - // aeron - aeronVersion = '1.4.1' - // netty - reactorNettyVersion = '0.7.0.M2' - // spectator - spectatorVersion = '0.57.1' - hdrHistogramVersion = '2.1.9' - // tck-drivers - jacksonVersion = '2.9.1' - commonsLang3Version = '3.6' - airlineVersion = '0.8' - rxjavaVersion = '2.1.3' - // test - junitVersion = '4.12' - hamcrestVersion = '1.3' - mockitoVersion = '2.10.0' - jmhVersion = '1.19' - } - // custom tasks for creating source/javadoc jars task sourcesJar(type: Jar, dependsOn: classes) { classifier = 'sources' @@ -90,13 +67,6 @@ subprojects { archives sourcesJar, javadocJar, jar } - repositories { - maven { url 'http://repo.spring.io/milestone' } - maven { url 'https://oss.jfrog.org/libs-snapshot' } - maven { url 'https://dl.bintray.com/rsocket/RSocket' } - maven { url 'https://dl.bintray.com/reactivesocket/ReactiveSocket' } - } - dependencies { compile "io.projectreactor:reactor-core:3.1.0.RELEASE" compile "io.netty:netty-buffer:4.1.15.Final" diff --git a/gradle/benchmark.gradle b/gradle/benchmark.gradle new file mode 100644 index 000000000..21d4186ad --- /dev/null +++ b/gradle/benchmark.gradle @@ -0,0 +1,51 @@ +apply plugin: 'com.github.johnrengelman.shadow' +apply plugin: 'me.champeau.gradle.jmh' +apply plugin: 'io.morethan.jmhreport' + +// disable tasks to stop generating duplicate files +jmhClasses.enabled = false +jmhRunBytecodeGenerator.enabled = false +jmhCompileGeneratedClasses.enabled = false + +jmhJar { + // add jmh classes to shadow jar + from project.configurations.jmh + from project.configurations.jmhRuntime + + // exclude logging classes + exclude 'org.slf4j:slf4j-log4j12' + exclude 'log4j:log4j' +} + +jmh { + jmhVersion = '1.19' + includeTests = false + duplicateClassesStrategy = DuplicatesStrategy.WARN + zip64 = true + + jvmArgs = ['-XX:+UnlockCommercialFeatures', '-XX:+FlightRecorder'] + // NOTE: uncomment to add specific options + // jvmArgsAppend = ['-XX:+UseG1GC', '-Xms4g', '-Xmx4g'] + profilers = ['gc'] + resultFormat = 'JSON' +} + +// run report generation after benchmark +tasks.jmh.finalizedBy tasks.jmhReport + +jmhReport { + jmhResultPath = project.file('build/reports/jmh/results.json') + jmhReportOutput = project.file('build/reports/jmh') +} + +// remove directory generated by IDEA during benchmark +clean { + project.delete('out') +} + +dependencies { + jmh "org.openjdk.jmh:jmh-core:${jmh.jmhVersion}" + jmh "org.openjdk.jmh:jmh-generator-annprocess:${jmh.jmhVersion}" + + jmhRuntime "org.slf4j:slf4j-nop:$slf4jVersion" +} \ No newline at end of file diff --git a/gradle/codestyle.gradle b/gradle/codestyle.gradle new file mode 100644 index 000000000..42e3fa124 --- /dev/null +++ b/gradle/codestyle.gradle @@ -0,0 +1,11 @@ +/* Format the Java source code to comply with Google Style */ + +apply plugin: 'com.github.sherter.google-java-format' + +// Use specific version +googleJavaFormat { + toolVersion = '1.1' +} + +// NOTE: uncomment to force code formatting before compile +compileJava.dependsOn tasks.googleJavaFormat \ No newline at end of file diff --git a/gradle/configuration.gradle b/gradle/configuration.gradle new file mode 100644 index 000000000..ad3de5adf --- /dev/null +++ b/gradle/configuration.gradle @@ -0,0 +1,17 @@ +task wrapper(type: Wrapper) { + gradleVersion = '4.1' + distributionType = Wrapper.DistributionType.ALL +} + +repositories { + jcenter() +} + +subprojects { + repositories { + maven { url 'http://repo.spring.io/milestone' } + maven { url 'https://oss.jfrog.org/libs-snapshot' } + maven { url 'https://dl.bintray.com/rsocket/RSocket' } + maven { url 'https://dl.bintray.com/reactivesocket/ReactiveSocket' } + } +} \ No newline at end of file diff --git a/gradle/java.gradle b/gradle/java.gradle new file mode 100644 index 000000000..222e8b48d --- /dev/null +++ b/gradle/java.gradle @@ -0,0 +1,13 @@ +/* Java compiler settings */ + +apply plugin: 'java' + +compileJava { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + options.encoding = 'UTF-8' + options.compilerArgs << '-Xlint:all,-cast,-fallthrough,-overloads,-rawtypes,-serial,-try,-unchecked' + // NOTE: uncomment to include/exclude specific warnings + // << '-Xlint:classfile,deprecation,dep-ann,divzero,empty,finally,options,overrides,path,processing,static,varargs' + // << '-Xdoclint:all,-accessibility,-syntax,-reference,-html,-missing/public' +} \ No newline at end of file diff --git a/gradle/versions.gradle b/gradle/versions.gradle new file mode 100644 index 000000000..f5588edb7 --- /dev/null +++ b/gradle/versions.gradle @@ -0,0 +1,24 @@ +ext { + // common + jsr305Version = '3.0.2' + reactorVersion = '3.1.0.RELEASE' + nettyVersion = '4.1.16.Final' + reactiveStreamsVersion = '1.0.1' + slf4jVersion = '1.7.25' + // aeron + aeronVersion = '1.4.1' + // netty + reactorNettyVersion = '0.7.0.RELEASE' + // spectator + spectatorVersion = '0.57.1' + hdrHistogramVersion = '2.1.10' + // tck-drivers + jacksonVersion = '2.9.1' + commonsLang3Version = '3.6' + airlineVersion = '0.8' + rxjavaVersion = '2.1.4' + // test + junitVersion = '4.12' + hamcrestVersion = '1.3' + mockitoVersion = '2.10.0' +} \ No newline at end of file diff --git a/rsocket-core/build.gradle b/rsocket-core/build.gradle index 7a026d3d2..ca9d86849 100644 --- a/rsocket-core/build.gradle +++ b/rsocket-core/build.gradle @@ -14,16 +14,7 @@ * limitations under the License. */ -apply plugin: 'me.champeau.gradle.jmh' +apply from: "$rootDir/gradle/benchmark.gradle" -jmh { - jmhVersion = "1.19" - profilers = ['gc'] - zip64 = true - duplicateClassesStrategy = DuplicatesStrategy.WARN -} - -dependencies { - jmh "org.openjdk.jmh:jmh-core:1.19" - jmh "org.openjdk.jmh:jmh-generator-annprocess:1.19" -} +// NOTE: uncomment to run specific test only +// jmh.include = ['io.rsocket.RSocketPerf.fireAndForgetHello'] \ No newline at end of file diff --git a/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java b/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java index 1eefc3452..08f6f2a91 100644 --- a/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java +++ b/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java @@ -19,9 +19,8 @@ @BenchmarkMode(Mode.Throughput) @Fork( - value = 1, - jvmArgsAppend = {"-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder"} -) //, "-Dio.netty.leakDetection.level=advanced"}) + value = 1 // , jvmArgsAppend = {"-Dio.netty.leakDetection.level=advanced"} +) @Warmup(iterations = 10) @Measurement(iterations = 10_000) @State(Scope.Thread) diff --git a/rsocket-core/src/jmh/java/io/rsocket/RSocketPerf.java b/rsocket-core/src/jmh/java/io/rsocket/RSocketPerf.java index 1c8ff726b..0ae66c584 100644 --- a/rsocket-core/src/jmh/java/io/rsocket/RSocketPerf.java +++ b/rsocket-core/src/jmh/java/io/rsocket/RSocketPerf.java @@ -41,8 +41,7 @@ @BenchmarkMode(Mode.Throughput) @Fork( - value = 1, - jvmArgsAppend = {"-XX:+UnlockCommercialFeatures", "-XX:+FlightRecorder"} + value = 1 // , jvmArgsAppend = {"-Dio.netty.leakDetection.level=advanced"} ) @Warmup(iterations = 10) @Measurement(iterations = 10) diff --git a/rsocket-examples/build.gradle b/rsocket-examples/build.gradle index fd154cf64..b0f17c9d0 100644 --- a/rsocket-examples/build.gradle +++ b/rsocket-examples/build.gradle @@ -14,25 +14,11 @@ * limitations under the License. */ -apply plugin: 'me.champeau.gradle.jmh' - -jmh { - jmhVersion = "1.19" - jvmArgs = ['-XX:+UseG1GC', '-Xmx4g', '-Xms4g', '-XX:+UnlockCommercialFeatures', '-XX:+FlightRecorder'] - profilers = ['gc'] - zip64 = true - warmupBatchSize = 10 - iterations = 500 - duplicateClassesStrategy = DuplicatesStrategy.WARN -} - dependencies { compile project(':rsocket-core') compile project(':rsocket-spectator') compile project(':rsocket-transport-netty') compile project(':rsocket-transport-local') - jmh "org.openjdk.jmh:jmh-generator-annprocess:1.19" - testCompile project(':rsocket-test') -} +} \ No newline at end of file From 900ab525865b5cfb6bf643ff0c0672a3b2592f36 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 3 Oct 2017 03:00:15 +0300 Subject: [PATCH 2/4] gradle 4.2 upgrade gradle to version 4.2 change distribution type to binary --- gradle/configuration.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/configuration.gradle b/gradle/configuration.gradle index ad3de5adf..da16e4b2b 100644 --- a/gradle/configuration.gradle +++ b/gradle/configuration.gradle @@ -1,6 +1,6 @@ task wrapper(type: Wrapper) { - gradleVersion = '4.1' - distributionType = Wrapper.DistributionType.ALL + gradleVersion = '4.2' + distributionType = Wrapper.DistributionType.BIN } repositories { From 0f1e740ab02a147a97f1b508a216de0c0f2f0126 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 3 Oct 2017 03:14:49 +0300 Subject: [PATCH 3/4] add binaries and properties --- gradle/wrapper/gradle-wrapper.jar | Bin 54708 -> 54708 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7a3265ee94c0ab25cf079ac8ccdf87f41d455d42..736fb7d3f94c051b359fc7ae7212d351bc094bdd 100644 GIT binary patch delta 63 zcmdn8nt97=<_YF3FJ8OxPPC3>`&jg`h>>A})W$89hq;&-0=(HdKK%OmWwQAZf3TX( PT}SQ-uz-bfu6h6ffJYu} delta 63 zcmdn8nt97=<_YF3789R&O|*_=`&9I?h>>A})W$89hq+i70=(HdyjFk6oos%@AFO6` O*O7YyEMTFWs~!M9k{b*F diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bf1b63c34..52dd1f044 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-bin.zip From 709544883f115c87731ed42ca315ae9ed79f3645 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 3 Oct 2017 03:16:39 +0300 Subject: [PATCH 4/4] google-java-format 1.4 upgrade google-java-format to version 1.4 --- gradle/codestyle.gradle | 2 +- rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java | 2 +- rsocket-core/src/main/java/io/rsocket/RSocketServer.java | 6 ++++-- .../main/java/io/rsocket/frame/FrameHeaderFlyweight.java | 3 ++- .../src/main/java/io/rsocket/resume/ResumeUtil.java | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/gradle/codestyle.gradle b/gradle/codestyle.gradle index 42e3fa124..f9c2bf43e 100644 --- a/gradle/codestyle.gradle +++ b/gradle/codestyle.gradle @@ -4,7 +4,7 @@ apply plugin: 'com.github.sherter.google-java-format' // Use specific version googleJavaFormat { - toolVersion = '1.1' + toolVersion = '1.4' } // NOTE: uncomment to force code formatting before compile diff --git a/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java b/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java index 08f6f2a91..22ee60095 100644 --- a/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java +++ b/rsocket-core/src/jmh/java/io/rsocket/FragmentationPerf.java @@ -83,7 +83,7 @@ public void smallFragmentationFrameReassembler(Input input) { Frame frame = smallFragmentAssembler.reassemble(); input.bh.consume(frame); frame.release(); - //input.smallFragmentAssembler.clear(); + // input.smallFragmentAssembler.clear(); } private static ByteBuffer createRandomBytes(int size) { diff --git a/rsocket-core/src/main/java/io/rsocket/RSocketServer.java b/rsocket-core/src/main/java/io/rsocket/RSocketServer.java index 02e93b47b..4f306366a 100644 --- a/rsocket-core/src/main/java/io/rsocket/RSocketServer.java +++ b/rsocket-core/src/main/java/io/rsocket/RSocketServer.java @@ -167,7 +167,8 @@ private Mono handleFrame(Frame frame) { case METADATA_PUSH: return metadataPush(new PayloadImpl(frame)); case LEASE: - // Lease must not be received here as this is the server end of the socket which sends leases. + // Lease must not be received here as this is the server end of the socket which sends + // leases. return Mono.empty(); case NEXT: receiver = getChannelProcessor(streamId); @@ -287,7 +288,8 @@ private Mono handleChannel(int streamId, Frame firstFrame) { }) .doFinally(signalType -> removeChannelProcessor(streamId)); - // not chained, as the payload should be enqueued in the Unicast processor before this method returns + // not chained, as the payload should be enqueued in the Unicast processor before this method + // returns // and any later payload can be processed frames.onNext(new PayloadImpl(firstFrame)); diff --git a/rsocket-core/src/main/java/io/rsocket/frame/FrameHeaderFlyweight.java b/rsocket-core/src/main/java/io/rsocket/frame/FrameHeaderFlyweight.java index 957487910..94412e8fc 100644 --- a/rsocket-core/src/main/java/io/rsocket/frame/FrameHeaderFlyweight.java +++ b/rsocket-core/src/main/java/io/rsocket/frame/FrameHeaderFlyweight.java @@ -285,7 +285,8 @@ public static void encodeLength(final ByteBuf byteBuf, final int offset, final i if ((length & ~FRAME_LENGTH_MASK) != 0) { throw new IllegalArgumentException("Length is larger than 24 bits"); } - // Write each byte separately in reverse order, this mean we can write 1 << 23 without overflowing. + // Write each byte separately in reverse order, this mean we can write 1 << 23 without + // overflowing. byteBuf.setByte(offset, length >> 16); byteBuf.setByte(offset + 1, length >> 8); byteBuf.setByte(offset + 2, length); diff --git a/rsocket-core/src/main/java/io/rsocket/resume/ResumeUtil.java b/rsocket-core/src/main/java/io/rsocket/resume/ResumeUtil.java index 95d84e6ed..093120357 100644 --- a/rsocket-core/src/main/java/io/rsocket/resume/ResumeUtil.java +++ b/rsocket-core/src/main/java/io/rsocket/resume/ResumeUtil.java @@ -11,7 +11,7 @@ public static boolean isTracked(FrameType frameType) { case REQUEST_STREAM: case REQUEST_RESPONSE: case FIRE_AND_FORGET: - //case METADATA_PUSH: + // case METADATA_PUSH: case REQUEST_N: case CANCEL: case ERROR: