Skip to content

Fix lane fallback issue. #217

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

Merged
merged 1 commit into from
Jan 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,31 @@ public <T extends OutboundRequest> void filter(OutboundInvocation<T> invocation,

// Check if a target lane is specified
if (targetSpace != null) {
// redirect according to the service policy
// get service lane policy
ServicePolicy servicePolicy = invocation.getServiceMetadata().getServicePolicy();
LanePolicy lanePolicy = servicePolicy == null ? null : servicePolicy.getLanePolicy(targetSpaceId);
String redirect = lanePolicy == null ? null : lanePolicy.getTarget(targetLaneId);
Lane targetLane = redirect == null || redirect.isEmpty() ? metadata.getTargetLane() : targetSpace.getLane(redirect);
// not null
FallbackType fallbackType = lanePolicy == null ? FallbackType.DEFAULT : lanePolicy.getFallbackType();
// fallbackLaneCode will not be null when the fallback type is custom
String fallbackLaneCode = lanePolicy == null ? null : lanePolicy.getFallbackLane();
Lane targetLane = metadata.getTargetLane();

FallbackType fallbackType = null;
String fallbackLane = null;
// service fallback
if (lanePolicy != null) {
fallbackType = lanePolicy.getFallbackType();
fallbackLane = fallbackType == FallbackType.CUSTOM ? lanePolicy.getFallbackLane(targetLaneId) : null;
}
// lane fallback
if (fallbackType == null) {
fallbackType = targetLane == null ? FallbackType.DEFAULT : targetLane.getFallbackType();
fallbackLane = fallbackType == FallbackType.CUSTOM ? targetLane.getFallbackLane() : null;
}
if (targetLane != null) {
Lane defaultLane = targetSpace.getDefaultLane();
boolean redirectDefaultLane = defaultLane != null && targetLane != defaultLane && FallbackType.DEFAULT == fallbackType;
boolean redirectFallbackLane = fallbackType == FallbackType.CUSTOM;
boolean redirectDefaultLane = defaultLane != null
&& targetLane != defaultLane
&& (FallbackType.DEFAULT == fallbackType || FallbackType.CUSTOM == fallbackType && fallbackLane == null);
boolean redirectFallbackLane = fallbackType == FallbackType.CUSTOM && fallbackLane != null && !fallbackLane.equals(targetLane.getCode());
String fallbackLaneCode = redirectFallbackLane ? fallbackLane : null;

// Filter the route target based on the lane space ID and route lane code
boolean nullable = !redirectDefaultLane && !redirectFallbackLane;
int count = target.filter(e -> e.isLane(targetSpaceId, targetLane.getCode(), defaultSpaceId, defaultLaneId), -1, nullable);
Expand All @@ -79,7 +91,7 @@ public <T extends OutboundRequest> void filter(OutboundInvocation<T> invocation,
target.filter(e -> e.isLane(targetSpaceId, fallbackLaneCode, defaultSpaceId, defaultLaneId), -1, true);
}
} else {
String code = redirect == null || redirect.isEmpty() ? targetLaneId : redirect;
String code = fallbackLane == null ? targetLaneId : fallbackLane;
target.filter(e -> e.isLane(targetSpaceId, code, defaultSpaceId, defaultLaneId), -1, true);
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,14 @@ public class LanePolicy extends PolicyId implements PolicyInheritWithIdGen<LaneP

private String laneSpaceId;

private Map<String, String> lanes;
private Map<String, String> fallbackLanes;

/**
* Types of fallback strategies for lane redirection
* <p>
*/
private FallbackType fallbackType;

/**
* When the fallbackType type is CUSTOM, the lane request is redirected based on the lane specified in this field.
* If there is still no corresponding instance, the request is denied.
* <p>
*/
private String fallbackLane;

@Override
public void supplement(LanePolicy source) {
if (source == null) {
Expand All @@ -60,26 +53,15 @@ public void supplement(LanePolicy source) {
if (laneSpaceId == null) {
laneSpaceId = source.getLaneSpaceId();
}
if (lanes == null && source.getLanes() != null) {
lanes = new HashMap<>(source.getLanes());
if (fallbackLanes == null && source.getFallbackLanes() != null) {
fallbackLanes = new HashMap<>(source.getFallbackLanes());
}
if (fallbackType == null) {
fallbackType = source.getFallbackType();
}
if (fallbackLane == null) {
fallbackLane = source.getFallbackLane();
}
}

public FallbackType getFallbackType() {
if (fallbackType == null
|| fallbackType == FallbackType.CUSTOM && (fallbackLane == null || fallbackLane.isEmpty())) {
return FallbackType.DEFAULT;
}
return fallbackType;
}

public String getTarget(String lane) {
return lane == null || lane.isEmpty() ? null : lanes.get(lane);
public String getFallbackLane(String lane) {
return lane == null || lane.isEmpty() ? null : fallbackLanes.get(lane);
}
}
Loading