mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-09-19 14:03:12 +00:00
Fixes #3501 - Having more than one instance behind a load balancer w/o stickiness breaks API pagination (#3510)
This commit is contained in:
parent
29e42051ec
commit
d31431024e
@ -73,7 +73,6 @@ import org.openmetadata.catalog.util.RestUtil.DeleteResponse;
|
|||||||
import org.openmetadata.catalog.util.RestUtil.PatchResponse;
|
import org.openmetadata.catalog.util.RestUtil.PatchResponse;
|
||||||
import org.openmetadata.catalog.util.RestUtil.PutResponse;
|
import org.openmetadata.catalog.util.RestUtil.PutResponse;
|
||||||
import org.openmetadata.catalog.util.ResultList;
|
import org.openmetadata.catalog.util.ResultList;
|
||||||
import org.openmetadata.common.utils.CipherText;
|
|
||||||
import org.openmetadata.common.utils.CommonUtil;
|
import org.openmetadata.common.utils.CommonUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -282,7 +281,7 @@ public abstract class EntityRepository<T> {
|
|||||||
throws GeneralSecurityException, IOException, ParseException {
|
throws GeneralSecurityException, IOException, ParseException {
|
||||||
// forward scrolling, if after == null then first page is being asked
|
// forward scrolling, if after == null then first page is being asked
|
||||||
List<String> jsons =
|
List<String> jsons =
|
||||||
dao.listAfter(fqnPrefix, limitParam + 1, after == null ? "" : CipherText.instance().decrypt(after), include);
|
dao.listAfter(fqnPrefix, limitParam + 1, after == null ? "" : RestUtil.decodeCursor(after), include);
|
||||||
|
|
||||||
List<T> entities = new ArrayList<>();
|
List<T> entities = new ArrayList<>();
|
||||||
for (String json : jsons) {
|
for (String json : jsons) {
|
||||||
@ -306,7 +305,7 @@ public abstract class EntityRepository<T> {
|
|||||||
UriInfo uriInfo, Fields fields, String fqnPrefix, int limitParam, String before, Include include)
|
UriInfo uriInfo, Fields fields, String fqnPrefix, int limitParam, String before, Include include)
|
||||||
throws IOException, GeneralSecurityException, ParseException {
|
throws IOException, GeneralSecurityException, ParseException {
|
||||||
// Reverse scrolling - Get one extra result used for computing before cursor
|
// Reverse scrolling - Get one extra result used for computing before cursor
|
||||||
List<String> jsons = dao.listBefore(fqnPrefix, limitParam + 1, CipherText.instance().decrypt(before), include);
|
List<String> jsons = dao.listBefore(fqnPrefix, limitParam + 1, RestUtil.decodeCursor(before), include);
|
||||||
|
|
||||||
List<T> entities = new ArrayList<>();
|
List<T> entities = new ArrayList<>();
|
||||||
for (String json : jsons) {
|
for (String json : jsons) {
|
||||||
|
@ -37,8 +37,8 @@ import org.openmetadata.catalog.util.EntityInterface;
|
|||||||
import org.openmetadata.catalog.util.EntityUtil;
|
import org.openmetadata.catalog.util.EntityUtil;
|
||||||
import org.openmetadata.catalog.util.EntityUtil.Fields;
|
import org.openmetadata.catalog.util.EntityUtil.Fields;
|
||||||
import org.openmetadata.catalog.util.JsonUtils;
|
import org.openmetadata.catalog.util.JsonUtils;
|
||||||
|
import org.openmetadata.catalog.util.RestUtil;
|
||||||
import org.openmetadata.catalog.util.ResultList;
|
import org.openmetadata.catalog.util.ResultList;
|
||||||
import org.openmetadata.common.utils.CipherText;
|
|
||||||
|
|
||||||
public class LocationRepository extends EntityRepository<Location> {
|
public class LocationRepository extends EntityRepository<Location> {
|
||||||
// Location fields that can be patched in a PATCH request
|
// Location fields that can be patched in a PATCH request
|
||||||
@ -93,7 +93,7 @@ public class LocationRepository extends EntityRepository<Location> {
|
|||||||
fqn,
|
fqn,
|
||||||
service,
|
service,
|
||||||
limitParam + 1,
|
limitParam + 1,
|
||||||
CipherText.instance().decrypt(before));
|
RestUtil.decodeCursor(before));
|
||||||
|
|
||||||
List<Location> entities = new ArrayList<>();
|
List<Location> entities = new ArrayList<>();
|
||||||
for (String json : jsons) {
|
for (String json : jsons) {
|
||||||
@ -129,7 +129,7 @@ public class LocationRepository extends EntityRepository<Location> {
|
|||||||
fqn,
|
fqn,
|
||||||
service,
|
service,
|
||||||
limitParam + 1,
|
limitParam + 1,
|
||||||
after == null ? "" : CipherText.instance().decrypt(after));
|
after == null ? "" : RestUtil.decodeCursor(after));
|
||||||
|
|
||||||
List<Location> entities = new ArrayList<>();
|
List<Location> entities = new ArrayList<>();
|
||||||
for (String json : jsons) {
|
for (String json : jsons) {
|
||||||
|
@ -16,10 +16,12 @@ package org.openmetadata.catalog.util;
|
|||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Base64;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
@ -133,6 +135,14 @@ public final class RestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String encodeCursor(String cursor) {
|
||||||
|
return cursor == null ? null : Base64.getUrlEncoder().encodeToString(cursor.getBytes(StandardCharsets.UTF_8));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String decodeCursor(String cursor) {
|
||||||
|
return cursor == null ? null : new String(Base64.getUrlDecoder().decode(cursor));
|
||||||
|
}
|
||||||
|
|
||||||
public static class PutResponse<T> {
|
public static class PutResponse<T> {
|
||||||
private T entity;
|
private T entity;
|
||||||
private ChangeEvent changeEvent;
|
private ChangeEvent changeEvent;
|
||||||
|
@ -21,7 +21,6 @@ import java.security.GeneralSecurityException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import org.openmetadata.catalog.type.Paging;
|
import org.openmetadata.catalog.type.Paging;
|
||||||
import org.openmetadata.common.utils.CipherText;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class used for generating JSON response for APIs returning list of objects in the following format: { "data" : [ {
|
* Class used for generating JSON response for APIs returning list of objects in the following format: { "data" : [ {
|
||||||
@ -84,8 +83,8 @@ public class ResultList<T> {
|
|||||||
this.data = data;
|
this.data = data;
|
||||||
paging =
|
paging =
|
||||||
new Paging()
|
new Paging()
|
||||||
.withBefore(CipherText.instance().encrypt(beforeCursor))
|
.withBefore(RestUtil.encodeCursor(beforeCursor))
|
||||||
.withAfter(CipherText.instance().encrypt(afterCursor))
|
.withAfter(RestUtil.encodeCursor(afterCursor))
|
||||||
.withTotal(total);
|
.withTotal(total);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user