From 522367cc4db3b23ddd728b407f2d10326bb9c858 Mon Sep 17 00:00:00 2001 From: Erick Erickson Date: Sun, 6 Aug 2017 09:48:16 -0700 Subject: [PATCH 1/7] SOLR-11198: downconfig downloads empty file as folder --- solr/CHANGES.txt | 2 + .../apache/solr/cloud/SolrCLIZkUtilsTest.java | 76 ++++++++++++++++++- .../solr/common/cloud/ZkMaintenanceUtils.java | 6 +- 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index fcff490a26a..f6c04244887 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -765,6 +765,8 @@ when using one of Exact*StatsCache (Mikhail Khludnev) * SOLR-10908: CloudSolrStream.toExpression incorrectly handles fq clauses (Rohit Singh via Erick Erickson) +* SOLR-11198: downconfig downloads empty file as folder (Erick Erickson) + Optimizations ---------------------- * SOLR-10634: JSON Facet API: When a field/terms facet will retrieve all buckets (i.e. limit:-1) diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java index 776075e7b61..579e93d7493 100644 --- a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java @@ -106,7 +106,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase { @Test public void testDownconfig() throws Exception { - Path tmp = createTempDir("downConfigNewPlace"); + Path tmp = Paths.get(createTempDir("downConfigNewPlace").toAbsolutePath().toString(), "myconfset"); // First we need a configset on ZK to bring down. @@ -127,6 +127,28 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase { assertEquals("Download should have succeeded.", 0, res); verifyZkLocalPathsMatch(Paths.get(tmp.toAbsolutePath().toString(), "conf"), "/configs/downconfig1"); + // Insure that empty files don't become directories (SOLR-11198) + + Path emptyFile = Paths.get(tmp.toAbsolutePath().toString(), "conf", "stopwords", "emptyfile"); + Files.createFile(emptyFile); + + // Now copy it up and back and insure it's still a file in the new place + copyConfigUp(tmp.getParent(), "myconfset", "downconfig2"); + Path tmp2 = createTempDir("downConfigNewPlace2"); + downTool = new SolrCLI.ConfigSetDownloadTool(); + args = new String[]{ + "-confname", "downconfig2", + "-confdir", tmp2.toAbsolutePath().toString(), + "-zkHost", zkAddr, + }; + + res = downTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(downTool.getOptions()), args)); + assertEquals("Download should have succeeded.", 0, res); + verifyZkLocalPathsMatch(Paths.get(tmp.toAbsolutePath().toString(), "conf"), "/configs/downconfig2"); + // And insure the empty file is a text file + Path destEmpty = Paths.get(tmp2.toAbsolutePath().toString(), "conf", "stopwords", "emptyfile"); + assertTrue("Empty files should NOT be copied down as directories", destEmpty.toFile().isFile()); + } @Test @@ -373,6 +395,58 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase { content = new String(zkClient.getData("/cp9/conf/stopwords", null, null, true), StandardCharsets.UTF_8); assertTrue("There should be content in the node! ", content.contains("{Some Arbitrary Data}")); + // Copy an individual empty file up and back down and insure it's still a file + Path emptyFile = Paths.get(tmp.toAbsolutePath().toString(), "conf", "stopwords", "emptyfile"); + Files.createFile(emptyFile); + + args = new String[]{ + "-src", "file:" + emptyFile.toAbsolutePath().toString(), + "-dst", "zk:/cp7/conf/stopwords/emptyFile", + "-recurse", "false", + "-zkHost", zkAddr, + }; + + res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args)); + assertEquals("Copy should have succeeded.", 0, res); + + Path tmp2 = createTempDir("cp9"); + Path emptyDest = Paths.get(tmp2.toAbsolutePath().toString(), "emptyFile"); + args = new String[]{ + "-src", "zk:/cp7/conf/stopwords/emptyFile", + "-dst", "file:" + emptyDest.toAbsolutePath().toString(), + "-recurse", "false", + "-zkHost", zkAddr, + }; + res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args)); + assertEquals("Copy should have succeeded.", 0, res); + + assertTrue("Empty files should NOT be copied down as directories", emptyDest.toFile().isFile()); + + // Now with recursive copy + + args = new String[]{ + "-src", "file:" + emptyFile.getParent().getParent().toString(), + "-dst", "zk:/cp10", + "-recurse", "true", + "-zkHost", zkAddr, + }; + + res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args)); + assertEquals("Copy should have succeeded.", 0, res); + + // Now copy it all back and make sure empty file is still a file when recursively copying. + tmp2 = createTempDir("cp10"); + args = new String[]{ + "-src", "zk:/cp10", + "-dst", "file:" + tmp2.toAbsolutePath().toString(), + "-recurse", "true", + "-zkHost", zkAddr, + }; + res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args)); + assertEquals("Copy should have succeeded.", 0, res); + + Path locEmpty = Paths.get(tmp2.toAbsolutePath().toString(), "stopwords", "emptyFile"); + assertTrue("Empty files should NOT be copied down as directories", locEmpty.toFile().isFile()); } @Test diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java index dfdc8cf2fd3..6843480ab8f 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java @@ -308,13 +308,13 @@ public class ZkMaintenanceUtils { public static void downloadFromZK(SolrZkClient zkClient, String zkPath, Path file) throws IOException { try { List children = zkClient.getChildren(zkPath, null, true); - // If it has no children, it's a leaf node, write the assoicated data from the ZNode. + // If it has no children, it's a leaf node, write the associated data from the ZNode. // Otherwise, continue recursing, but write the associated data to a special file if any if (children.size() == 0) { // If we didn't copy data down, then we also didn't create the file. But we still need a marker on the local - // disk so create a dir. + // disk so create an empty file. if (copyDataDown(zkClient, zkPath, file.toFile()) == 0) { - Files.createDirectories(file); + Files.createFile(file); } } else { Files.createDirectories(file); // Make parent dir. From ee696169574f7cde3464650855403359fe0764ca Mon Sep 17 00:00:00 2001 From: Joel Bernstein Date: Sun, 6 Aug 2017 13:51:26 -0400 Subject: [PATCH 2/7] SOLR-11203-Simple regression output should include R-square --- .../apache/solr/client/solrj/io/eval/RegressionEvaluator.java | 1 + .../solr/client/solrj/io/stream/StreamExpressionTest.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RegressionEvaluator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RegressionEvaluator.java index 263a69aa0bd..f61c409d2eb 100644 --- a/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RegressionEvaluator.java +++ b/solr/solrj/src/java/org/apache/solr/client/solrj/io/eval/RegressionEvaluator.java @@ -72,6 +72,7 @@ public class RegressionEvaluator extends ComplexEvaluator implements Expressible map.put("intercept", regression.getIntercept()); map.put("R", regression.getR()); map.put("N", regression.getN()); + map.put("RSquare", regression.getRSquare()); map.put("regressionSumSquares", regression.getRegressionSumSquares()); map.put("slopeConfidenceInterval", regression.getSlopeConfidenceInterval()); map.put("interceptStdErr", regression.getInterceptStdErr()); diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java index 94f4106439a..699a5629d1d 100644 --- a/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java +++ b/solr/solrj/src/test/org/apache/solr/client/solrj/io/stream/StreamExpressionTest.java @@ -6287,8 +6287,10 @@ public class StreamExpressionTest extends SolrCloudTestCase { Map regression = (Map)tuple.get("regress"); double slope = (double)regression.get("slope"); double intercept= (double) regression.get("intercept"); + double rSquare= (double) regression.get("RSquare"); assertTrue(slope == 2.0D); assertTrue(intercept == 0.0D); + assertTrue(rSquare == 1.0D); double prediction = tuple.getDouble("p"); assertTrue(prediction == 600.0D); } From 383b3eac655fc0f8fcc59efadeece1940e8fddb3 Mon Sep 17 00:00:00 2001 From: Kevin Risden Date: Wed, 28 Jun 2017 21:26:35 -0500 Subject: [PATCH 3/7] Upgrade to Calcite 0.13.0 and Calcite Avatica 0.10.0 --- lucene/ivy-versions.properties | 5 +- solr/core/ivy.xml | 2 + .../apache/solr/handler/TestSQLHandler.java | 4 - solr/licenses/avatica-core-1.10.0.jar.sha1 | 1 + solr/licenses/avatica-core-1.9.0.jar.sha1 | 1 - solr/licenses/calcite-core-1.11.0.jar.sha1 | 1 - solr/licenses/calcite-core-1.13.0.jar.sha1 | 1 + solr/licenses/calcite-linq4j-1.11.0.jar.sha1 | 1 - solr/licenses/calcite-linq4j-1.13.0.jar.sha1 | 1 + solr/licenses/commons-lang3-3.6.jar.sha1 | 1 + solr/licenses/commons-lang3-LICENSE-ASL.txt | 202 ++++++++++++++++++ solr/licenses/commons-lang3-NOTICE.txt | 8 + 12 files changed, 219 insertions(+), 9 deletions(-) create mode 100644 solr/licenses/avatica-core-1.10.0.jar.sha1 delete mode 100644 solr/licenses/avatica-core-1.9.0.jar.sha1 delete mode 100644 solr/licenses/calcite-core-1.11.0.jar.sha1 create mode 100644 solr/licenses/calcite-core-1.13.0.jar.sha1 delete mode 100644 solr/licenses/calcite-linq4j-1.11.0.jar.sha1 create mode 100644 solr/licenses/calcite-linq4j-1.13.0.jar.sha1 create mode 100644 solr/licenses/commons-lang3-3.6.jar.sha1 create mode 100644 solr/licenses/commons-lang3-LICENSE-ASL.txt create mode 100644 solr/licenses/commons-lang3-NOTICE.txt diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties index b5e5f11f9f2..e1a432ba643 100644 --- a/lucene/ivy-versions.properties +++ b/lucene/ivy-versions.properties @@ -84,15 +84,16 @@ io.netty.netty-all.version = 4.0.36.Final /org.apache.ant/ant = 1.8.2 -org.apache.calcite.avatica.version = 1.9.0 +org.apache.calcite.avatica.version = 1.10.0 /org.apache.calcite.avatica/avatica-core = ${org.apache.calcite.avatica.version} -org.apache.calcite.version = 1.11.0 +org.apache.calcite.version = 1.13.0 /org.apache.calcite/calcite-core = ${org.apache.calcite.version} /org.apache.calcite/calcite-linq4j = ${org.apache.calcite.version} /org.apache.commons/commons-compress = 1.11 /org.apache.commons/commons-exec = 1.3 +/org.apache.commons/commons-lang3 = 3.6 /org.apache.commons/commons-math3 = 3.4.1 org.apache.curator.version = 2.8.0 diff --git a/solr/core/ivy.xml b/solr/core/ivy.xml index a91d73a7bfd..5f4f84f77d8 100644 --- a/solr/core/ivy.xml +++ b/solr/core/ivy.xml @@ -85,6 +85,7 @@ + @@ -143,6 +144,7 @@ + diff --git a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java index 545a41a9843..1999965f339 100644 --- a/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java +++ b/solr/core/src/test/org/apache/solr/handler/TestSQLHandler.java @@ -22,7 +22,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrRequest; @@ -79,9 +78,6 @@ public class TestSQLHandler extends AbstractFullDistribZkTestBase { @Test public void doTest() throws Exception { - - assumeFalse("This test fails on UNIX with Turkish default locale", new Locale("tr").getLanguage().equals(Locale.getDefault().getLanguage())); - waitForRecoveriesToFinish(false); testBasicSelect(); diff --git a/solr/licenses/avatica-core-1.10.0.jar.sha1 b/solr/licenses/avatica-core-1.10.0.jar.sha1 new file mode 100644 index 00000000000..8126860eb04 --- /dev/null +++ b/solr/licenses/avatica-core-1.10.0.jar.sha1 @@ -0,0 +1 @@ +82280b09d490c7e4981b5af2d79fcf55efbe6144 diff --git a/solr/licenses/avatica-core-1.9.0.jar.sha1 b/solr/licenses/avatica-core-1.9.0.jar.sha1 deleted file mode 100644 index b44a6158cf7..00000000000 --- a/solr/licenses/avatica-core-1.9.0.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -c16b346eef02495f2f4b429fe04c33e526ec0229 diff --git a/solr/licenses/calcite-core-1.11.0.jar.sha1 b/solr/licenses/calcite-core-1.11.0.jar.sha1 deleted file mode 100644 index 980c772c62d..00000000000 --- a/solr/licenses/calcite-core-1.11.0.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -d0f90841119f1ec02a64ef029ff525171a320cff diff --git a/solr/licenses/calcite-core-1.13.0.jar.sha1 b/solr/licenses/calcite-core-1.13.0.jar.sha1 new file mode 100644 index 00000000000..7c40c4d1368 --- /dev/null +++ b/solr/licenses/calcite-core-1.13.0.jar.sha1 @@ -0,0 +1 @@ +1e7995aa0afe4c27a12e7b320a2938dcf05d9581 diff --git a/solr/licenses/calcite-linq4j-1.11.0.jar.sha1 b/solr/licenses/calcite-linq4j-1.11.0.jar.sha1 deleted file mode 100644 index 98396328447..00000000000 --- a/solr/licenses/calcite-linq4j-1.11.0.jar.sha1 +++ /dev/null @@ -1 +0,0 @@ -b09e988f64c69c21cc61aa734e9955736a07e016 diff --git a/solr/licenses/calcite-linq4j-1.13.0.jar.sha1 b/solr/licenses/calcite-linq4j-1.13.0.jar.sha1 new file mode 100644 index 00000000000..cc9da3cb729 --- /dev/null +++ b/solr/licenses/calcite-linq4j-1.13.0.jar.sha1 @@ -0,0 +1 @@ +96c814d27516cf48d439277300252bfb2b00486f diff --git a/solr/licenses/commons-lang3-3.6.jar.sha1 b/solr/licenses/commons-lang3-3.6.jar.sha1 new file mode 100644 index 00000000000..da647172a46 --- /dev/null +++ b/solr/licenses/commons-lang3-3.6.jar.sha1 @@ -0,0 +1 @@ +9d28a6b23650e8a7e9063c04588ace6cf7012c17 diff --git a/solr/licenses/commons-lang3-LICENSE-ASL.txt b/solr/licenses/commons-lang3-LICENSE-ASL.txt new file mode 100644 index 00000000000..d6456956733 --- /dev/null +++ b/solr/licenses/commons-lang3-LICENSE-ASL.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/solr/licenses/commons-lang3-NOTICE.txt b/solr/licenses/commons-lang3-NOTICE.txt new file mode 100644 index 00000000000..6a77d8601e9 --- /dev/null +++ b/solr/licenses/commons-lang3-NOTICE.txt @@ -0,0 +1,8 @@ +Apache Commons Lang +Copyright 2001-2017 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +This product includes software from the Spring Framework, +under the Apache License 2.0 (see: StringUtils.containsWhitespace()) From 44de7b23062ae63565f8abd13cdf04270dd3290f Mon Sep 17 00:00:00 2001 From: Kevin Risden Date: Sun, 6 Aug 2017 13:17:01 -0500 Subject: [PATCH 4/7] SOLR-10353: TestSQLHandler reproducible failure: No match found for function signature min() changes entry --- solr/CHANGES.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index f6c04244887..85d78023962 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -426,6 +426,8 @@ Bug Fixes * SOLR-11182: A split shard failure on IOException should be logged (Varun Thacker) +* SOLR-10353: TestSQLHandler reproducible failure: No match found for function signature min() (Kevin Risden) + Optimizations ---------------------- From e053e2298fb2a6c67e3ccc244413b98648c249cb Mon Sep 17 00:00:00 2001 From: Erick Erickson Date: Sun, 6 Aug 2017 18:21:48 -0700 Subject: [PATCH 5/7] SOLR-11198: downconfig downloads empty file as folder, test failures possible fix and logging --- .../apache/solr/cloud/SolrCLIZkUtilsTest.java | 18 ++++++++++++++---- .../solr/common/cloud/ZkMaintenanceUtils.java | 5 +++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java index 579e93d7493..9152ce43f89 100644 --- a/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java +++ b/solr/core/src/test/org/apache/solr/cloud/SolrCLIZkUtilsTest.java @@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; +import java.lang.invoke.MethodHandles; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.FileVisitResult; @@ -40,9 +41,13 @@ import org.apache.zookeeper.data.Stat; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class SolrCLIZkUtilsTest extends SolrCloudTestCase { + private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + @BeforeClass public static void setupCluster() throws Exception { configureCluster(1) @@ -401,7 +406,7 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase { args = new String[]{ "-src", "file:" + emptyFile.toAbsolutePath().toString(), - "-dst", "zk:/cp7/conf/stopwords/emptyFile", + "-dst", "zk:/cp7/conf/stopwords/emptyfile", "-recurse", "false", "-zkHost", zkAddr, }; @@ -410,9 +415,9 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase { assertEquals("Copy should have succeeded.", 0, res); Path tmp2 = createTempDir("cp9"); - Path emptyDest = Paths.get(tmp2.toAbsolutePath().toString(), "emptyFile"); + Path emptyDest = Paths.get(tmp2.toAbsolutePath().toString(), "emptyfile"); args = new String[]{ - "-src", "zk:/cp7/conf/stopwords/emptyFile", + "-src", "zk:/cp7/conf/stopwords/emptyfile", "-dst", "file:" + emptyDest.toAbsolutePath().toString(), "-recurse", "false", "-zkHost", zkAddr, @@ -445,7 +450,12 @@ public class SolrCLIZkUtilsTest extends SolrCloudTestCase { res = cpTool.runTool(SolrCLI.processCommandLineArgs(SolrCLI.joinCommonAndToolOptions(cpTool.getOptions()), args)); assertEquals("Copy should have succeeded.", 0, res); - Path locEmpty = Paths.get(tmp2.toAbsolutePath().toString(), "stopwords", "emptyFile"); + Path locEmpty = Paths.get(tmp2.toAbsolutePath().toString(), "stopwords", "emptyfile"); + log.info("EOE Checking file at (var1) " + locEmpty.toAbsolutePath().toString()); // TODO: remove me EOE + log.info("EOE Checking file at (var2) " + locEmpty.toFile().getAbsolutePath()); // TODO: remove me EOE + log.info("EOE Checking file exists: " + Boolean.toString(locEmpty.toFile().exists())); + log.info("EOE Checking isFile: " + Boolean.toString(locEmpty.toFile().isFile())); + log.info("EOE Checking isDirectory: " + Boolean.toString(locEmpty.toFile().isDirectory())); //TODO: remove me EOE to here. assertTrue("Empty files should NOT be copied down as directories", locEmpty.toFile().isFile()); } diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java index 6843480ab8f..28c37fa8943 100644 --- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java +++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java @@ -314,7 +314,12 @@ public class ZkMaintenanceUtils { // If we didn't copy data down, then we also didn't create the file. But we still need a marker on the local // disk so create an empty file. if (copyDataDown(zkClient, zkPath, file.toFile()) == 0) { + log.info("EOE Creating file at (var 1)" + file.toAbsolutePath().toString()); // TODO remove me EOE + log.info("EOE Creating file at (var2) " + file.toFile().getAbsolutePath()); // TODO remove me EOE Files.createFile(file); + log.info("EOE Creating file exists: " + Boolean.toString(file.toFile().exists())); + log.info("EOE Creating isFile: " + Boolean.toString(file.toFile().isFile())); + log.info("EOE Creating isDirectory: " + Boolean.toString(file.toFile().isDirectory())); //TODO: remove me EOE to here. } } else { Files.createDirectories(file); // Make parent dir. From 5f30765331fe05a8394266081f041a1831e7adf1 Mon Sep 17 00:00:00 2001 From: Steve Rowe Date: Mon, 7 Aug 2017 00:59:46 -0400 Subject: [PATCH 6/7] SOLR-10796: TestPointFields.testDoublePointFieldRangeFacet(): Guard against converting a double-valued '-Infinity' to BigDecimal (fix location #2) --- solr/core/src/test/org/apache/solr/schema/TestPointFields.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solr/core/src/test/org/apache/solr/schema/TestPointFields.java b/solr/core/src/test/org/apache/solr/schema/TestPointFields.java index 5a89e7829c3..5d2adb4b289 100644 --- a/solr/core/src/test/org/apache/solr/schema/TestPointFields.java +++ b/solr/core/src/test/org/apache/solr/schema/TestPointFields.java @@ -746,7 +746,7 @@ public class TestPointFields extends SolrTestCaseJ4 { max = sortedValues.get(sortedValues.size() - 1).val; buffer = BigDecimal.valueOf(max).subtract(BigDecimal.valueOf(min)) .divide(BigDecimal.valueOf(numValues / 2), RoundingMode.HALF_UP).doubleValue(); - gap = BigDecimal.valueOf(max + buffer).subtract(BigDecimal.valueOf(min - buffer)) + gap = BigDecimal.valueOf(max).subtract(BigDecimal.valueOf(min)).add(BigDecimal.valueOf(buffer * 2.0D)) .divide(BigDecimal.valueOf(numBuckets), RoundingMode.HALF_UP).doubleValue(); } while (max >= Double.MAX_VALUE - buffer || min <= -Double.MAX_VALUE + buffer); // System.err.println("min: " + min + " max: " + max + " gap: " + gap + " buffer: " + buffer); From 6b3ea4d0c24adad9a270e43a3b5e07aac8317bee Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Mon, 7 Aug 2017 09:12:31 +0200 Subject: [PATCH 7/7] LUCENE-7914: AnalyzingSuggesterTest#testRandomRealisticKeys: trim big titles to make sure that they can pass the max recursion level in Operations#topsortState. --- .../search/suggest/analyzing/AnalyzingSuggesterTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java b/lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java index 06d44b9a8bf..67ff056eb58 100644 --- a/lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java +++ b/lucene/suggest/src/test/org/apache/lucene/search/suggest/analyzing/AnalyzingSuggesterTest.java @@ -176,9 +176,11 @@ public class AnalyzingSuggesterTest extends LuceneTestCase { Document nextDoc = lineFile.nextDoc(); String title = nextDoc.getField("title").stringValue(); int randomWeight = random().nextInt(100); - keys.add(new Input(title, randomWeight)); - if (!mapping.containsKey(title) || mapping.get(title) < randomWeight) { - mapping.put(title, Long.valueOf(randomWeight)); + int maxLen = Math.min(title.length(), 500); + String prefix = title.substring(0, maxLen); + keys.add(new Input(prefix, randomWeight)); + if (!mapping.containsKey(prefix) || mapping.get(prefix) < randomWeight) { + mapping.put(prefix, Long.valueOf(randomWeight)); } } Analyzer indexAnalyzer = new MockAnalyzer(random());