From 1a6685f5989e94731e67a11d4e40ab7de4d526d8 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Mon, 19 Sep 2022 17:55:53 +0800 Subject: [PATCH 01/15] VFS-824 HttpFileSystem free Unused Resources lead to HttpClient Connection Pool Shutdown --- .../provider/http/HttpProviderTestCase.java | 35 +++++++++++++++++++ .../provider/http4/Http4ProviderTestCase.java | 34 ++++++++++++++++++ .../provider/http5/Http5ProviderTestCase.java | 35 +++++++++++++++++++ 3 files changed, 104 insertions(+) diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java index 4d39fa2d9f..59e8db2e0a 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java @@ -29,7 +29,10 @@ import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.ProviderTestSuite; import org.apache.commons.vfs2.VFS; +import org.apache.commons.vfs2.cache.WeakRefFilesCache; import org.apache.commons.vfs2.impl.DefaultFileSystemManager; +import org.apache.commons.vfs2.impl.StandardFileSystemManager; +import org.apache.commons.vfs2.provider.AbstractFileSystem; import org.apache.commons.vfs2.util.NHttpFileServer; import org.junit.Test; import org.junit.jupiter.api.Assertions; @@ -212,4 +215,36 @@ public void testResolveFolderSlashYesRedirectOn() throws FileSystemException { testResolveFolderSlash(ConnectionUri + "/read-tests/", true); } + @Test + public void testHttpFileSystemFreeUnusedResources() throws Exception { + try (StandardFileSystemManager fileSystemManager = new StandardFileSystemManager()) { + fileSystemManager.setConfiguration(StandardFileSystemManager.class.getResource("providers.xml")); + // use WeakRef + fileSystemManager.setFilesCache(new WeakRefFilesCache()); + fileSystemManager.init(); + + String path = "http://www.w3schools.com/webservices/tempconvert.asmx?action=WSDL"; + AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); + http4FileSystem.isReleaseable(); + + while (!http4FileSystem.isReleaseable()) { + // Try GC + System.gc(); + } + // free resource + // http4FileSystem.httpclient is closed + fileSystemManager.freeUnusedResources(); + + // get file again + getFile(fileSystemManager, path); + } + } + + private static AbstractFileSystem getFile(FileSystemManager fileSystemManager, String path) throws FileSystemException { + FileObject fileObject = fileSystemManager.resolveFile(path); + // send + fileObject.getType(); + return (AbstractFileSystem) fileObject.getFileSystem(); + } + } diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java index de661365ff..cf878705ac 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java @@ -30,7 +30,10 @@ import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.ProviderTestSuite; import org.apache.commons.vfs2.VFS; +import org.apache.commons.vfs2.cache.WeakRefFilesCache; import org.apache.commons.vfs2.impl.DefaultFileSystemManager; +import org.apache.commons.vfs2.impl.StandardFileSystemManager; +import org.apache.commons.vfs2.provider.AbstractFileSystem; import org.apache.commons.vfs2.util.NHttpFileServer; import org.junit.jupiter.api.Assertions; import org.junit.Test; @@ -216,4 +219,35 @@ public void testResolveFolderSlashYesRedirectOn() throws FileSystemException { testResolveFolderSlash(ConnectionUri + "/read-tests/", true); } + @Test + public void testHttp4FileSystemFreeUnusedResources() throws Exception { + try (StandardFileSystemManager fileSystemManager = new StandardFileSystemManager()) { + fileSystemManager.setConfiguration(StandardFileSystemManager.class.getResource("providers.xml")); + // use WeakRef + fileSystemManager.setFilesCache(new WeakRefFilesCache()); + fileSystemManager.init(); + + String path = "http4://www.w3schools.com/webservices/tempconvert.asmx?action=WSDL"; + AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); + http4FileSystem.isReleaseable(); + + while (!http4FileSystem.isReleaseable()) { + // Try GC + System.gc(); + } + // free resource + // http4FileSystem.httpclient is closed + fileSystemManager.freeUnusedResources(); + + // get file again + getFile(fileSystemManager, path); + } + } + + private static AbstractFileSystem getFile(FileSystemManager fileSystemManager, String path) throws FileSystemException { + FileObject fileObject = fileSystemManager.resolveFile(path); + // send + fileObject.getType(); + return (AbstractFileSystem) fileObject.getFileSystem(); + } } diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java index 97734a7f36..b71893c6a8 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java @@ -30,7 +30,10 @@ import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.ProviderTestSuite; import org.apache.commons.vfs2.VFS; +import org.apache.commons.vfs2.cache.WeakRefFilesCache; import org.apache.commons.vfs2.impl.DefaultFileSystemManager; +import org.apache.commons.vfs2.impl.StandardFileSystemManager; +import org.apache.commons.vfs2.provider.AbstractFileSystem; import org.apache.commons.vfs2.util.NHttpFileServer; import org.junit.Test; import org.junit.jupiter.api.Assertions; @@ -210,4 +213,36 @@ public void testResolveFolderSlashYesRedirectOn() throws FileSystemException { testResolveFolderSlash(ConnectionUri + "/read-tests/", true); } + @Test + public void testHttp5FileSystemFreeUnusedResources() throws Exception { + try (StandardFileSystemManager fileSystemManager = new StandardFileSystemManager()) { + fileSystemManager.setConfiguration(StandardFileSystemManager.class.getResource("providers.xml")); + // use WeakRef + fileSystemManager.setFilesCache(new WeakRefFilesCache()); + fileSystemManager.init(); + + String path = "http5://www.w3schools.com/webservices/tempconvert.asmx?action=WSDL"; + AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); + http4FileSystem.isReleaseable(); + + while (!http4FileSystem.isReleaseable()) { + // Try GC + System.gc(); + } + // free resource + // http4FileSystem.httpclient is closed + fileSystemManager.freeUnusedResources(); + + // get file again + getFile(fileSystemManager, path); + } + } + + private static AbstractFileSystem getFile(FileSystemManager fileSystemManager, String path) throws FileSystemException { + FileObject fileObject = fileSystemManager.resolveFile(path); + // send + fileObject.getType(); + return (AbstractFileSystem) fileObject.getFileSystem(); + } + } From 7d263eeda5c6a8b8261be22b1891ab330f9b3a06 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Mon, 19 Sep 2022 18:11:11 +0800 Subject: [PATCH 02/15] =?UTF-8?q?VFS-824=20Fix=20HttpFileSystem=20free=20U?= =?UTF-8?q?nused=20Resources=20lead=20to=20HttpClient=20Connection=20Pool?= =?UTF-8?q?=20Shutdown=20Option=20One=EF=BC=9AWhile=20Unused=20Resources,?= =?UTF-8?q?=20close=20HttpFileSystem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vfs2/provider/AbstractFileProvider.java | 15 +++++++++++++++ .../vfs2/provider/http/HttpFileProvider.java | 17 +++++++++++++++++ .../vfs2/provider/http4/Http4FileProvider.java | 15 +++++++++++++++ .../vfs2/provider/http5/Http5FileProvider.java | 16 ++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index c7996d2aac..7bc5b975b0 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -148,6 +148,21 @@ public void freeUnusedResources() { .forEach(AbstractFileSystem::closeCommunicationLink); } + /** + * get snapshot of all fileSystem + * + * @return FileSystem Array + */ + public AbstractFileSystem[] getAllFileSystemSnapshot() { + final AbstractFileSystem[] abstractFileSystems; + synchronized (fileSystemMap) { + // create snapshot under lock + abstractFileSystems = fileSystemMap.values().toArray(EMPTY_ABSTRACT_FILE_SYSTEMS); + } + return abstractFileSystems; + } + + /** * Gets the FileSystemConfigBuilder. * diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java index 57ba1bca42..133fc4d83b 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java @@ -19,6 +19,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.stream.Stream; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.vfs2.Capability; @@ -28,6 +29,7 @@ import org.apache.commons.vfs2.FileSystemException; import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.UserAuthenticationData; +import org.apache.commons.vfs2.provider.AbstractFileSystem; import org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider; import org.apache.commons.vfs2.provider.GenericFileName; import org.apache.commons.vfs2.util.UserAuthenticatorUtils; @@ -93,4 +95,19 @@ public Collection getCapabilities() { public FileSystemConfigBuilder getConfigBuilder() { return HttpFileSystemConfigBuilder.getInstance(); } + + + /** + * Frees unused resources and close HttpFileSystem. + */ + @Override + public void freeUnusedResources() { + final AbstractFileSystem[] abstractFileSystems = getAllFileSystemSnapshot(); + // process snapshot outside lock + Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) + .forEach(system -> { + system.closeCommunicationLink(); + closeFileSystem(system); + }); + } } diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java index 636f5528e4..a451563b72 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java @@ -43,6 +43,7 @@ import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.UserAuthenticationData; import org.apache.commons.vfs2.UserAuthenticator; +import org.apache.commons.vfs2.provider.AbstractFileSystem; import org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider; import org.apache.commons.vfs2.provider.GenericFileName; import org.apache.commons.vfs2.util.UserAuthenticatorUtils; @@ -378,4 +379,18 @@ private HttpHost getProxyHttpHost(final Http4FileSystemConfigBuilder builder, return null; } + + /** + * Frees unused resources and close HttpFileSystem. + */ + @Override + public void freeUnusedResources() { + final AbstractFileSystem[] abstractFileSystems = getAllFileSystemSnapshot(); + // process snapshot outside lock + Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) + .forEach(system -> { + system.closeCommunicationLink(); + closeFileSystem(system); + }); + } } diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java index a1d9284aeb..fe33dd6877 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java @@ -43,6 +43,7 @@ import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.UserAuthenticationData; import org.apache.commons.vfs2.UserAuthenticator; +import org.apache.commons.vfs2.provider.AbstractFileSystem; import org.apache.commons.vfs2.provider.AbstractOriginatingFileProvider; import org.apache.commons.vfs2.provider.GenericFileName; import org.apache.commons.vfs2.util.UserAuthenticatorUtils; @@ -375,4 +376,19 @@ private HttpHost getProxyHttpHost(final Http5FileSystemConfigBuilder builder, return null; } + + /** + * Frees unused resources and close HttpFileSystem. + */ + @Override + public void freeUnusedResources() { + final AbstractFileSystem[] abstractFileSystems = getAllFileSystemSnapshot(); + // process snapshot outside lock + Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) + .forEach(system -> { + system.closeCommunicationLink(); + closeFileSystem(system); + }); + } + } From 7c09877efd490903289c44e504c48034f87f08f2 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Mon, 19 Sep 2022 18:13:16 +0800 Subject: [PATCH 03/15] =?UTF-8?q?VFS-824=20Fix=20HttpFileSystem=20free=20U?= =?UTF-8?q?nused=20Resources=20lead=20to=20HttpClient=20Connection=20Pool?= =?UTF-8?q?=20Shutdown=20Option=20Two=EF=BC=9AShare=20ConnectionManager.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apache/commons/vfs2/provider/http4/Http4FileProvider.java | 1 + 1 file changed, 1 insertion(+) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java index a451563b72..0c70308e7f 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java @@ -206,6 +206,7 @@ protected HttpClientBuilder createHttpClientBuilder(final Http4FileSystemConfigB final HostnameVerifier hostNameVerifier = createHostnameVerifier(builder, fileSystemOptions); final HttpClientBuilder httpClientBuilder = HttpClients.custom() + .setConnectionManagerShared(true) .setRoutePlanner(createHttpRoutePlanner(builder, fileSystemOptions)) .setConnectionManager(createConnectionManager(builder, fileSystemOptions, sslContext, hostNameVerifier)) .setSSLContext(sslContext) From ddd84bc6715d6f142f419abf09e14cccb86ee54c Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Mon, 19 Sep 2022 20:05:52 +0800 Subject: [PATCH 04/15] fix: (javadoc) JavadocStyle: First sentence should end with a period. --- .../org/apache/commons/vfs2/provider/AbstractFileProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index 7bc5b975b0..11508fa72b 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -149,7 +149,7 @@ public void freeUnusedResources() { } /** - * get snapshot of all fileSystem + * get snapshot of all fileSystem. * * @return FileSystem Array */ From 88b5046bae23a21c2070c9664e4c34794361a050 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Tue, 20 Sep 2022 10:32:58 +0800 Subject: [PATCH 05/15] review fix --- .../vfs2/provider/AbstractFileProvider.java | 17 ++++++----------- .../vfs2/provider/http/HttpFileProvider.java | 9 ++++----- .../vfs2/provider/http4/Http4FileProvider.java | 9 ++++----- .../vfs2/provider/http5/Http5FileProvider.java | 9 ++++----- 4 files changed, 18 insertions(+), 26 deletions(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index 11508fa72b..0bc4e48d75 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -16,8 +16,7 @@ */ package org.apache.commons.vfs2.provider; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; import java.util.stream.Stream; import org.apache.commons.vfs2.FileName; @@ -137,21 +136,17 @@ protected FileSystem findFileSystem(final Comparable key, final FileSystemOpt * Frees unused resources. */ public void freeUnusedResources() { - final AbstractFileSystem[] abstractFileSystems; - synchronized (fileSystemMap) { - // create snapshot under lock - abstractFileSystems = fileSystemMap.values().toArray(EMPTY_ABSTRACT_FILE_SYSTEMS); - } - // process snapshot outside lock - Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) + Stream.of(getAllFileSystemSnapshot()).filter(AbstractFileSystem::isReleaseable) .forEach(AbstractFileSystem::closeCommunicationLink); } + /** - * get snapshot of all fileSystem. + * Gets snapshot of all fileSystem under lock. * - * @return FileSystem Array + * @return AbstractFileSystem Array + * @since 2.10.0 */ public AbstractFileSystem[] getAllFileSystemSnapshot() { final AbstractFileSystem[] abstractFileSystems; diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java index 133fc4d83b..406faf7936 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java @@ -102,12 +102,11 @@ public FileSystemConfigBuilder getConfigBuilder() { */ @Override public void freeUnusedResources() { - final AbstractFileSystem[] abstractFileSystems = getAllFileSystemSnapshot(); // process snapshot outside lock - Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) - .forEach(system -> { - system.closeCommunicationLink(); - closeFileSystem(system); + Stream.of(getAllFileSystemSnapshot()).filter(AbstractFileSystem::isReleaseable) + .forEach(fileSystem -> { + fileSystem.closeCommunicationLink(); + closeFileSystem(fileSystem); }); } } diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java index 0c70308e7f..824c9b0eae 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java @@ -386,12 +386,11 @@ private HttpHost getProxyHttpHost(final Http4FileSystemConfigBuilder builder, */ @Override public void freeUnusedResources() { - final AbstractFileSystem[] abstractFileSystems = getAllFileSystemSnapshot(); // process snapshot outside lock - Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) - .forEach(system -> { - system.closeCommunicationLink(); - closeFileSystem(system); + Stream.of(getAllFileSystemSnapshot()).filter(AbstractFileSystem::isReleaseable) + .forEach(fileSystem -> { + fileSystem.closeCommunicationLink(); + closeFileSystem(fileSystem); }); } } diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java index fe33dd6877..5c0b132869 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java @@ -382,12 +382,11 @@ private HttpHost getProxyHttpHost(final Http5FileSystemConfigBuilder builder, */ @Override public void freeUnusedResources() { - final AbstractFileSystem[] abstractFileSystems = getAllFileSystemSnapshot(); // process snapshot outside lock - Stream.of(abstractFileSystems).filter(AbstractFileSystem::isReleaseable) - .forEach(system -> { - system.closeCommunicationLink(); - closeFileSystem(system); + Stream.of(getAllFileSystemSnapshot()).filter(AbstractFileSystem::isReleaseable) + .forEach(fileSystem -> { + fileSystem.closeCommunicationLink(); + closeFileSystem(fileSystem); }); } From 66b0b9177931b2f7119af7c70b0eae96cddd9ff8 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Wed, 21 Sep 2022 08:39:11 +0800 Subject: [PATCH 06/15] review fix --- .../org/apache/commons/vfs2/provider/AbstractFileProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index 0bc4e48d75..4f26f6b033 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -16,7 +16,8 @@ */ package org.apache.commons.vfs2.provider; -import java.util.*; +import java.util.Map; +import java.util.TreeMap; import java.util.stream.Stream; import org.apache.commons.vfs2.FileName; From 5b05197f84e1a61cc679808ada489e68df49d0eb Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Wed, 21 Sep 2022 22:57:41 +0800 Subject: [PATCH 07/15] review fix --- .../commons/vfs2/provider/AbstractFileProvider.java | 2 +- .../vfs2/provider/http4/Http4FileProvider.java | 2 +- .../vfs2/provider/http5/Http5FileProvider.java | 2 +- .../vfs2/provider/http/HttpProviderTestCase.java | 12 +++++++----- .../vfs2/provider/http4/Http4ProviderTestCase.java | 9 +++++---- .../vfs2/provider/http5/Http5ProviderTestCase.java | 11 ++++++----- 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index 4f26f6b033..a3b84a2e18 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -147,7 +147,7 @@ public void freeUnusedResources() { * Gets snapshot of all fileSystem under lock. * * @return AbstractFileSystem Array - * @since 2.10.0 + * @since 2.10.0 */ public AbstractFileSystem[] getAllFileSystemSnapshot() { final AbstractFileSystem[] abstractFileSystems; diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java index 824c9b0eae..b67bcda9f7 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java @@ -382,7 +382,7 @@ private HttpHost getProxyHttpHost(final Http4FileSystemConfigBuilder builder, /** - * Frees unused resources and close HttpFileSystem. + * Frees unused resources and close Http4FileSystem. */ @Override public void freeUnusedResources() { diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java index 5c0b132869..e9a22cc96f 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http5/Http5FileProvider.java @@ -378,7 +378,7 @@ private HttpHost getProxyHttpHost(final Http5FileSystemConfigBuilder builder, /** - * Frees unused resources and close HttpFileSystem. + * Frees unused resources and close Http5FileSystem. */ @Override public void freeUnusedResources() { diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java index 59e8db2e0a..6329882a36 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java @@ -20,6 +20,7 @@ import java.io.File; import java.time.Duration; +import java.util.concurrent.TimeUnit; import org.apache.commons.vfs2.AbstractProviderTestConfig; import org.apache.commons.vfs2.FileNotFolderException; @@ -223,16 +224,17 @@ public void testHttpFileSystemFreeUnusedResources() throws Exception { fileSystemManager.setFilesCache(new WeakRefFilesCache()); fileSystemManager.init(); - String path = "http://www.w3schools.com/webservices/tempconvert.asmx?action=WSDL"; - AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); - http4FileSystem.isReleaseable(); + String path = ConnectionUri + "/read-tests/"; + AbstractFileSystem httpFileSystem = getFile(fileSystemManager, path); - while (!http4FileSystem.isReleaseable()) { + long afterFiveSeconds = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); + while (System.currentTimeMillis() <= afterFiveSeconds && !httpFileSystem.isReleaseable()) { // Try GC System.gc(); } + assertTrue(httpFileSystem.isReleaseable()); // free resource - // http4FileSystem.httpclient is closed + // httpFileSystem.httpClient is closed fileSystemManager.freeUnusedResources(); // get file again diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java index cf878705ac..8a68d06e69 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java @@ -227,16 +227,17 @@ public void testHttp4FileSystemFreeUnusedResources() throws Exception { fileSystemManager.setFilesCache(new WeakRefFilesCache()); fileSystemManager.init(); - String path = "http4://www.w3schools.com/webservices/tempconvert.asmx?action=WSDL"; + String path = ConnectionUri + "/read-tests/"; AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); - http4FileSystem.isReleaseable(); - while (!http4FileSystem.isReleaseable()) { + long afterFiveSeconds = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); + while (System.currentTimeMillis() <= afterFiveSeconds && !http4FileSystem.isReleaseable()) { // Try GC System.gc(); } + assertTrue(http4FileSystem.isReleaseable()); // free resource - // http4FileSystem.httpclient is closed + // http4FileSystem.httpClient is closed fileSystemManager.freeUnusedResources(); // get file again diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java index b71893c6a8..d5f86ede68 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java @@ -221,16 +221,17 @@ public void testHttp5FileSystemFreeUnusedResources() throws Exception { fileSystemManager.setFilesCache(new WeakRefFilesCache()); fileSystemManager.init(); - String path = "http5://www.w3schools.com/webservices/tempconvert.asmx?action=WSDL"; - AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); - http4FileSystem.isReleaseable(); + String path = ConnectionUri + "/read-tests/"; + AbstractFileSystem http5FileSystem = getFile(fileSystemManager, path); - while (!http4FileSystem.isReleaseable()) { + long afterFiveSeconds = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); + while (System.currentTimeMillis() <= afterFiveSeconds && !http5FileSystem.isReleaseable()) { // Try GC System.gc(); } + assertTrue(http5FileSystem.isReleaseable()); // free resource - // http4FileSystem.httpclient is closed + // http5FileSystem.httpClient is closed fileSystemManager.freeUnusedResources(); // get file again From 5fee9d8c354ca927ae93f1648a245bf68c0f697b Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Wed, 21 Sep 2022 23:00:45 +0800 Subject: [PATCH 08/15] review fix --- .../commons/vfs2/provider/http/HttpProviderTestCase.java | 4 ++-- .../commons/vfs2/provider/http4/Http4ProviderTestCase.java | 4 ++-- .../commons/vfs2/provider/http5/Http5ProviderTestCase.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java index 6329882a36..a7f74634f5 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java @@ -227,8 +227,8 @@ public void testHttpFileSystemFreeUnusedResources() throws Exception { String path = ConnectionUri + "/read-tests/"; AbstractFileSystem httpFileSystem = getFile(fileSystemManager, path); - long afterFiveSeconds = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); - while (System.currentTimeMillis() <= afterFiveSeconds && !httpFileSystem.isReleaseable()) { + long afterOneSecond = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); + while (System.currentTimeMillis() <= afterOneSecond && !httpFileSystem.isReleaseable()) { // Try GC System.gc(); } diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java index 8a68d06e69..097dd40e66 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java @@ -230,8 +230,8 @@ public void testHttp4FileSystemFreeUnusedResources() throws Exception { String path = ConnectionUri + "/read-tests/"; AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); - long afterFiveSeconds = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); - while (System.currentTimeMillis() <= afterFiveSeconds && !http4FileSystem.isReleaseable()) { + long afterOneSecond = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); + while (System.currentTimeMillis() <= afterOneSecond && !http4FileSystem.isReleaseable()) { // Try GC System.gc(); } diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java index d5f86ede68..6daa18c7a3 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java @@ -224,8 +224,8 @@ public void testHttp5FileSystemFreeUnusedResources() throws Exception { String path = ConnectionUri + "/read-tests/"; AbstractFileSystem http5FileSystem = getFile(fileSystemManager, path); - long afterFiveSeconds = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); - while (System.currentTimeMillis() <= afterFiveSeconds && !http5FileSystem.isReleaseable()) { + long afterOneSecond = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); + while (System.currentTimeMillis() <= afterOneSecond && !http5FileSystem.isReleaseable()) { // Try GC System.gc(); } From 852c9bf4cd7fb0df92f6aa186104c196e315ae34 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Wed, 21 Sep 2022 23:01:43 +0800 Subject: [PATCH 09/15] Revert "VFS-824 Fix HttpFileSystem free Unused Resources lead to HttpClient Connection Pool Shutdown" This reverts commit 7c09877efd490903289c44e504c48034f87f08f2. --- .../apache/commons/vfs2/provider/http4/Http4FileProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java index b67bcda9f7..d640fcacaa 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http4/Http4FileProvider.java @@ -206,7 +206,6 @@ protected HttpClientBuilder createHttpClientBuilder(final Http4FileSystemConfigB final HostnameVerifier hostNameVerifier = createHostnameVerifier(builder, fileSystemOptions); final HttpClientBuilder httpClientBuilder = HttpClients.custom() - .setConnectionManagerShared(true) .setRoutePlanner(createHttpRoutePlanner(builder, fileSystemOptions)) .setConnectionManager(createConnectionManager(builder, fileSystemOptions, sslContext, hostNameVerifier)) .setSSLContext(sslContext) From 5d0f199d3522fdc650f3d9e42afb117a438e3515 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Thu, 22 Sep 2022 09:03:32 +0800 Subject: [PATCH 10/15] unit test: sleep 20 millis --- .../apache/commons/vfs2/provider/http/HttpProviderTestCase.java | 1 + .../commons/vfs2/provider/http4/Http4ProviderTestCase.java | 1 + .../commons/vfs2/provider/http5/Http5ProviderTestCase.java | 1 + 3 files changed, 3 insertions(+) diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java index a7f74634f5..d47678b475 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java @@ -231,6 +231,7 @@ public void testHttpFileSystemFreeUnusedResources() throws Exception { while (System.currentTimeMillis() <= afterOneSecond && !httpFileSystem.isReleaseable()) { // Try GC System.gc(); + Thread.sleep(20); } assertTrue(httpFileSystem.isReleaseable()); // free resource diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java index 097dd40e66..9dab446969 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java @@ -234,6 +234,7 @@ public void testHttp4FileSystemFreeUnusedResources() throws Exception { while (System.currentTimeMillis() <= afterOneSecond && !http4FileSystem.isReleaseable()) { // Try GC System.gc(); + Thread.sleep(20); } assertTrue(http4FileSystem.isReleaseable()); // free resource diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java index 6daa18c7a3..3e0c42ebc3 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java @@ -228,6 +228,7 @@ public void testHttp5FileSystemFreeUnusedResources() throws Exception { while (System.currentTimeMillis() <= afterOneSecond && !http5FileSystem.isReleaseable()) { // Try GC System.gc(); + Thread.sleep(20); } assertTrue(http5FileSystem.isReleaseable()); // free resource From 4853cca482b252dcd3be15ec7ed541f2ed1dc474 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Sat, 14 Jan 2023 16:39:09 +0800 Subject: [PATCH 11/15] unit test: fix:decrease AbstractFileSystem.useCount directly,make FileSystem.isReleaseable is true --- .../provider/AbstractFileSystemTestUtil.java | 29 +++++++++++++++++++ .../provider/http/HttpProviderTestCase.java | 10 +++---- .../provider/http4/Http4ProviderTestCase.java | 11 +++---- .../provider/http5/Http5ProviderTestCase.java | 10 +++---- 4 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/AbstractFileSystemTestUtil.java diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/AbstractFileSystemTestUtil.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/AbstractFileSystemTestUtil.java new file mode 100644 index 0000000000..b73f10ff8f --- /dev/null +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/AbstractFileSystemTestUtil.java @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.vfs2.provider; + +import org.apache.commons.vfs2.FileObject; + +public class AbstractFileSystemTestUtil { + + /** + * call {@link AbstractFileSystem#fileObjectDestroyed(FileObject)} + */ + public static void fileObjectDestroyed(final AbstractFileSystem fileSystem, final FileObject fileObject) { + fileSystem.fileObjectDestroyed(fileObject); + } +} diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java index d47678b475..6447b603a3 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java @@ -34,6 +34,7 @@ import org.apache.commons.vfs2.impl.DefaultFileSystemManager; import org.apache.commons.vfs2.impl.StandardFileSystemManager; import org.apache.commons.vfs2.provider.AbstractFileSystem; +import org.apache.commons.vfs2.provider.AbstractFileSystemTestUtil; import org.apache.commons.vfs2.util.NHttpFileServer; import org.junit.Test; import org.junit.jupiter.api.Assertions; @@ -227,12 +228,9 @@ public void testHttpFileSystemFreeUnusedResources() throws Exception { String path = ConnectionUri + "/read-tests/"; AbstractFileSystem httpFileSystem = getFile(fileSystemManager, path); - long afterOneSecond = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); - while (System.currentTimeMillis() <= afterOneSecond && !httpFileSystem.isReleaseable()) { - // Try GC - System.gc(); - Thread.sleep(20); - } + // make FileSystem.isReleaseable is true through GC will break the build randomly. + // It is better to decrease AbstractFileSystem.useCount directly. + AbstractFileSystemTestUtil.fileObjectDestroyed(httpFileSystem,null); assertTrue(httpFileSystem.isReleaseable()); // free resource // httpFileSystem.httpClient is closed diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java index 9dab446969..600c2f31f7 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java @@ -34,6 +34,7 @@ import org.apache.commons.vfs2.impl.DefaultFileSystemManager; import org.apache.commons.vfs2.impl.StandardFileSystemManager; import org.apache.commons.vfs2.provider.AbstractFileSystem; +import org.apache.commons.vfs2.provider.AbstractFileSystemTestUtil; import org.apache.commons.vfs2.util.NHttpFileServer; import org.junit.jupiter.api.Assertions; import org.junit.Test; @@ -229,13 +230,9 @@ public void testHttp4FileSystemFreeUnusedResources() throws Exception { String path = ConnectionUri + "/read-tests/"; AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); - - long afterOneSecond = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); - while (System.currentTimeMillis() <= afterOneSecond && !http4FileSystem.isReleaseable()) { - // Try GC - System.gc(); - Thread.sleep(20); - } + // make FileSystem.isReleaseable is true through GC will break the build randomly. + // It is better to decrease AbstractFileSystem.useCount directly. + AbstractFileSystemTestUtil.fileObjectDestroyed(http4FileSystem,null); assertTrue(http4FileSystem.isReleaseable()); // free resource // http4FileSystem.httpClient is closed diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java index 3e0c42ebc3..e46d778e7c 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java @@ -34,6 +34,7 @@ import org.apache.commons.vfs2.impl.DefaultFileSystemManager; import org.apache.commons.vfs2.impl.StandardFileSystemManager; import org.apache.commons.vfs2.provider.AbstractFileSystem; +import org.apache.commons.vfs2.provider.AbstractFileSystemTestUtil; import org.apache.commons.vfs2.util.NHttpFileServer; import org.junit.Test; import org.junit.jupiter.api.Assertions; @@ -224,12 +225,9 @@ public void testHttp5FileSystemFreeUnusedResources() throws Exception { String path = ConnectionUri + "/read-tests/"; AbstractFileSystem http5FileSystem = getFile(fileSystemManager, path); - long afterOneSecond = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1); - while (System.currentTimeMillis() <= afterOneSecond && !http5FileSystem.isReleaseable()) { - // Try GC - System.gc(); - Thread.sleep(20); - } + // make FileSystem.isReleaseable is true through GC will break the build randomly. + // It is better to decrease AbstractFileSystem.useCount directly. + AbstractFileSystemTestUtil.fileObjectDestroyed(http5FileSystem,null); assertTrue(http5FileSystem.isReleaseable()); // free resource // http5FileSystem.httpClient is closed From 63017d94a737a45b082f427ede915ccb17c3e0e3 Mon Sep 17 00:00:00 2001 From: xieyuliang <18056235081@189.cn> Date: Sat, 14 Jan 2023 16:41:23 +0800 Subject: [PATCH 12/15] unit test: fix:decrease AbstractFileSystem.useCount directly,make FileSystem.isReleaseable is true --- .../apache/commons/vfs2/provider/http/HttpProviderTestCase.java | 2 +- .../commons/vfs2/provider/http4/Http4ProviderTestCase.java | 2 +- .../commons/vfs2/provider/http5/Http5ProviderTestCase.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java index 6447b603a3..f096e09c90 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http/HttpProviderTestCase.java @@ -230,7 +230,7 @@ public void testHttpFileSystemFreeUnusedResources() throws Exception { // make FileSystem.isReleaseable is true through GC will break the build randomly. // It is better to decrease AbstractFileSystem.useCount directly. - AbstractFileSystemTestUtil.fileObjectDestroyed(httpFileSystem,null); + AbstractFileSystemTestUtil.fileObjectDestroyed(httpFileSystem, null); assertTrue(httpFileSystem.isReleaseable()); // free resource // httpFileSystem.httpClient is closed diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java index 600c2f31f7..757ead8878 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http4/Http4ProviderTestCase.java @@ -232,7 +232,7 @@ public void testHttp4FileSystemFreeUnusedResources() throws Exception { AbstractFileSystem http4FileSystem = getFile(fileSystemManager, path); // make FileSystem.isReleaseable is true through GC will break the build randomly. // It is better to decrease AbstractFileSystem.useCount directly. - AbstractFileSystemTestUtil.fileObjectDestroyed(http4FileSystem,null); + AbstractFileSystemTestUtil.fileObjectDestroyed(http4FileSystem, null); assertTrue(http4FileSystem.isReleaseable()); // free resource // http4FileSystem.httpClient is closed diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java index e46d778e7c..4ad7c080d2 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/provider/http5/Http5ProviderTestCase.java @@ -227,7 +227,7 @@ public void testHttp5FileSystemFreeUnusedResources() throws Exception { // make FileSystem.isReleaseable is true through GC will break the build randomly. // It is better to decrease AbstractFileSystem.useCount directly. - AbstractFileSystemTestUtil.fileObjectDestroyed(http5FileSystem,null); + AbstractFileSystemTestUtil.fileObjectDestroyed(http5FileSystem, null); assertTrue(http5FileSystem.isReleaseable()); // free resource // http5FileSystem.httpClient is closed From ed09716148e0e4af6b255fa83bee474cd65cb13e Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 18 Jan 2023 12:18:58 -0500 Subject: [PATCH 13/15] Remove extra empty lines --- .../org/apache/commons/vfs2/provider/AbstractFileProvider.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index a3b84a2e18..59517cbd07 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -142,7 +142,6 @@ public void freeUnusedResources() { .forEach(AbstractFileSystem::closeCommunicationLink); } - /** * Gets snapshot of all fileSystem under lock. * @@ -158,7 +157,6 @@ public AbstractFileSystem[] getAllFileSystemSnapshot() { return abstractFileSystems; } - /** * Gets the FileSystemConfigBuilder. * From fa05f615fdb95728798697aff901564ace4580c2 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 18 Jan 2023 12:19:21 -0500 Subject: [PATCH 14/15] Remove extra empty lines --- .../org/apache/commons/vfs2/provider/http/HttpFileProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java index 406faf7936..fd803fb00e 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileProvider.java @@ -96,7 +96,6 @@ public FileSystemConfigBuilder getConfigBuilder() { return HttpFileSystemConfigBuilder.getInstance(); } - /** * Frees unused resources and close HttpFileSystem. */ From 27e842a4bde546575c854a1175f62f6ed31e5ad6 Mon Sep 17 00:00:00 2001 From: Gary Gregory Date: Wed, 18 Jan 2023 13:10:25 -0500 Subject: [PATCH 15/15] Clean up and fix Javadoc --- .../commons/vfs2/provider/AbstractFileProvider.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java index 59517cbd07..f1ae2f0474 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/provider/AbstractFileProvider.java @@ -143,18 +143,15 @@ public void freeUnusedResources() { } /** - * Gets snapshot of all fileSystem under lock. + * Gets a snapshot of all AbstractFileSystems. * - * @return AbstractFileSystem Array + * @return a snapshot of all AbstractFileSystems. * @since 2.10.0 */ public AbstractFileSystem[] getAllFileSystemSnapshot() { - final AbstractFileSystem[] abstractFileSystems; synchronized (fileSystemMap) { - // create snapshot under lock - abstractFileSystems = fileSystemMap.values().toArray(EMPTY_ABSTRACT_FILE_SYSTEMS); + return fileSystemMap.values().toArray(EMPTY_ABSTRACT_FILE_SYSTEMS); } - return abstractFileSystems; } /**