TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

TIdy cross DC code. The application and the solr module. - #4744

Merged
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code
Aug 28, 2026
Merged

TIdy cross DC code. The application and the solr module.#4744
epugh merged 4 commits into
apache:mainfrom
epugh:review_cross-dc-manager_code

Conversation

@epugh

Copy link
Copy Markdown
Contributor

Description

Go through code CrossDC code (both source and tests) and tidy up code.

Solution

Leverage Intellij warnings. Seperate from #4743 as I wanted to do the solr module and the application code together.

I may after this tackle the Kafka 4 upgrade for either solr 11 or solr 11 and 10 depending on feedback from folks who built this codebase.

@epugh
epugh requested review from sigram and a balanced review from CopilotAugust 17, 2026 15:48

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 26 changed files in this pull request and generated no new comments.

Suppressed comments (1)

solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/messageprocessor/TestMessageProcessor.java:73

  • openMocks returns an AutoCloseable Mockito session, but this return value is discarded, leaving one session open per test. The previous initMocks call closed that session immediately; preserve that behavior here (or retain it in a field and close it from @After) to avoid leaking mock-maker state.
 MockitoAnnotations.openMocks(this);

@jaykay12jaykay12 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks @epugh for the tidy up part.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] is this some deprecated function which earlier was being used?

its unused for now, that's why intelliJ flagged it but is it not useful anytime in future as well?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.


private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

static final String VERSION_FIELD = "_version_";

@jaykay12jaykay12Aug 21, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these specific cleanups, i was also doing in this PR: #4610

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just merged into this PR the changes from 4610! Thanks for calling it out.

return required;
}

public String getDefaultValue() {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this getter may get used in future?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My sense on that is YAGNI: You Ain't Going to Need It. If it was valuable, there would be tests around it...

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a setter for a private field. may be useful in future.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Likewise the YAGNI argument...

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

Comment on lines +263 to +272
sb.append(", method=").append(solrRequest.getMethod());
sb.append(", params=").append(solrRequest.getParams());
if (solrRequest instanceof UpdateRequest req) {
sb.append(", add=" + (req.getDocuments() != null ? req.getDocuments().size() : "0"));
sb.append(", del=" + (req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0"));
sb.append(", dbq=" + (req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0"));
sb.append(", add=").append(req.getDocuments() != null ? req.getDocuments().size() : "0");
sb.append(", del=")
.append(req.getDeleteByIdMap() != null ? req.getDeleteByIdMap().size() : "0");
sb.append(", dbq=").append(req.getDeleteQuery() != null ? req.getDeleteQuery().size() : "0");
}
sb.append(", attempt=" + attempt);
sb.append(", submitTimeNanos=" + submitTimeNanos);
sb.append(", attempt=").append(attempt);
sb.append(", submitTimeNanos=").append(submitTimeNanos);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

neat. 👍🏽

package org.apache.solr.crossdc.update.processor;

/** Wrapper class for Mirroring exceptions. */
public class MirroringException extends Exception {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[for-my-knowledge] why would this custom exception be created if this is not being used in the codebase?

any other usage outside this codebase possible for this, since it lies in cross-dc-manager module?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really don't know... Or it got created and never go used.. @sigram can you weigh in on this?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, it is used in a few places... it's thrown by KafkaRequestMirroringHandler.mirror(request) and KafkaMirroringSink methods, although the callers catch it and convert either to SolrException or an error result.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well thats odd... How the heck did I remove it as not used and/or have the tests pass??? Are KafkaRequestMirroringHandler and KafkaMirroringSink non Solr code?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regardless, happy to put it back... @sigram any other suggestions/preferences you have, please do speak up, you know this code much better than I!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, there is a copy of MirroringException in solr/modules/cross-dc/src/java/org/apache/solr/crossdc/common/MirroringException.... Does that explain why this other one could be removed?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, yes .. The one in common should stay. This happened probably during the initial import when packages were restructured.

mirroringHandler = new KafkaRequestMirroringHandler(sink);
}

private static Integer getIntegerPropValue(String name, Properties props) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Q] this may be useful in future right?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

YAGNI ;-)

verify(requestMirroringHandler, times(1)).mirror(updateRequest);
assertEquals("missing dbq", 1, updateRequest.getDeleteQuery().size());
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().get(0));
assertEquals("dbq value", "id:test*", updateRequest.getDeleteQuery().getFirst());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are other IntelliJ suggestions as well for this class, like this one?

Image

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so I stayed away from that whole "can be final" and "can be local", mostly because I don't have the confidence of my convications that it IS the right change. It probably is, IntelliJ knows more than I do about Java syntax and keywords ;-). I was really focused on what I thought were the simplest cleanups cause I didn't want to create some weird lowlevel bug or race condition by changing attribute defintions.

Having said that, dealing with "field can be convert to a local variable" is prbably something that SHOULD be done in a seperate PR.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

understood, fair point @epugh

@epugh

Copy link
Copy Markdown
ContributorAuthor

I will leave this open for another day, and probably commit it on Monday Sept 1st.

*
* @param mirroredSolrRequest MirroredSolrRequest object that is being processed.
*/
void preventCircularMirroring(MirroredSolrRequest<?> mirroredSolrRequest) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is currently handled individually in MirroringUpdateRequestProcessorFactory and in MirroringCollectionsHandler, but in both cases the code is much simpler than this method ... so I think we can drop it for now.

Comment on lines -230 to -233
public void setSubmitTimeNanos(final long submitTimeNanos) {
this.submitTimeNanos = submitTimeNanos;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can delete this, this should not be mutable anyway. BTW, the time tracking is broken anyway (nanos cannot be compared across wire) and needs to be fixed, I'll file a separate Jira.

@epugh

Copy link
Copy Markdown
ContributorAuthor

Thanks for the review @sigram ... Don't hesitaste to ping me and @jaykay12 on yoru upcoming crossdc PR's!

@epugh
epugh merged commit ae262ba into apache:mainAug 28, 2026
4 of 5 checks passed
@epughepugh added this to the 10.x milestone Aug 28, 2026
dsmiley pushed a commit that referenced this pull request Aug 29, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@epugh@sigram@jaykay12