mirror of
				https://github.com/open-metadata/OpenMetadata.git
				synced 2025-11-03 20:19:31 +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.PutResponse;
 | 
			
		||||
import org.openmetadata.catalog.util.ResultList;
 | 
			
		||||
import org.openmetadata.common.utils.CipherText;
 | 
			
		||||
import org.openmetadata.common.utils.CommonUtil;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -282,7 +281,7 @@ public abstract class EntityRepository<T> {
 | 
			
		||||
      throws GeneralSecurityException, IOException, ParseException {
 | 
			
		||||
    // forward scrolling, if after == null then first page is being asked
 | 
			
		||||
    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<>();
 | 
			
		||||
    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)
 | 
			
		||||
      throws IOException, GeneralSecurityException, ParseException {
 | 
			
		||||
    // 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<>();
 | 
			
		||||
    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.Fields;
 | 
			
		||||
import org.openmetadata.catalog.util.JsonUtils;
 | 
			
		||||
import org.openmetadata.catalog.util.RestUtil;
 | 
			
		||||
import org.openmetadata.catalog.util.ResultList;
 | 
			
		||||
import org.openmetadata.common.utils.CipherText;
 | 
			
		||||
 | 
			
		||||
public class LocationRepository extends EntityRepository<Location> {
 | 
			
		||||
  // Location fields that can be patched in a PATCH request
 | 
			
		||||
@ -93,7 +93,7 @@ public class LocationRepository extends EntityRepository<Location> {
 | 
			
		||||
                fqn,
 | 
			
		||||
                service,
 | 
			
		||||
                limitParam + 1,
 | 
			
		||||
                CipherText.instance().decrypt(before));
 | 
			
		||||
                RestUtil.decodeCursor(before));
 | 
			
		||||
 | 
			
		||||
    List<Location> entities = new ArrayList<>();
 | 
			
		||||
    for (String json : jsons) {
 | 
			
		||||
@ -129,7 +129,7 @@ public class LocationRepository extends EntityRepository<Location> {
 | 
			
		||||
                fqn,
 | 
			
		||||
                service,
 | 
			
		||||
                limitParam + 1,
 | 
			
		||||
                after == null ? "" : CipherText.instance().decrypt(after));
 | 
			
		||||
                after == null ? "" : RestUtil.decodeCursor(after));
 | 
			
		||||
 | 
			
		||||
    List<Location> entities = new ArrayList<>();
 | 
			
		||||
    for (String json : jsons) {
 | 
			
		||||
 | 
			
		||||
@ -16,10 +16,12 @@ package org.openmetadata.catalog.util;
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty;
 | 
			
		||||
import java.lang.reflect.Field;
 | 
			
		||||
import java.net.URI;
 | 
			
		||||
import java.nio.charset.StandardCharsets;
 | 
			
		||||
import java.text.DateFormat;
 | 
			
		||||
import java.text.ParseException;
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Base64;
 | 
			
		||||
import java.util.Date;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
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> {
 | 
			
		||||
    private T entity;
 | 
			
		||||
    private ChangeEvent changeEvent;
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,6 @@ import java.security.GeneralSecurityException;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
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" : [ {
 | 
			
		||||
@ -84,8 +83,8 @@ public class ResultList<T> {
 | 
			
		||||
    this.data = data;
 | 
			
		||||
    paging =
 | 
			
		||||
        new Paging()
 | 
			
		||||
            .withBefore(CipherText.instance().encrypt(beforeCursor))
 | 
			
		||||
            .withAfter(CipherText.instance().encrypt(afterCursor))
 | 
			
		||||
            .withBefore(RestUtil.encodeCursor(beforeCursor))
 | 
			
		||||
            .withAfter(RestUtil.encodeCursor(afterCursor))
 | 
			
		||||
            .withTotal(total);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user