diff options
author | Mengxin Zhu | 2011-11-21 03:39:34 +0000 |
---|---|---|
committer | Mengxin Zhu | 2011-12-07 06:46:31 +0000 |
commit | f57a1651a3ed5baa7393d575b7f8726b31707d28 (patch) | |
tree | fe1ed2ab233d4a83e6ad661d18a26661099701df /bundles/org.eclipse.equinox.p2.tests/src | |
parent | 3ab674b9e4971c53b190f7d77f17c75ee13df4a0 (diff) | |
download | rt.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')
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()]); + } +} |