Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMengxin Zhu2011-11-21 03:39:34 +0000
committerMengxin Zhu2011-12-07 06:46:31 +0000
commitf57a1651a3ed5baa7393d575b7f8726b31707d28 (patch)
treefe1ed2ab233d4a83e6ad661d18a26661099701df /bundles/org.eclipse.equinox.p2.tests/src
parent3ab674b9e4971c53b190f7d77f17c75ee13df4a0 (diff)
downloadrt.equinox.p2-f57a1651a3ed5baa7393d575b7f8726b31707d28.tar.gz
rt.equinox.p2-f57a1651a3ed5baa7393d575b7f8726b31707d28.tar.xz
rt.equinox.p2-f57a1651a3ed5baa7393d575b7f8726b31707d28.zip
Fix 351944 to avoid unnecessary loading artifact repository when doing query, getting artifact descriptors via artifact key.v20111207-0646
Without fixing though simple artifact repository always checks the last modify of artifacts.jar file, however it still cost some time, it will waste a lot of time especially the repository locates on a read-only NFS server. This version of fix introduces the dependency on o.e.core.filesystem to use EFS API to change the file permission crossing platforms. Signed-off-by: Mengxin Zhu <kane.zhu@windriver.com>
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.tests/src')
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/Bug351944.java109
2 files changed, 110 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java
index 74095af3b..47f820527 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java
@@ -27,6 +27,7 @@ public class AllTests extends TestCase {
suite.addTestSuite(BatchExecuteArtifactRepositoryTest.class);
suite.addTestSuite(Bug252308.class);
suite.addTestSuite(Bug265577.class);
+ suite.addTestSuite(Bug351944.class);
suite.addTestSuite(CompositeArtifactRepositoryTest.class);
suite.addTestSuite(CorruptedJar.class);
suite.addTestSuite(FoldersRepositoryTest.class);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/Bug351944.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/Bug351944.java
new file mode 100644
index 000000000..2b9abfe0c
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/Bug351944.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Wind River and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Wind River - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.equinox.p2.tests.artifact.repository;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.*;
+import org.eclipse.core.filesystem.*;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.equinox.p2.core.ProvisionException;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.query.IQueryResult;
+import org.eclipse.equinox.p2.repository.artifact.*;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+
+public class Bug351944 extends AbstractProvisioningTest {
+
+ File artifactRepoFile = null;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ File testData = getTestData("artifact repository", "testData/bug351944");
+ artifactRepoFile = getTempFolder();
+ copy("Copy to temporary folder", testData, artifactRepoFile);
+ changeWritePermission(artifactRepoFile, false);
+ }
+
+ private void changeWritePermission(File target, boolean canWrite) throws CoreException {
+ if (target.exists()) {
+ IFileStore fileStore = EFS.getLocalFileSystem().getStore(target.toURI());
+ IFileInfo fileInfo = fileStore.fetchInfo();
+ fileInfo.setAttribute(EFS.ATTRIBUTE_GROUP_WRITE, canWrite);
+ fileInfo.setAttribute(EFS.ATTRIBUTE_OWNER_WRITE, canWrite);
+ fileStore.putInfo(fileInfo, EFS.SET_ATTRIBUTES, new NullProgressMonitor());
+ if (target.isDirectory()) {
+ for (File child : target.listFiles())
+ changeWritePermission(child, canWrite);
+ }
+ }
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ changeWritePermission(artifactRepoFile, true);
+ delete(artifactRepoFile);
+ }
+
+ public void testSimpleRepositoryPerformanceOnLoadReadonlyLocalRepository() throws ProvisionException, URISyntaxException {
+ final URI testRepo = artifactRepoFile.toURI();
+ IArtifactRepositoryManager artifactRepositoryManager = getArtifactRepositoryManager();
+ IArtifactRepository repo = artifactRepositoryManager.loadRepository(testRepo, new NullProgressMonitor());
+ IQueryResult<IArtifactKey> allArtifactKeys = repo.query(ArtifactKeyQuery.ALL_KEYS, new NullProgressMonitor());
+ Set<IArtifactKey> keySet = allArtifactKeys.toUnmodifiableSet();
+
+ Collection<IArtifactRequest> requests = new ArrayList<IArtifactRequest>();
+ for (IArtifactKey key : keySet)
+ requests.add(artifactRepositoryManager.createMirrorRequest(key, repo, null, null));
+
+ long start = System.currentTimeMillis();
+ IArtifactRequest[] toBeRequests = getRequestsForRepository(repo, requests.toArray(new IArtifactRequest[requests.size()]));
+ long end = System.currentTimeMillis();
+ long queryArtifactOneByOne = end - start;
+
+ start = System.currentTimeMillis();
+ IArtifactRequest[] toBeRequests2 = getRequestsForRepository2(repo, requests.toArray(new IArtifactRequest[requests.size()]));
+ end = System.currentTimeMillis();
+ long queryAllArtifacts = end - start;
+
+ assertEquals("Test case has problem, not find same requests.", toBeRequests.length, toBeRequests2.length);
+ assertEquals("Querying artifact key from simple repository has performance issue.", queryAllArtifacts, queryArtifactOneByOne, 10);
+ }
+
+ /**
+ * copy from {@link org.eclipse.equinox.internal.p2.engine.DownloadManager}
+ * @param repository
+ * @param requestsToProcess
+ * @return
+ */
+ private IArtifactRequest[] getRequestsForRepository(IArtifactRepository repository, IArtifactRequest[] requestsToProcess) {
+ ArrayList<IArtifactRequest> applicable = new ArrayList<IArtifactRequest>();
+ for (IArtifactRequest request : requestsToProcess) {
+ if (repository.contains(request.getArtifactKey()))
+ applicable.add(request);
+ }
+ return applicable.toArray(new IArtifactRequest[applicable.size()]);
+ }
+
+ private IArtifactRequest[] getRequestsForRepository2(IArtifactRepository repository, IArtifactRequest[] requestsToProcess) {
+ Set<IArtifactKey> keys = repository.query(ArtifactKeyQuery.ALL_KEYS, new NullProgressMonitor()).toSet();
+ ArrayList<IArtifactRequest> applicable = new ArrayList<IArtifactRequest>();
+ for (IArtifactRequest request : requestsToProcess) {
+ if (keys.contains(request.getArtifactKey()))
+ applicable.add(request);
+ }
+ return applicable.toArray(new IArtifactRequest[applicable.size()]);
+ }
+}

Back to the top