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();
   }
 
   /**