Skip to content

Commit 59eb83b

Browse files
committed
Split DoH Resolver into Java versions, fix initial request and tests
1 parent 1da8365 commit 59eb83b

8 files changed

Lines changed: 902 additions & 657 deletions

File tree

pom.xml

Lines changed: 96 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,12 @@
371371
<sourceCompatible>true</sourceCompatible>
372372
<semanticVersionLevel>PATCH</semanticVersionLevel>
373373
</overrideCompatibilityChangeParameter>
374+
<overrideCompatibilityChangeParameter>
375+
<compatibilityChange>SUPERCLASS_ADDED</compatibilityChange>
376+
<binaryCompatible>true</binaryCompatible>
377+
<sourceCompatible>true</sourceCompatible>
378+
<semanticVersionLevel>PATCH</semanticVersionLevel>
379+
</overrideCompatibilityChangeParameter>
374380
<overrideCompatibilityChangeParameter>
375381
<compatibilityChange>ANNOTATION_DEPRECATED_ADDED</compatibilityChange>
376382
<semanticVersionLevel>PATCH</semanticVersionLevel>
@@ -497,41 +503,6 @@
497503
</configuration>
498504
</plugin>
499505

500-
<plugin>
501-
<groupId>org.codehaus.mojo</groupId>
502-
<artifactId>animal-sniffer-maven-plugin</artifactId>
503-
<version>1.24</version>
504-
<configuration>
505-
<signature>
506-
<groupId>net.sf.androidscents.signature</groupId>
507-
<artifactId>android-api-level-26</artifactId>
508-
<version>8.0.0_r2</version>
509-
</signature>
510-
<ignores>
511-
<ignore>javax.naming.NamingException</ignore>
512-
<ignore>javax.naming.directory.*</ignore>
513-
<ignore>sun.net.spi.nameservice.*</ignore>
514-
<ignore>java.net.spi.*</ignore>
515-
</ignores>
516-
</configuration>
517-
<dependencies>
518-
<dependency>
519-
<groupId>org.ow2.asm</groupId>
520-
<artifactId>asm</artifactId>
521-
<version>9.7.1</version>
522-
</dependency>
523-
</dependencies>
524-
<executions>
525-
<execution>
526-
<id>animal-sniffer</id>
527-
<phase>test</phase>
528-
<goals>
529-
<goal>check</goal>
530-
</goals>
531-
</execution>
532-
</executions>
533-
</plugin>
534-
535506
<plugin>
536507
<groupId>org.apache.maven.plugins</groupId>
537508
<artifactId>maven-enforcer-plugin</artifactId>
@@ -719,6 +690,60 @@
719690
<target>${target.jdk}</target>
720691
</configuration>
721692
</plugin>
693+
694+
<plugin>
695+
<groupId>org.codehaus.mojo</groupId>
696+
<artifactId>animal-sniffer-maven-plugin</artifactId>
697+
<version>1.24</version>
698+
<configuration>
699+
<signature>
700+
<groupId>com.toasttab.android</groupId>
701+
<artifactId>gummy-bears-api-26</artifactId>
702+
<version>0.12.0</version>
703+
</signature>
704+
<ignores>
705+
<ignore>javax.naming.NamingException</ignore>
706+
<ignore>javax.naming.directory.*</ignore>
707+
<ignore>sun.net.spi.nameservice.*</ignore>
708+
<ignore>java.net.spi.*</ignore>
709+
</ignores>
710+
</configuration>
711+
<dependencies>
712+
<dependency>
713+
<groupId>org.ow2.asm</groupId>
714+
<artifactId>asm</artifactId>
715+
<version>9.8</version>
716+
</dependency>
717+
</dependencies>
718+
<executions>
719+
<execution>
720+
<id>animal-sniffer</id>
721+
<phase>test</phase>
722+
<goals>
723+
<goal>check</goal>
724+
</goals>
725+
</execution>
726+
</executions>
727+
</plugin>
728+
729+
<plugin>
730+
<groupId>org.jacoco</groupId>
731+
<artifactId>jacoco-maven-plugin</artifactId>
732+
<executions>
733+
<execution>
734+
<id>report</id>
735+
<phase>verify</phase>
736+
<goals>
737+
<goal>report</goal>
738+
</goals>
739+
<configuration>
740+
<excludes>
741+
<exclude>META-INF/**</exclude>
742+
</excludes>
743+
</configuration>
744+
</execution>
745+
</executions>
746+
</plugin>
722747
</plugins>
723748
</build>
724749
</profile>
@@ -815,18 +840,38 @@
815840
@{argLine}
816841
--add-opens java.base/sun.net.dns=ALL-UNNAMED
817842
</argLine>
843+
844+
<!--
845+
Workaround to actually use / prefer the versioned classes
846+
https://issues.apache.org/jira/browse/SUREFIRE-1731
847+
-->
848+
<useModulePath>false</useModulePath>
849+
<classesDirectory>${project.build.outputDirectory}/META-INF/versions/11</classesDirectory>
818850
<additionalClasspathElements>
819-
<additionalClasspathElement>${project.build.outputDirectory}/META-INF/versions/11</additionalClasspathElement>
851+
<additionalClasspathElement>${project.build.outputDirectory}</additionalClasspathElement>
820852
</additionalClasspathElements>
821853
</configuration>
822854
</plugin>
855+
856+
<plugin>
857+
<groupId>org.jacoco</groupId>
858+
<artifactId>jacoco-maven-plugin</artifactId>
859+
<configuration>
860+
<excludes>
861+
<exclude>org/xbill/DNS/AsyncSemaphore*</exclude>
862+
<exclude>org/xbill/DNS/DohResolver*</exclude>
863+
</excludes>
864+
</configuration>
865+
</plugin>
823866
</plugins>
824867
</build>
825868
</profile>
826869

827870
<profile>
828-
<!-- Required only for maven-source-plugin, but needs to be hidden from IntelliJ -->
829-
<!-- https://github.com/apache/maven-source-plugin/issues/215 -->
871+
<!--
872+
Required only for maven-source-plugin, but needs to be hidden from IntelliJ
873+
https://github.com/apache/maven-source-plugin/issues/215
874+
-->
830875
<id>java11-not-idea</id>
831876
<activation>
832877
<activeByDefault>false</activeByDefault>
@@ -910,10 +955,18 @@
910955
@{argLine}
911956
--add-opens java.base/sun.net.dns=ALL-UNNAMED
912957
-javaagent:${net.bytebuddy:byte-buddy-agent:jar}
958+
-javaagent:${org.mockito:mockito-core:jar}
913959
</argLine>
960+
961+
<!--
962+
Workaround to actually use / prefer the versioned classes
963+
https://issues.apache.org/jira/browse/SUREFIRE-1731
964+
-->
965+
<useModulePath>false</useModulePath>
966+
<classesDirectory>${project.build.outputDirectory}/META-INF/versions/18</classesDirectory>
914967
<additionalClasspathElements>
915968
<additionalClasspathElement>${project.build.outputDirectory}/META-INF/versions/11</additionalClasspathElement>
916-
<additionalClasspathElement>${project.build.outputDirectory}/META-INF/versions/18</additionalClasspathElement>
969+
<additionalClasspathElement>${project.build.outputDirectory}</additionalClasspathElement>
917970
</additionalClasspathElements>
918971
</configuration>
919972
</plugin>
@@ -922,8 +975,10 @@
922975
</profile>
923976

924977
<profile>
925-
<!-- Required only for maven-source-plugin, but needs to be hidden from IntelliJ -->
926-
<!-- https://github.com/apache/maven-source-plugin/issues/215 -->
978+
<!--
979+
Required only for maven-source-plugin, but needs to be hidden from IntelliJ
980+
https://github.com/apache/maven-source-plugin/issues/215
981+
-->
927982
<id>java18-not-idea</id>
928983
<activation>
929984
<activeByDefault>false</activeByDefault>

src/main/java/org/xbill/DNS/AsyncSemaphore.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,41 +6,58 @@
66
import java.util.Queue;
77
import java.util.concurrent.CompletableFuture;
88
import java.util.concurrent.CompletionStage;
9+
import java.util.concurrent.Executor;
910
import java.util.concurrent.TimeUnit;
1011
import lombok.extern.slf4j.Slf4j;
1112

1213
@Slf4j
1314
final class AsyncSemaphore {
1415
private final Queue<CompletableFuture<Permit>> queue = new ArrayDeque<>();
1516
private final Permit singletonPermit = new Permit();
17+
private final String name;
1618
private volatile int permits;
1719

1820
final class Permit {
19-
public void release() {
21+
public void release(int id, Executor executor) {
2022
synchronized (queue) {
2123
CompletableFuture<Permit> next = queue.poll();
2224
if (next == null) {
2325
permits++;
26+
log.trace("{} permit released id={}, available={}", name, id, permits);
2427
} else {
25-
next.complete(this);
28+
log.trace("{} permit released id={}, available={}, immediate next", name, id, permits);
29+
executor.execute(() -> next.complete(this));
2630
}
2731
}
2832
}
2933
}
3034

31-
AsyncSemaphore(int permits) {
35+
AsyncSemaphore(int permits, String name) {
3236
this.permits = permits;
37+
this.name = name;
38+
log.debug("Using Java 8 implementation for {}", name);
3339
}
3440

35-
CompletionStage<Permit> acquire(Duration timeout) {
41+
CompletionStage<Permit> acquire(Duration timeout, int id, Executor executor) {
3642
synchronized (queue) {
3743
if (permits > 0) {
3844
permits--;
45+
log.trace("{} permit acquired id={}, available={}", name, id, permits);
3946
return CompletableFuture.completedFuture(singletonPermit);
4047
} else {
4148
TimeoutCompletableFuture<Permit> f = new TimeoutCompletableFuture<>();
4249
f.compatTimeout(timeout.toNanos(), TimeUnit.NANOSECONDS)
43-
.whenComplete((result, ex) -> queue.remove(f));
50+
.whenCompleteAsync(
51+
(result, ex) -> {
52+
synchronized (queue) {
53+
if (ex != null) {
54+
log.trace("{} permit timed out id={}, available={}", name, id, permits);
55+
}
56+
queue.remove(f);
57+
}
58+
},
59+
executor);
60+
log.trace("{} permit queued id={}, available={}", name, id, permits);
4461
queue.add(f);
4562
return f;
4663
}

0 commit comments

Comments
 (0)