opensearch-project / OpenSearch

🔎 Open source distributed and RESTful search engine.
https://opensearch.org/docs/latest/opensearch/index/
Apache License 2.0
9.78k stars 1.82k forks source link

Replace "master" terminology in Java APIs #1684

Open tlfeng opened 2 years ago

tlfeng commented 2 years ago

Is your feature request related to a problem? Please describe. Replace the "master" terminology in all Java APIs, including field, method, class, and package names. The "Java APIs" refers to those packaged in Java libraries and are published to Maven (https://search.maven.org/search?q=g:org.opensearch https://mvnrepository.com/artifact/org.opensearch)

Impact: All plugins, clients and tools that use OpenSearch Java APIs from OpenSearch Java libraries which contain non-inclusive terminologies have to make corresponding changes to call new APIs, if they want to upgrade the dependency to a future major version of OpenSearch.

A part of #472

Describe the solution you'd like Replace the "master" terminology with "ClusterManager" in all Java APIs that are exposed in Java libraries.

Overall solution: https://github.com/opensearch-project/OpenSearch/issues/1684#issuecomment-1145541374 Sub-issue:

Describe alternatives you've considered None.

Additional context Locations of "master" in API of Java library: These libraries have been published to Maven. (Links: https://mvnrepository.com/artifact/org.opensearch https://search.maven.org/search?q=g:org.opensearch)

server 1 package org.opensearch.action.support.master https://opensearch.org/javadocs/1.1.0/OpenSearch/server/build/docs/javadoc/org/opensearch/action/support/master/package-summary.html (totally 1 package, the package contains 15 Java classes) 2 class org.opensearch.cluster.MasterNodeChangePredicate https://opensearch.org/javadocs/2.0.0/OpenSearch/server/build/docs/javadoc/org/opensearch/cluster/MasterNodeChangePredicate.html (totally 14 classes) 3 variable org.opensearch.action.support.master.MasterNodeRequest.DEFAULT_MASTER_NODE_TIMEOUT https://opensearch.org/javadocs/1.1.0/OpenSearch/server/build/docs/javadoc/org/opensearch/action/support/master/MasterNodeRequest.html#DEFAULT_MASTER_NODE_TIMEOUT (totally 15 variables) 4 method org.opensearch.cluster.node.DiscoveryNodes.Builder.masterNodeId(String) https://opensearch.org/javadocs/2.0.0/OpenSearch/server/build/docs/javadoc/org/opensearch/cluster/node/DiscoveryNodes.Builder.html#masterNodeId(java.lang.String) ... (In version 1.1.0, totally 177 methods) (In version 2.0.0, totally 142 methods)

Java Low Level REST Client 1 variable org.opensearch.client.NodeSelector.SKIP_DEDICATED_MASTERS https://opensearch.org/javadocs/1.1.0/OpenSearch/client/rest/build/docs/javadoc/org/opensearch/client/NodeSelector.html#SKIP_DEDICATED_MASTERS (totally 1 variable) 2 method org.opensearch.client.Node.Roles.isMasterEligible() https://opensearch.org/javadocs/1.1.0/OpenSearch/client/rest/build/docs/javadoc/org/opensearch/client/Node.Roles.html#isMasterEligible() (totally 1 method)

Java High Level REST Client 1 variable org.opensearch.client.TimedRequest.DEFAULT_MASTER_NODE_TIMEOUT https://opensearch.org/javadocs/1.1.0/OpenSearch/client/rest-high-level/build/docs/javadoc/org/opensearch/client/TimedRequest.html#DEFAULT_MASTER_NODE_TIMEOUT (totally 1 variable) 2 method org.opensearch.client.TimedRequest.masterNodeTimeout() https://opensearch.org/javadocs/2.0.0/OpenSearch/client/rest-high-level/build/docs/javadoc/org/opensearch/client/TimedRequest.html#masterNodeTimeout() (totally 11 methods)

Test Framework 1 class org.opensearch.test.disruption.BlockMasterServiceOnMaster https://opensearch.org/javadocs/2.0.0/OpenSearch/test/framework/build/docs/javadoc/org/opensearch/test/disruption/BlockMasterServiceOnMaster.html (totally 3 classes) 2 variable org.opensearch.test.InternalTestCluster.DEFAULT_HIGH_NUM_MASTER_NODES https://opensearch.org/javadocs/2.0.0/OpenSearch/test/framework/build/docs/javadoc/org/opensearch/test/InternalTestCluster.html#DEFAULT_HIGH_NUM_MASTER_NODES (totally 4 variables) 3 method org.opensearch.client.Client.masterClient() https://opensearch.org/javadocs/2.0.0/OpenSearch/test/framework/build/docs/javadoc/org/opensearch/test/InternalTestCluster.html#masterClient() (totally 41 methods)

tlfeng commented 2 years ago

The plan to resolve the issue:

Result:

Implementation: On main branch, and for each public and protected class/method/variable which contains "master" terminology,

  1. Copy the codes of definition.
  2. Replace "master" word with "cluster manager" in its name. This is done by the Rename refactoring feature of IntelliJ IDEA, so that both the definition and reference can be renamed.
  3. Paste the original codes of the definition aside.
  4. Add @Deprecated annotation and @deprecated tag in Javadoc
  5. Remove all the existing implementation in the old class or method, to keep the old usage for the deprecated classes and methods while only maintain the new renamed classes and methods. For class, make the old class extends the new renamed class. For package, apply the class change to all classes in the package. For method, call the new renamed method in the old method.
  6. If the renamed class has unit test, copy the unit test to test the deprecated class.
  7. Backport all the changes to 2.x branch.
  8. Remove all the deprecated class/method/variable.

Note:

  1. No new test will be added.
  2. The deprecation and renaming should be done in the order of "package -> class -> method and variable", so that the new package or class will have no deprecated class or method, which makes the code clean.
  3. The class/method/variable that used for maintaining the compatibility of "master" usage in REST APIs and settings will not be deprecated or renamed.
  4. The deprecation notice in the code will be added from the next minor version (2.1), and the deprecated items will be removed in next major version (3.0).

Appendix The regex to filter the lines of code with public Java API contains "master" terminology: class: (public|protected)(.)+(class|interface)\s(\w)*Master method: (public|protected)(.)+[Mm]aster(\w)*\( variable: (public|protected)(.)+(MASTER|master)(.)*=

Renaming rule: