rahulgoswami commented on code in PR #4279:
URL: https://github.com/apache/solr/pull/4279#discussion_r3142995900
##########
solr/core/src/test/org/apache/solr/handler/admin/UpgradeCoreIndexActionTest.java:
##########
@@ -365,13 +365,108 @@ public void
testUpgradeCoreIndexFailsWithNestedDocuments() throws Exception {
coreName),
resp));
- // Verify the exception message indicates nested documents are not
supported
+ // Verify the exception message indicates child documents are not
supported
assertThat(
thrown.getMessage(),
- containsString("does not support indexes containing nested
documents"));
+ containsString("does not support indexes containing child/nested
documents"));
} finally {
admin.shutdown();
admin.close();
}
}
+
+ @Test
+ public void testChildDocsDetection_noChildDocs() throws Exception {
+ addDocsWithRandomUpdatesAndDeletes();
+
+ final String coreName = h.getCore().getName();
+ CoreAdminHandler admin = new CoreAdminHandler(h.getCoreContainer());
+ try {
+ final SolrQueryResponse resp = new SolrQueryResponse();
+ admin.handleRequestBody(
+ req(
+ CoreAdminParams.ACTION,
+ CoreAdminParams.CoreAdminAction.UPGRADECOREINDEX.toString(),
+ CoreAdminParams.CORE,
+ coreName),
+ resp);
+ assertNull("Unexpected exception: " + resp.getException(),
resp.getException());
+ } finally {
+ admin.shutdown();
+ admin.close();
+ }
+ }
+
+ @Test
+ public void testChildDocsDetection_withChildDocs() throws Exception {
+ addChildDoc("100", "101");
+ addDocsWithRandomUpdatesAndDeletes();
+
+ final String coreName = h.getCore().getName();
+ CoreAdminHandler admin = new CoreAdminHandler(h.getCoreContainer());
+ try {
+ final SolrQueryResponse resp = new SolrQueryResponse();
+ SolrException thrown =
+ assertThrows(
+ SolrException.class,
+ () ->
+ admin.handleRequestBody(
+ req(
+ CoreAdminParams.ACTION,
+
CoreAdminParams.CoreAdminAction.UPGRADECOREINDEX.toString(),
+ CoreAdminParams.CORE,
+ coreName),
+ resp));
+ assertThat(
+ thrown.getMessage(),
+ containsString("does not support indexes containing child/nested
documents"));
+ } finally {
+ admin.shutdown();
+ admin.close();
+ }
+ }
+
+ /**
+ * Add non-child docs with a random number of within-commit updates and
deletes. This exercises
+ * the false-positive scenario for child doc detection: updates and deletes
leave behind deleted
+ * entries in the same segment, causing multiple docs to share the same
{@code _root_} value.
+ *
+ * <p>With NoMergePolicy and a 100MB RAM buffer (from SolrIndexConfig
defaults), no flush or merge
+ * occurs mid-batch, guaranteeing co-location in a single segment.
+ */
+ private void addDocsWithRandomUpdatesAndDeletes() {
+ int numDocs = 10;
+ for (int i = 0; i < numDocs; i++) {
+ assertU(adoc("id", String.valueOf(i), "title", "doc" + i));
+ }
+ int numUpdates = random().nextInt(4);
+ for (int i = 0; i < numUpdates; i++) {
+ assertU(adoc("id", String.valueOf(i), "title", "updated_doc" + i));
+ }
+ int numDeletes = random().nextInt(4);
+ for (int i = 0; i < numDeletes; i++) {
+ assertU(delI(String.valueOf(numDocs - 1 - i)));
Review Comment:
I like that you took care to not overstep on the updates and have the delete
chunk as a separate set of ids.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]