Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bump version to 2.4.0 #5326

Merged
merged 2 commits into from
Feb 7, 2025
Merged

Conversation

nobodyiam
Copy link
Member

@nobodyiam nobodyiam commented Jan 30, 2025

What's the purpose of this PR

  1. bump version to 2.4.0
  2. some misc changes

Follow this checklist to help us incorporate your contribution quickly and easily:

  • Read the Contributing Guide before making this pull request.
  • Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
  • Write necessary unit tests to verify the code.
  • Run mvn clean test to make sure this pull request doesn't break anything.
  • Update the CHANGES log.

Summary by CodeRabbit

Release Notes v2.4.0

  • Documentation

    • Updated Java SDK user guide with new version requirements.
    • Increased minimum Java version from 1.7 to 1.8.
    • Updated Guava library version requirements from 20.0+ to 22.0+.
    • Enhanced clarity regarding configuration settings for Apollo Meta Server and local cache paths.
    • Corrected image references in the Apollo user guide for permissions management.
  • Version Update

    • Transitioned project from snapshot to stable release version 2.4.0.
    • Updated Apollo Java client version to 2.4.0.
  • Compatibility

    • For Java 1.7 users, recommended to use Apollo client version 1.9.1.
  • Enhancements

    • Improved URL management for configuration export and import operations.
    • Updated URL construction in the import namespace functionality to utilize dynamic path prefixes.

@dosubot dosubot bot added the size:S This PR changes 10-29 lines, ignoring generated files. label Jan 30, 2025
@nobodyiam nobodyiam added this to the 2.4.0 milestone Jan 30, 2025
Copy link
Contributor

coderabbitai bot commented Jan 30, 2025

Walkthrough

This pull request updates the Java SDK user guide documentation and project configuration files. Key modifications include updating the Java version requirement from 1.7 to 1.8, increasing the Guava library version from 20.0+ to 22.0+, and transitioning project properties in pom.xml from snapshot to stable release versions. The documentation in both English and Chinese has been enhanced to clarify configuration instructions, library dependencies, and provide more precise guidance for users of the Apollo client.

Changes

File Change Summary
docs/en/client/java-sdk-user-guide.md - Updated Java version requirement from 1.7 to 1.8+
- Updated Guava library version from 20.0+ to 22.0+
- Updated default Guava reference from version 29 to 32
- Added introductory note clarifying document audience
docs/zh/client/java-sdk-user-guide.md - Updated Guava library version requirements
- Added clarification note about document intended audience
pom.xml - Changed <revision> from 2.4.0-SNAPSHOT to 2.4.0
- Updated <apollo-java.version> from 2.4.0-SNAPSHOT to 2.4.0
docs/en/portal/apollo-user-guide.md - Updated image reference for permissions configuration
docs/zh/portal/apollo-user-guide.md - Updated image reference for permissions management
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolder.java - Added reversedGrayReleaseRuleLabelCache for client label-based rules
- Updated hasGrayReleaseRule method to include client label
- Modified addCache and removeCache methods for new label cache
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/support/ApolloServiceRegistryProperties.java - Added ServletContext field for dynamic URI construction
apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigFileController.java - Updated queryConfig method to include clientLabel in gray release rule checks
apollo-portal/src/main/resources/static/scripts/controller/ConfigExportController.js - Updated export and import URLs to use dynamic path prefix
apollo-portal/src/main/resources/static/scripts/directive/import-namespace-modal-directive.js - Modified URL construction in doImportNamespace function to use dynamic path prefix

Possibly related PRs

  • bump version to 2.3.0 #5194: The changes in the main PR regarding updates to the pom.xml file for versioning are related to the changes in the retrieved PR, which also involves modifications to the pom.xml for version updates.
  • Add usage instructions for multiple appid in the Apollo client #5295: The changes in the main PR regarding updates to the java-sdk-user-guide.md document, specifically the version requirements and configuration settings, are related to the retrieved PR, which also updates the same document to include instructions for using multiple app IDs and namespaces.

Suggested labels

size:XS, lgtm

Poem

🐰 Hop, hop, through code so bright,
Versions bump with pure delight!
From snapshot to release we spring,
Apollo's guide now takes its wing.
Guava's version, clean and neat! 🚀

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
docs/zh/client/java-sdk-user-guide.md (1)

663-663: Fix markdown formatting issues

The markdown has some minor formatting issues:

  1. Unordered list indentation should be 2 spaces instead of 4
  2. The link fragment reference is invalid

Apply these changes to fix the formatting:

-    用户可以根据需求自定义接入Prometheus等监控系统,客户端提供了SPI,详见 [7.3 指标输出到自定义监控系统](#_73-指标输出到自定义监控系统)。
+  用户可以根据需求自定义接入Prometheus等监控系统,客户端提供了SPI,详见[7.3 指标输出到自定义监控系统](#73-指标输出到自定义监控系统)。
🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

663-663: Link fragments should be valid
null

(MD051, link-fragments)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ba197ed and b8eb3e3.

📒 Files selected for processing (3)
  • docs/en/client/java-sdk-user-guide.md (2 hunks)
  • docs/zh/client/java-sdk-user-guide.md (2 hunks)
  • pom.xml (1 hunks)
🧰 Additional context used
🪛 GitHub Actions: build
pom.xml

[error] Failed to resolve dependency: com.ctrip.framework.apollo:apollo-core:jar:2.4.0 not found in Maven Central repository

🪛 markdownlint-cli2 (0.17.2)
docs/zh/client/java-sdk-user-guide.md

10-10: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


663-663: Link fragments should be valid
null

(MD051, link-fragments)

docs/en/client/java-sdk-user-guide.md

689-689: Link fragments should be valid
null

(MD051, link-fragments)

🔇 Additional comments (3)
pom.xml (1)

63-63: LGTM: Version bump to 2.4.0

The version changes from SNAPSHOT to release version 2.4.0 are consistent with the PR objective.

Also applies to: 66-66

🧰 Tools
🪛 GitHub Actions: build

[error] Failed to resolve dependency: com.ctrip.framework.apollo:apollo-core:jar:2.4.0 not found in Maven Central repository

docs/zh/client/java-sdk-user-guide.md (1)

9-10: LGTM: Updated Guava version requirements

The documentation clearly states the new minimum required version (22.0+) and default version (32) for Guava.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

10-10: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

docs/en/client/java-sdk-user-guide.md (1)

689-689: LGTM! Documentation addition for custom monitoring systems integration.

The added line provides a helpful cross-reference to the detailed section about exporting metrics to custom monitoring systems, improving document navigation.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

689-689: Link fragments should be valid
null

(MD051, link-fragments)

pom.xml Show resolved Hide resolved
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:S This PR changes 10-29 lines, ignoring generated files. labels Jan 30, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Inline review comments failed to post. This is likely due to GitHub's limits when posting large numbers of comments.

Actionable comments posted: 2

🧹 Nitpick comments (1)
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolder.java (1)

163-181: LGTM! Robust implementation with proper null checks.

The implementation correctly handles both IP-based and label-based gray release rules with appropriate null checks. Consider extracting the label check logic into a private method for better readability.

 public boolean hasGrayReleaseRule(String clientAppId, String clientIp, String clientLabel,
     String namespaceName) {
   // check ip gray rule
   if (reversedGrayReleaseRuleCache.containsKey(assembleReversedGrayReleaseRuleKey(clientAppId,
       namespaceName, clientIp)) || reversedGrayReleaseRuleCache.containsKey
       (assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, GrayReleaseRuleItemDTO
           .ALL_IP))) {
     return true;
   }
-  // check label gray rule
-  if (!Strings.isNullOrEmpty(clientLabel) &&
-      (reversedGrayReleaseRuleLabelCache.containsKey(
-          assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, clientLabel)) ||
-          reversedGrayReleaseRuleLabelCache.containsKey(
-              assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName,
-                  GrayReleaseRuleItemDTO.ALL_Label)))) {
-    return true;
-  }
+  return hasLabelGrayReleaseRule(clientAppId, clientLabel, namespaceName);
   return false;
 }
+
+private boolean hasLabelGrayReleaseRule(String clientAppId, String clientLabel, String namespaceName) {
+  return !Strings.isNullOrEmpty(clientLabel) &&
+      (reversedGrayReleaseRuleLabelCache.containsKey(
+          assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, clientLabel)) ||
+          reversedGrayReleaseRuleLabelCache.containsKey(
+              assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName,
+                  GrayReleaseRuleItemDTO.ALL_Label)));
+}
🛑 Comments failed to post (2)
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/support/ApolloServiceRegistryProperties.java (2)

92-94: 🛠️ Refactor suggestion

Improve URI construction robustness.

The current URI construction has several potential issues:

  1. No null check for servletContext
  2. Possible double slashes if context path starts with "/"
  3. No validation of the constructed URI

Consider this more robust implementation:

-      String contextPath = Strings.isNullOrEmpty(this.servletContext.getContextPath()) ? "/"
-          : this.servletContext.getContextPath();
-      String uriString = "http://" + host + ":" + port + contextPath;
+      String contextPath = "/";
+      if (this.servletContext != null) {
+          String servletContextPath = this.servletContext.getContextPath();
+          if (!Strings.isNullOrEmpty(servletContextPath)) {
+              contextPath = servletContextPath.startsWith("/") ? servletContextPath : "/" + servletContextPath;
+          }
+      }
+      String uriString = String.format("http://%s:%d%s", host, port, contextPath);
+      try {
+          this.uri = new URI(uriString);
+      } catch (URISyntaxException e) {
+          throw new IllegalStateException("Failed to construct service URI: " + uriString, e);
+      }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

      String contextPath = "/";
      if (this.servletContext != null) {
          String servletContextPath = this.servletContext.getContextPath();
          if (!Strings.isNullOrEmpty(servletContextPath)) {
              contextPath = servletContextPath.startsWith("/") ? servletContextPath : "/" + servletContextPath;
          }
      }
      String uriString = String.format("http://%s:%d%s", host, port, contextPath);
      try {
          this.uri = new URI(uriString);
      } catch (URISyntaxException e) {
          throw new IllegalStateException("Failed to construct service URI: " + uriString, e);
      }

77-79: 💡 Codebase verification

ServletContext should be optional in non-web environments

The service registry component is designed to work in both web and non-web environments (evidenced by database-centric implementation and lack of web-specific conditions), but the current ServletContext autowiring could cause failures in non-web scenarios.

  • apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/support/ApolloServiceRegistryProperties.java: Make ServletContext optional and provide a fallback mechanism:
@Autowired(required = false)
private ServletContext servletContext;
🔗 Analysis chain

Consider handling non-web environments gracefully.

The @Autowired ServletContext creates a tight coupling to web environments. This could cause issues in:

  • Non-web application contexts
  • Unit testing scenarios
  • Standalone deployments

Consider making the ServletContext optional and providing a fallback:

-  @Autowired
-  private ServletContext servletContext;
+  @Autowired(required = false)
+  private ServletContext servletContext;
🏁 Scripts executed

The following scripts were executed for the analysis:

Error: No shell scripts found


Script:

#!/bin/bash
# Find ServletContext usage patterns
ast-grep --pattern 'servletContext.$$$'

# Find ServletContext related code
rg -l "ServletContext" --type java

# Look for test files related to ApolloServiceRegistryProperties
fd "ApolloServiceRegistryProperties.*Test.*\.java$"

# Check for configuration files that might have web/non-web setup
fd "application.*\.properties$|application.*\.yml$"

Length of output: 5365


Script:

#!/bin/bash
# Check ServletContext usage in both files
echo "=== ApolloServiceRegistryProperties.java ==="
rg -A 5 -B 5 "ServletContext" apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/support/ApolloServiceRegistryProperties.java

echo "=== PrefixPathController.java ==="
rg -A 5 -B 5 "ServletContext" apollo-portal/src/main/java/com/ctrip/framework/apollo/portal/controller/PrefixPathController.java

# Check if this is part of a web-only component
rg -l "ServiceRegistry" --type java

Length of output: 4036


Script:

#!/bin/bash
# Check auto-configuration and conditional setup
echo "=== Checking auto-configuration ==="
rg -A 10 "@Configuration|@ConditionalOn" apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/ApolloServiceRegistryAutoConfiguration.java

# Check if there's any conditional web environment check
echo "=== Checking web environment conditions ==="
rg -l "@ConditionalOnWebApplication" --type java

Length of output: 1731

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolder.java (2)

163-181: Consider extracting check logic into separate methods.

While the implementation is correct, the method could be more maintainable by extracting the IP and label checks into separate methods.

Consider this refactor:

-  public boolean hasGrayReleaseRule(String clientAppId, String clientIp, String clientLabel,
-      String namespaceName) {
-    // check ip gray rule
-    if (reversedGrayReleaseRuleCache.containsKey(assembleReversedGrayReleaseRuleKey(clientAppId,
-        namespaceName, clientIp)) || reversedGrayReleaseRuleCache.containsKey
-        (assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, GrayReleaseRuleItemDTO
-            .ALL_IP))) {
-      return true;
-    }
-    // check label gray rule
-    if (!Strings.isNullOrEmpty(clientLabel) &&
-        (reversedGrayReleaseRuleLabelCache.containsKey(
-            assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, clientLabel)) ||
-            reversedGrayReleaseRuleLabelCache.containsKey(
-                assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName,
-                    GrayReleaseRuleItemDTO.ALL_Label)))) {
-      return true;
-    }
-    return false;
+  public boolean hasGrayReleaseRule(String clientAppId, String clientIp, String clientLabel,
+      String namespaceName) {
+    return hasIpGrayReleaseRule(clientAppId, clientIp, namespaceName) ||
+           hasLabelGrayReleaseRule(clientAppId, clientLabel, namespaceName);
+  }
+
+  private boolean hasIpGrayReleaseRule(String clientAppId, String clientIp, String namespaceName) {
+    return reversedGrayReleaseRuleCache.containsKey(
+               assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, clientIp)) ||
+           reversedGrayReleaseRuleCache.containsKey(
+               assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName,
+                   GrayReleaseRuleItemDTO.ALL_IP));
+  }
+
+  private boolean hasLabelGrayReleaseRule(String clientAppId, String clientLabel, String namespaceName) {
+    if (Strings.isNullOrEmpty(clientLabel)) {
+      return false;
+    }
+    return reversedGrayReleaseRuleLabelCache.containsKey(
+               assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName, clientLabel)) ||
+           reversedGrayReleaseRuleLabelCache.containsKey(
+               assembleReversedGrayReleaseRuleKey(clientAppId, namespaceName,
+                   GrayReleaseRuleItemDTO.ALL_Label));
+  }

310-313: Consider introducing an abstraction for client identifiers.

While the parameter rename makes the dual purpose clear, consider introducing an abstraction to handle different types of client identifiers (IP, label) more elegantly.

Consider creating an enum or class to represent different types of client identifiers:

public enum ClientIdentifierType {
  IP, LABEL
}

public class ClientIdentifier {
  private final String value;
  private final ClientIdentifierType type;
  
  // Constructor and getters
}

Then update the method signature:

- private String assembleReversedGrayReleaseRuleKey(String clientAppId, String clientNamespaceName, String clientIpOrLabel)
+ private String assembleReversedGrayReleaseRuleKey(String clientAppId, String clientNamespaceName, ClientIdentifier identifier)
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f947161 and 9382e80.

⛔ Files ignored due to path filters (1)
  • doc/images/manage-cluster-entry.png is excluded by !**/*.png
📒 Files selected for processing (12)
  • apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolder.java (6 hunks)
  • apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/support/ApolloServiceRegistryProperties.java (3 hunks)
  • apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolderTest.java (2 hunks)
  • apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigFileController.java (2 hunks)
  • apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/ConfigFileControllerTest.java (2 hunks)
  • apollo-portal/src/main/resources/static/scripts/controller/ConfigExportController.js (2 hunks)
  • apollo-portal/src/main/resources/static/scripts/directive/import-namespace-modal-directive.js (1 hunks)
  • docs/en/client/java-sdk-user-guide.md (2 hunks)
  • docs/en/portal/apollo-user-guide.md (1 hunks)
  • docs/zh/client/java-sdk-user-guide.md (2 hunks)
  • docs/zh/portal/apollo-user-guide.md (1 hunks)
  • pom.xml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (10)
  • apollo-portal/src/main/resources/static/scripts/directive/import-namespace-modal-directive.js
  • apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/registry/configuration/support/ApolloServiceRegistryProperties.java
  • apollo-configservice/src/test/java/com/ctrip/framework/apollo/configservice/controller/ConfigFileControllerTest.java
  • apollo-biz/src/test/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolderTest.java
  • pom.xml
  • apollo-configservice/src/main/java/com/ctrip/framework/apollo/configservice/controller/ConfigFileController.java
  • docs/zh/client/java-sdk-user-guide.md
  • docs/zh/portal/apollo-user-guide.md
  • apollo-portal/src/main/resources/static/scripts/controller/ConfigExportController.js
  • docs/en/portal/apollo-user-guide.md
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build (8)
🔇 Additional comments (5)
docs/en/client/java-sdk-user-guide.md (2)

11-12: Guava Version Update: Requirements and Default Reference Changed
The changes clearly update the Guava dependency details to “22.0+” and note that the Apollo client will now reference Guava 32 by default. These modifications provide clearer guidance on compatible versions and ensure that users are aware of the minimum version requirements.


689-689: Prometheus Integration Guidance via SPI
This new sentence explicitly informs users that customization for integrating with monitoring systems (such as Prometheus) is available via SPI. Consider mentioning that this feature is applicable for version 2.4.0 and above to maintain consistency with other sections. Overall, the clarification is beneficial.

apollo-biz/src/main/java/com/ctrip/framework/apollo/biz/grayReleaseRule/GrayReleaseRulesHolder.java (3)

71-72: LGTM! Well-structured cache addition.

The new cache field follows existing patterns and is well-documented.


85-86: LGTM! Thread-safe cache initialization.

The initialization follows the established pattern and maintains thread safety.


253-256: LGTM! Consistent cache management implementation.

The label cache management follows the same pattern as IP cache management, ensuring consistency and reliability.

Also applies to: 269-272

@nobodyiam nobodyiam merged commit a070aa1 into apolloconfig:master Feb 7, 2025
8 checks passed
@nobodyiam nobodyiam deleted the 2.4.0-release branch February 7, 2025 12:33
@github-actions github-actions bot locked and limited conversation to collaborators Feb 7, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
size:L This PR changes 100-499 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant