Fix: LWT routing enhancements to utilize LBP by nikagra · Pull Request #784 · scylladb/java-driver

dkropachev

requested changes Jan 9, 2026

@nikagra nikagra changed the title Fix/lwt routing lbp filtering 384 Fix: LWT routing lbp filtering 384

Jan 19, 2026

@nikagra nikagra changed the title Fix: LWT routing lbp filtering 384 Fix: LWT routing enhancements to utilize LBP

Jan 19, 2026

@nikagra nikagra marked this pull request as ready for review

January 20, 2026 18:26

dkropachev

dkropachev

dkropachev

dkropachev

@nikagra

- Added RequestRoutingType and RequestRoutingMethod enums to define request routing strategies.
- Updated DefaultLoadBalancingPolicy to consider request routing type for replica selection, especially for LWT requests.
- Updated various graph statement classes (BytecodeGraphStatement, DefaultBatchGraphStatement, DefaultFluentGraphStatement, DefaultScriptGraphStatement) to implement getRequestRoutingType method.
- Modified BatchStatementBuilder to set request routing type based on LWT status.
- Enhanced DefaultBatchStatement, DefaultBoundStatement, DefaultPrepareRequest, and DefaultSimpleStatement to include routing type in constructors and methods.
- Added logic to avoid slow replicas based on health checks and in-flight requests.

dkropachev

@nikagra

Introduce RequestRoutingType to distinguish LWT from regular queries and
add a new configuration option to control LWT routing behavior.

The new `advanced.load-balancing-policy.default-lwt-request-routing-method`
option allows choosing between:
- REGULAR: Default shuffling and slow replica avoidance
- PRESERVE_REPLICA_ORDER: Maintains replica order from partitioner

Changes:
- Add RequestRoutingType enum (REGULAR, LWT) to classify requests
- Remove unused RequestRoutingMethod enum from Request interface
- Thread RequestRoutingType through Statement builders and implementations
- Update DefaultLoadBalancingPolicy to route LWT queries according to config
- Add corresponding TypedDriverOption and OptionsMap support
- Update prepared statement creation to detect and mark LWT queries
- Remove RequestRoutingMethod.getRoutingMethod() default method

This enables optimized LWT performance by avoiding unnecessary shuffling
when replica order preservation is beneficial for linearizability.

refactor: update LWT request routing method to preserve replica order

dkropachev

@nikagra @dkropachev

- Fix Javadoc positioning: Move @nonnull annotations after doc comments
  in DefaultLoadBalancingPolicy methods (per Java conventions)
- Add missing @nonnull annotation to StatementBuilderTest mock builder
- Add @nullable annotation to NodeStateIT query plan method signature
- Standardize test infrastructure:
  * Add @RunWith(MockitoJUnitRunner.Silent.class) to 7 test classes
  * Update LoadBalancingPolicyTestBase to stub LWT routing config option
  * Convert base class from @RunWith to abstract (subclasses now declare runner)
- Standardize integration test naming: ccmRule→CCM_RULE, sessionRule→SESSION_RULE
- Update test mocks with RequestRoutingType.REGULAR parameter for compatibility
- Improve LWT integration tests:
  * BatchStatementIT: Fix variable references, enhance LWT batch assertions
  * LWTLoadBalancingIT: Change from single-node to replica-set validation
  * Add LWTLoadBalancingMultiDcIT: New multi-DC LWT routing test coverage

No functional changes to production code—purely code quality and test improvements.

Apply suggestions from code review

Co-authored-by: Dmitry Kropachev <dmitry.kropachev@gmail.com>

dkropachev

dkropachev

nikagra

nikagra

nikagra

dkropachev

@nikagra

dkropachev