Skip to content

Commit

Permalink
(#44) ISE: Connection is still allocated
Browse files Browse the repository at this point in the history
* UnixHttpClient: swapped BasicHttpClientConnectionManager for PoolingHttpClientConnectionManager
  • Loading branch information
llorllale committed Mar 15, 2018
1 parent 81773b8 commit 6009d3c
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 7 deletions.
Empty file removed puzzles.xml
Empty file.
29 changes: 22 additions & 7 deletions src/main/java/com/amihaiemil/docker/UnixHttpClient.java
Expand Up @@ -37,13 +37,14 @@
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HttpContext;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.function.Supplier;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;

/**
* An HttpClient which works over a UnixSocket.
Expand All @@ -53,6 +54,8 @@
* @since 0.0.1
* @checkstyle ParameterNumber (150 lines)
* @checkstyle AnonInnerLength (150 lines)
* @todo #44:30min Connection pooling is currently hardcoded at 10 connections
* max. Figure out how to make this configurable.
*/
final class UnixHttpClient implements HttpClient {

Expand All @@ -66,9 +69,9 @@ final class UnixHttpClient implements HttpClient {
* @param socketFile Unix socket on disk.
*/
UnixHttpClient(final File socketFile) {
this(
HttpClientBuilder.create().setConnectionManager(
new BasicHttpClientConnectionManager(
this(() -> {
final PoolingHttpClientConnectionManager pool =
new PoolingHttpClientConnectionManager(
RegistryBuilder
.<ConnectionSocketFactory>create()
.register(
Expand Down Expand Up @@ -98,9 +101,21 @@ public Socket connectSocket(
}
})
.build()
)
).build()
);
);
pool.setDefaultMaxPerRoute(10);
pool.setMaxTotal(10);
return HttpClientBuilder.create()
.setConnectionManager(pool)
.build();
});
}

/**
* Ctor.
* @param client The HttpClient.
*/
UnixHttpClient(final Supplier<HttpClient> client) {
this(client.get());
}

/**
Expand Down
62 changes: 62 additions & 0 deletions src/test/java/com/amihaiemil/docker/UnixHttpClientITCase.java
@@ -0,0 +1,62 @@
/**
* Copyright (c) 2018, Mihai Emil Andronache
* All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1)Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2)Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3)Neither the name of docker-java-api nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
package com.amihaiemil.docker;

import java.io.File;
import java.io.IOException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.junit.Ignore;
import org.junit.Test;

/**
* Integration tests for {@link UnixHttpClient}.
*
* @author George Aristy (george.aristy@gmail.com)
* @version $Id$
* @since 0.0.1
*/
public final class UnixHttpClientITCase {
/**
* UnixHttpClient can be executed more than once without throwing a
* ConnectionPoolTimeoutException, demonstrating its connection-pooling
* capabilities.
* @throws IOException unexpected
* @see <a href="https://github.com/amihaiemil/docker-java-api/issues/44">bug</a>
* @todo #44:30min This should be un-ignored and refactored after #41 is
* done. The unix socket server needs to be spooled up, and the url
* changed accordingly.
*/
@Ignore
@Test
public void canBeReused() throws IOException {
final HttpClient client = new UnixHttpClient(
new File("/var/run/docker.sock")
);
client.execute(new HttpGet("http://localhost/ping"));
client.execute(new HttpGet("http://localhost/ping"));
}
}

2 comments on commit 6009d3c

@0pdd
Copy link
Collaborator

@0pdd 0pdd commented on 6009d3c Mar 16, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Puzzle 44-50450105 discovered in src/test/java/com/amihaiemil/docker/UnixHttpClientITCase.java and submitted as #51. Please, remember that the puzzle was not necessarily added in this particular commit. Maybe it was added earlier, but we discovered it only now.

@0pdd
Copy link
Collaborator

@0pdd 0pdd commented on 6009d3c Mar 16, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Puzzle 44-0db77e9f discovered in src/main/java/com/amihaiemil/docker/UnixHttpClient.java and submitted as #52. Please, remember that the puzzle was not necessarily added in this particular commit. Maybe it was added earlier, but we discovered it only now.

Please sign in to comment.