SOLR-13822: Added a testcase and a bug fix

This commit is contained in:
noble 2019-11-13 17:42:37 +11:00
parent 11fd8d630a
commit 550c7296b6
4 changed files with 47 additions and 15 deletions

View File

@ -71,15 +71,12 @@ public class DistribPackageStore implements PackageStore {
} }
@Override @Override
public Path getRealpath(String path) { public Path getRealpath(String path) {
if (File.separatorChar == '\\') { if (File.separatorChar == '\\') {
path = path.replace('/', File.separatorChar); path = path.replace('/', File.separatorChar);
} }
if (path.charAt(0) != File.separatorChar) { if (!path.isEmpty() && path.charAt(0) != File.separatorChar) {
path = File.separator + path; path = File.separator + path;
} }
return new File(this.coreContainer.getResourceLoader().getInstancePath() + return new File(this.coreContainer.getResourceLoader().getInstancePath() +
@ -222,7 +219,7 @@ public class DistribPackageStore implements PackageStore {
"?meta=true&wt=javabin&omitHeader=true"; "?meta=true&wt=javabin&omitHeader=true";
boolean nodeHasBlob = false; boolean nodeHasBlob = false;
Object nl = Utils.executeGET(coreContainer.getUpdateShardHandler().getDefaultHttpClient(), reqUrl, Utils.JAVABINCONSUMER); Object nl = Utils.executeGET(coreContainer.getUpdateShardHandler().getDefaultHttpClient(), reqUrl, Utils.JAVABINCONSUMER);
if (Utils.getObjectByPath(nl, false, Arrays.asList("files", getMetaPath())) != null) { if (Utils.getObjectByPath(nl, false, Arrays.asList("files", path)) != null) {
nodeHasBlob = true; nodeHasBlob = true;
} }
@ -292,7 +289,7 @@ public class DistribPackageStore implements PackageStore {
return; return;
} }
ew.put("timestamp", getTimeStamp()); ew.put("timestamp", getTimeStamp());
if(metaData != null) if (metaData != null)
metaData.writeMap(ew); metaData.writeMap(ew);
} }
@ -388,7 +385,14 @@ public class DistribPackageStore implements PackageStore {
} }
if (from == null || "*".equals(from)) { if (from == null || "*".equals(from)) {
f.fetchFromAnyNode(); log.info("Missing file in package store: {}", path);
if (f.fetchFromAnyNode()) {
log.info("Successfully downloaded : {}", path);
return true;
} else{
log.info("Unable to download file : {}", path);
return false;
}
} else { } else {
f.fetchFileFromNodeAndPersist(from); f.fetchFileFromNodeAndPersist(from);

View File

@ -18,6 +18,7 @@
package org.apache.solr.pkg; package org.apache.solr.pkg;
import java.io.IOException; import java.io.IOException;
import java.io.StringWriter;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@ -35,7 +36,6 @@ import org.apache.solr.client.solrj.request.beans.Package;
import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException;
import org.apache.solr.common.annotation.JsonProperty; import org.apache.solr.common.annotation.JsonProperty;
import org.apache.solr.common.cloud.SolrZkClient; import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.cloud.ZooKeeperException; import org.apache.solr.common.cloud.ZooKeeperException;
import org.apache.solr.common.util.CommandOperation; import org.apache.solr.common.util.CommandOperation;
import org.apache.solr.common.util.ReflectMapWriter; import org.apache.solr.common.util.ReflectMapWriter;
@ -65,7 +65,7 @@ public class PackageAPI {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
final CoreContainer coreContainer; final CoreContainer coreContainer;
private final ObjectMapper mapper = new ObjectMapper(); private final ObjectMapper mapper = SolrJacksonAnnotationInspector.createObjectMapper();
private final PackageLoader packageLoader; private final PackageLoader packageLoader;
Packages pkgs; Packages pkgs;
@ -75,9 +75,14 @@ public class PackageAPI {
public PackageAPI(CoreContainer coreContainer, PackageLoader loader) { public PackageAPI(CoreContainer coreContainer, PackageLoader loader) {
this.coreContainer = coreContainer; this.coreContainer = coreContainer;
this.packageLoader = loader; this.packageLoader = loader;
mapper.setAnnotationIntrospector(SolrJacksonAnnotationInspector.INSTANCE);
pkgs = new Packages(); pkgs = new Packages();
SolrZkClient zkClient = coreContainer.getZkController().getZkClient(); SolrZkClient zkClient = coreContainer.getZkController().getZkClient();
try {
pkgs = readPkgsFromZk(null, null);
} catch (KeeperException |InterruptedException e ) {
pkgs = new Packages();
//ignore
}
try { try {
registerListener(zkClient); registerListener(zkClient);
} catch (KeeperException | InterruptedException e) { } catch (KeeperException | InterruptedException e) {
@ -129,7 +134,7 @@ public class PackageAPI {
if (data == null || stat == null) { if (data == null || stat == null) {
stat = new Stat(); stat = new Stat();
data = coreContainer.getZkController().getZkClient() data = coreContainer.getZkController().getZkClient()
.getData(ZkStateReader.CLUSTER_PROPS, null, stat, true); .getData(SOLR_PKGS_PATH, null, stat, true);
} }
Packages packages = null; Packages packages = null;
@ -183,7 +188,6 @@ public class PackageAPI {
this.files = addVersion.files; this.files = addVersion.files;
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (obj instanceof PkgVersion) { if (obj instanceof PkgVersion) {
@ -194,6 +198,15 @@ public class PackageAPI {
} }
return false; return false;
} }
@Override
public String toString() {
try {
return Utils.writeJson(this, new StringWriter(), false).toString() ;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
} }

View File

@ -53,7 +53,7 @@ public class PackageLoader implements Closeable {
private final CoreContainer coreContainer; private final CoreContainer coreContainer;
private final Map<String, Package> packageClassLoaders = new ConcurrentHashMap<>(); private final Map<String, Package> packageClassLoaders = new ConcurrentHashMap<>();
private PackageAPI.Packages myCopy; private PackageAPI.Packages myCopy = new PackageAPI.Packages();
private PackageAPI packageAPI; private PackageAPI packageAPI;
@ -61,7 +61,7 @@ public class PackageLoader implements Closeable {
public PackageLoader(CoreContainer coreContainer) { public PackageLoader(CoreContainer coreContainer) {
this.coreContainer = coreContainer; this.coreContainer = coreContainer;
packageAPI = new PackageAPI(coreContainer, this); packageAPI = new PackageAPI(coreContainer, this);
myCopy = packageAPI.pkgs; refreshPackageConf();
} }
@ -104,6 +104,7 @@ public class PackageLoader implements Closeable {
for (SolrCore core : coreContainer.getCores()) { for (SolrCore core : coreContainer.getCores()) {
core.getPackageListeners().packagesUpdated(updated); core.getPackageListeners().packagesUpdated(updated);
} }
myCopy = packageAPI.pkgs;
} }
public Map<String, List<PackageAPI.PkgVersion>> getModified(PackageAPI.Packages old, PackageAPI.Packages newPkgs) { public Map<String, List<PackageAPI.PkgVersion>> getModified(PackageAPI.Packages old, PackageAPI.Packages newPkgs) {
@ -248,6 +249,8 @@ public class PackageLoader implements Closeable {
this.version = v; this.version = v;
List<Path> paths = new ArrayList<>(); List<Path> paths = new ArrayList<>();
for (String file : version.files) { for (String file : version.files) {
//ensure that the files are downloaded and available
coreContainer.getPackageStoreAPI().getPackageStore().fetch(file,null);
paths.add(coreContainer.getPackageStoreAPI().getPackageStore().getRealpath(file)); paths.add(coreContainer.getPackageStoreAPI().getPackageStore().getRealpath(file));
} }

View File

@ -57,6 +57,7 @@ import static org.apache.solr.common.params.CommonParams.JAVABIN;
import static org.apache.solr.common.params.CommonParams.WT; import static org.apache.solr.common.params.CommonParams.WT;
import static org.apache.solr.core.TestDynamicLoading.getFileContent; import static org.apache.solr.core.TestDynamicLoading.getFileContent;
import static org.apache.solr.filestore.TestDistribPackageStore.readFile; import static org.apache.solr.filestore.TestDistribPackageStore.readFile;
import static org.apache.solr.filestore.TestDistribPackageStore.waitForAllNodesHaveFile;
@LogLevel("org.apache.solr.pkg.PackageLoader=DEBUG;org.apache.solr.pkg.PackageAPI=DEBUG") @LogLevel("org.apache.solr.pkg.PackageLoader=DEBUG;org.apache.solr.pkg.PackageAPI=DEBUG")
//@org.apache.lucene.util.LuceneTestCase.AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/SOLR-13822") // leaks files //@org.apache.lucene.util.LuceneTestCase.AwaitsFix(bugUrl="https://issues.apache.org/jira/browse/SOLR-13822") // leaks files
@ -297,6 +298,17 @@ public class TestPackages extends SolrCloudTestCase {
verifyCmponent(cluster.getSolrClient(), verifyCmponent(cluster.getSolrClient(),
COLLECTION_NAME, "requestHandler", "/runtime", COLLECTION_NAME, "requestHandler", "/runtime",
"mypkg", "2.1" ); "mypkg", "2.1" );
//we create a new node. This node does not have the packages. But it should download it from another node
JettySolrRunner jetty = cluster.startJettySolrRunner();
//create a new replica for this collection. it should end up
CollectionAdminRequest.addReplicaToShard(COLLECTION_NAME, "shard1")
.setNrtReplicas(1)
.setNode(jetty.getNodeName())
.process(cluster.getSolrClient());
cluster.waitForActiveCollection(COLLECTION_NAME, 2, 5);
waitForAllNodesHaveFile(cluster,FILE3,
Utils.makeMap(":files:" + FILE3 + ":name", "runtimelibs_v3.jar"),
false);
} finally { } finally {
cluster.shutdown(); cluster.shutdown();