Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
@@ -0,0 +1,5 @@
---
type: fix
issue: 7217
title: "Previously, searches for non-partitionable resources (e.g. a Library) could be executed against a partition that
is not the default partition. This has been corrected."
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
import ca.uhn.fhir.jpa.entity.PartitionEntity;
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
import ca.uhn.fhir.jpa.test.BaseJpaR4Test;
import ca.uhn.fhir.rest.api.server.RequestDetails;
import ca.uhn.fhir.rest.api.server.SystemRequestDetails;
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
import org.hl7.fhir.r4.model.IdType;
import org.hl7.fhir.r4.model.Patient;
import org.junit.jupiter.api.AfterEach;
Expand Down Expand Up @@ -40,6 +42,8 @@ class RequestPartitionHelperSvcTest extends BaseJpaR4Test {
static final int UNKNOWN_PARTITION_ID = 1_000_000;
static final String UNKNOWN_PARTITION_NAME = "UNKNOWN";

static final Integer DEFAULT_PARTITION_ID = null;

@Autowired
IPartitionDao myPartitionDao;
@Autowired
Expand Down Expand Up @@ -79,6 +83,34 @@ public void testDetermineReadPartitionForSystemRequest_withPartitionIdOnly_retur
assertEquals(PARTITION_NAME_1, result.getFirstPartitionNameOrNull());
}


@Test
public void testDetermineReadPartitionForServletRequest_whenResourceIsNonPartitionable() {
PartitionEntity partition1 = createPartition1();
ServletRequestDetails servletRequestDetails = new ServletRequestDetails();
servletRequestDetails.setTenantId(partition1.getName());

testDetermineReadPartitionRequest_whenResourceIsNonPartitionable_returnsDefaultPartition(servletRequestDetails);
}

@Test
public void testDetermineReadPartitionForSystemRequest_whenResourceIsNonPartitionable() {
PartitionEntity partitionEntity = createPartition1();
SystemRequestDetails srd = new SystemRequestDetails();
srd.setTenantId(partitionEntity.getName());
srd.setRequestPartitionId(RequestPartitionId.fromPartitionId(partitionEntity.getId()));

testDetermineReadPartitionRequest_whenResourceIsNonPartitionable_returnsDefaultPartition(srd);
}

public void testDetermineReadPartitionRequest_whenResourceIsNonPartitionable_returnsDefaultPartition(RequestDetails theDetails) {
// execute
RequestPartitionId result = mySvc.determineReadPartitionForRequestForSearchType(theDetails, "Library");

// verify
assertThat(result.hasDefaultPartitionId(DEFAULT_PARTITION_ID)).isTrue();
}

@Test
public void testDetermineCreatePartitionForRequest_withPartitionIdOnly_returnsCorrectPartition() {
// setup
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,20 +120,18 @@ public RequestPartitionId determineReadPartitionForRequest(
boolean nonPartitionableResource = isResourceNonPartitionable(resourceType);

RequestPartitionId requestPartitionId = null;
// Handle system requests
if (requestDetails instanceof SystemRequestDetails
&& systemRequestHasExplicitPartition((SystemRequestDetails) requestDetails)
&& !nonPartitionableResource) {
requestPartitionId = getSystemRequestPartitionId((SystemRequestDetails) requestDetails, false);
logSystemRequestDetailsResolution((SystemRequestDetails) requestDetails);

} else if ((requestDetails instanceof SystemRequestDetails) && nonPartitionableResource) {

if (nonPartitionableResource) {
requestPartitionId = myPartitionSettings.getDefaultRequestPartitionId();
logSystemRequestDetailsResolution((SystemRequestDetails) requestDetails);
logRequestDetailsResolution(requestDetails);
logNonPartitionableType(resourceType);
} else if (requestDetails instanceof SystemRequestDetails systemRequestDetails
&& systemRequestHasExplicitPartition(systemRequestDetails)) {
// !nonPartitionableResource
requestPartitionId = getSystemRequestPartitionId(systemRequestDetails, false);
logRequestDetailsResolution(systemRequestDetails);

} else {
// TODO mb: why is this path different than create?
// Here, a non-partitionable resource is still delivered to the pointcuts.
IInterceptorBroadcaster compositeBroadcaster =
CompositeInterceptorBroadcaster.newCompositeBroadcaster(myInterceptorBroadcaster, requestDetails);
if (compositeBroadcaster.hasHooks(Pointcut.STORAGE_PARTITION_IDENTIFY_ANY)) {
Expand Down Expand Up @@ -213,10 +211,10 @@ public RequestPartitionId determineGenericPartitionForRequest(RequestDetails the
return RequestPartitionId.allPartitions();
}

if (theRequestDetails instanceof SystemRequestDetails
&& systemRequestHasExplicitPartition((SystemRequestDetails) theRequestDetails)) {
requestPartitionId = getSystemRequestPartitionId((SystemRequestDetails) theRequestDetails);
logSystemRequestDetailsResolution((SystemRequestDetails) theRequestDetails);
if (theRequestDetails instanceof SystemRequestDetails systemRequestDetails
&& systemRequestHasExplicitPartition(systemRequestDetails)) {
requestPartitionId = getSystemRequestPartitionId(systemRequestDetails);
logRequestDetailsResolution(systemRequestDetails);
} else {
IInterceptorBroadcaster compositeBroadcaster = CompositeInterceptorBroadcaster.newCompositeBroadcaster(
myInterceptorBroadcaster, theRequestDetails);
Expand Down Expand Up @@ -303,12 +301,11 @@ public RequestPartitionId determineCreatePartitionForRequest(
}

RequestPartitionId requestPartitionId = null;
if (theRequest instanceof SystemRequestDetails
&& systemRequestHasExplicitPartition((SystemRequestDetails) theRequest)) {
requestPartitionId =
getSystemRequestPartitionId((SystemRequestDetails) theRequest, nonPartitionableResource);
if (theRequest instanceof SystemRequestDetails systemRequestDetails
&& systemRequestHasExplicitPartition(systemRequestDetails)) {
requestPartitionId = getSystemRequestPartitionId(systemRequestDetails, nonPartitionableResource);

logSystemRequestDetailsResolution((SystemRequestDetails) theRequest);
logRequestDetailsResolution(systemRequestDetails);
} else {
IInterceptorBroadcaster compositeBroadcaster =
CompositeInterceptorBroadcaster.newCompositeBroadcaster(myInterceptorBroadcaster, requestDetails);
Expand Down Expand Up @@ -492,10 +489,19 @@ private static void logTroubleshootingResult(
theResult);
}

private void logSystemRequestDetailsResolution(SystemRequestDetails theRequest) {
ourLog.trace(
"Partitioning: request is a SystemRequestDetails, with RequestPartitionId={}.",
theRequest.getRequestPartitionId());
private void logRequestDetailsResolution(RequestDetails theRequest) {
String logString = "Partitioning: request is a {}, with tenantId {}";

String requestClassName = theRequest.getClass().getSimpleName();
String tenantId = theRequest.getTenantId();
RequestPartitionId requestPartitionId = null;

if (theRequest instanceof SystemRequestDetails systemRequestDetails) {
requestPartitionId = systemRequestDetails.getRequestPartitionId();
logString = logString + ", with request partitionId {}";
}

ourLog.trace(logString, requestClassName, tenantId, requestPartitionId);
}

private static void logSubstitutingDefaultSystemRequestDetails() {
Expand Down
Loading