Skip to content

Commit

Permalink
Fix scanner object leaks close them appropriately. (minio#534)
Browse files Browse the repository at this point in the history
Currently scanner was never closed which would leak fds.
  • Loading branch information
harshavardhana authored Mar 10, 2017
1 parent 2a46f7b commit a7ae7a1
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 26 deletions.
27 changes: 12 additions & 15 deletions api/src/main/java/io/minio/MinioClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
import org.xmlpull.v1.XmlPullParserFactory;

import java.io.BufferedInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
Expand All @@ -89,7 +88,6 @@
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
Expand Down Expand Up @@ -629,8 +627,7 @@ private boolean isValidEndpoint(String endpoint) {
* Validates if given objectPrefix is valid.
*/
private void checkObjectPrefix(String prefix) throws InvalidObjectPrefixException {
// TODO(nl5887): what to do with wildcards in objectPrefix?
//
// TODO(nl5887): what to do with wild-cards in objectPrefix?
if (prefix.length() > 1024) {
throw new InvalidObjectPrefixException(prefix, "Object prefix cannot be greater than 1024 characters.");
}
Expand Down Expand Up @@ -950,23 +947,25 @@ private HttpResponse execute(Method method, String region, String bucketName, St

// HEAD returns no body, and fails on parseXml
if (!method.equals(Method.HEAD)) {
Scanner scanner = new Scanner(response.body().charStream());
try {
scanner.useDelimiter("\\A");
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}

errorResponse = new ErrorResponse(new StringReader(errorXml));

if (this.traceStream != null) {
this.traceStream.println(errorXml);
}

} finally {
response.body().close();
}
scanner.close();
}

if (this.traceStream != null) {
Expand Down Expand Up @@ -1041,8 +1040,8 @@ private void updateRegionCache(String bucketName)
String location = null;

xpp.setInput(response.body().charStream());
while (xpp.getEventType() != xpp.END_DOCUMENT) {
if (xpp.getEventType() == xpp.START_TAG && xpp.getName() == "LocationConstraint") {
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
if (xpp.getEventType() == XmlPullParser.START_TAG && xpp.getName() == "LocationConstraint") {
xpp.next();
location = getText(xpp, location);
break;
Expand Down Expand Up @@ -1091,7 +1090,7 @@ private String getRegion(String bucketName) throws InvalidBucketNameException, N
* Returns text of given XML element.
*/
private String getText(XmlPullParser xpp, String location) throws XmlPullParserException {
if (xpp.getEventType() == xpp.TEXT) {
if (xpp.getEventType() == XmlPullParser.TEXT) {
return xpp.getText();
}
return location;
Expand Down Expand Up @@ -2938,19 +2937,17 @@ private void completeMultipart(String bucketName, String objectName, String uplo

// Fixing issue https://github.com/minio/minio-java/issues/391
String bodyContent = "";
Scanner scanner = new Scanner(response.body().charStream());
try {
// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
bodyContent = scanner.next();
}
} catch (EOFException e) {
// Getting EOF exception is not an error.
// Just log it.
LOGGER.log(Level.WARNING, "EOF exception occured: " + e);
} finally {
} finally {
response.body().close();
}
scanner.close();

bodyContent = bodyContent.trim();
if (!bodyContent.isEmpty()) {
Expand Down
8 changes: 7 additions & 1 deletion api/src/main/java/io/minio/policy/PolicyType.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,14 @@ public enum PolicyType {
NONE("none"), READ_ONLY("readonly"), READ_WRITE("readwrite"), WRITE_ONLY("writeonly");
private final String value;


private PolicyType(final String value) {
this.value = value;
}

/**
* Returns the policyType value.
*/
public String getValue() {
return value;
}
}
32 changes: 22 additions & 10 deletions functional/FunctionalTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ public static void listObject_test1() throws Exception {
}

i = 0;
for (Result r : client.listObjects(bucketName)) {
for (Result<?> r : client.listObjects(bucketName)) {
ignore(i++, r.get());
if (i == 10) {
break;
Expand All @@ -369,7 +369,7 @@ public static void listObject_test2() throws Exception {
}

i = 0;
for (Result r : client.listObjects(bucketName, "minio")) {
for (Result<?> r : client.listObjects(bucketName, "minio")) {
ignore(i++, r.get());
if (i == 10) {
break;
Expand All @@ -396,7 +396,7 @@ public static void listObject_test3() throws Exception {
}

i = 0;
for (Result r : client.listObjects(bucketName, "minio", true)) {
for (Result<?> r : client.listObjects(bucketName, "minio", true)) {
ignore(i++, r.get());
if (i == 10) {
break;
Expand All @@ -416,7 +416,7 @@ public static void listObject_test4() throws Exception {
System.out.println("Test: empty bucket: listObjects(final String bucketName)");

i = 0;
for (Result r : client.listObjects(bucketName, "minio", true)) {
for (Result<?> r : client.listObjects(bucketName, "minio", true)) {
ignore(i++, r.get());
if (i == 10) {
break;
Expand Down Expand Up @@ -567,10 +567,12 @@ public static void presignedGetObject_test1() throws Exception {
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
Scanner scanner = new Scanner(response.body().charStream());
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}
scanner.close();

throw new Exception("[FAILED] Test: presignedGetObject(String bucketName, String objectName)"
+ ", Response: " + response
Expand Down Expand Up @@ -619,10 +621,12 @@ public static void presignedGetObject_test2() throws Exception {
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
Scanner scanner = new Scanner(response.body().charStream());
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}
scanner.close();

throw new Exception("[FAILED] Test: presignedGetObject(String bucketName, String objectName, Integer expires)"
+ ", Response: " + response
Expand Down Expand Up @@ -680,10 +684,12 @@ public static void presignedGetObject_test3() throws Exception {
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
Scanner scanner = new Scanner(response.body().charStream());
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}
scanner.close();

throw new Exception("[FAILED] Test: presignedGetObject(String bucketName, String objectName,"
+ " Integer expires, Map<String, String> reqParams)"
Expand Down Expand Up @@ -729,10 +735,12 @@ public static void presignedPutObject_test1() throws Exception {
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
Scanner scanner = new Scanner(response.body().charStream());
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}
scanner.close();

throw new Exception("[FAILED] Test: presignedPutObject(String bucketName, String objectName)"
+ ", Response: " + response
Expand Down Expand Up @@ -768,10 +776,12 @@ public static void presignedPutObject_test2() throws Exception {
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
Scanner scanner = new Scanner(response.body().charStream());
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}
scanner.close();

throw new Exception("[FAILED] Test: presignedPutObject(String bucketName, String objectName, Integer expires)"
+ ", Response: " + response
Expand Down Expand Up @@ -813,10 +823,12 @@ public static void presignedPostPolicy_test() throws Exception {
String errorXml = "";

// read entire body stream to string.
Scanner scanner = new java.util.Scanner(response.body().charStream()).useDelimiter("\\A");
Scanner scanner = new Scanner(response.body().charStream());
scanner.useDelimiter("\\A");
if (scanner.hasNext()) {
errorXml = scanner.next();
}
scanner.close();

throw new Exception("[FAILED] Test: presignedPostPolicy(PostPolicy policy)"
+ ", Response: " + response
Expand Down

0 comments on commit a7ae7a1

Please sign in to comment.