package store PUT should be idempotent
diff --git a/solr/core/src/java/org/apache/solr/filestore/PackageStoreAPI.java b/solr/core/src/java/org/apache/solr/filestore/PackageStoreAPI.java
index 00b5d7d..c6ad55d 100644
--- a/solr/core/src/java/org/apache/solr/filestore/PackageStoreAPI.java
+++ b/solr/core/src/java/org/apache/solr/filestore/PackageStoreAPI.java
@@ -27,6 +27,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -158,6 +159,17 @@
List<String> signatures = readSignatures(req, buf);
MetaData meta = _createJsonMetaData(buf, signatures);
PackageStore.FileType type = packageStore.getType(path, true);
+ boolean[] returnAfter = new boolean[]{false};
+ if (type == PackageStore.FileType.FILE) {
+ packageStore.get(path, fileEntry -> {
+ if (meta.equals(fileEntry.meta)) {
+ returnAfter[0] = true;
+ rsp.add(CommonParams.FILE, path);
+ rsp.add("message","File with same metadata exists ");
+ }
+ }, true);
+ }
+ if(returnAfter[0]) return;
if(type != PackageStore.FileType.NOFILE) {
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Path already exists "+ path);
}
@@ -320,6 +332,17 @@
}
@Override
+ public boolean equals(Object that) {
+ if (that instanceof MetaData) {
+ MetaData metaData = (MetaData) that;
+ return Objects.equals(sha512, metaData.sha512) &&
+ Objects.equals(signatures, metaData.signatures) &&
+ Objects.equals(otherAttribs, metaData.otherAttribs);
+ }
+ return false;
+ }
+
+ @Override
public void writeMap(EntryWriter ew) throws IOException {
ew.putIfNotNull("sha512", sha512);
ew.putIfNotNull("sig", signatures);
diff --git a/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java b/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
index e7f7ab0..fe9717b 100644
--- a/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
+++ b/solr/core/src/test/org/apache/solr/filestore/TestDistribPackageStore.java
@@ -96,6 +96,14 @@
"L3q/qIGs4NaF6JiO0ZkMUFa88j0OmYc+I6O7BOdNuMct/xoZ4h73aZHZGc0+nmI1f/U3bOlMPINlSOM6LK3JpQ=="
);
+ NavigableObject rsp = postFile(cluster.getSolrClient(), getFileContent("runtimecode/runtimelibs.jar.bin"),
+ "/package/mypkg/v1.0/runtimelibs.jar",
+ "L3q/qIGs4NaF6JiO0ZkMUFa88j0OmYc+I6O7BOdNuMct/xoZ4h73aZHZGc0+nmI1f/U3bOlMPINlSOM6LK3JpQ=="
+ );
+ assertTrue(rsp._getStr("message", "").contains("File with same metadata exists "));
+
+
+
assertResponseValues(10,
cluster.getSolrClient(),
new V2Request.Builder("/node/files/package/mypkg/v1.0")
@@ -261,7 +269,7 @@
false);
}
- public static void postFile(SolrClient client, ByteBuffer buffer, String name, String sig)
+ public static NavigableObject postFile(SolrClient client, ByteBuffer buffer, String name, String sig)
throws SolrServerException, IOException {
String resource = "/cluster/files" + name;
ModifiableSolrParams params = new ModifiableSolrParams();
@@ -275,6 +283,7 @@
.build()
.process(client);
assertEquals(name, rsp.getResponse().get(CommonParams.FILE));
+ return rsp.getResponse();
}
/**