Avoid a crash reading an unknown ID on partitioned server (#2451)
* Avoid a crash reading an unknown ID on partitioned server. Fix #1953. * Attempt 2 at fixing #1953
This commit is contained in:
parent
eb3c155598
commit
62df320ceb
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
type: fix
|
||||||
|
issue: 1953
|
||||||
|
title: "A crash was fixed when performing a FHIR read on a partitioned server, where the requested ID is not known. Thanks
|
||||||
|
to Umberto Cappellini for reporting!"
|
|
@ -1149,7 +1149,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
BaseHasResource entity = myEntityManager.find(ResourceTable.class, pid.getIdAsLong());
|
BaseHasResource entity = myEntityManager.find(ResourceTable.class, pid.getIdAsLong());
|
||||||
|
|
||||||
// Verify that the resource is for the correct partition
|
// Verify that the resource is for the correct partition
|
||||||
if (!requestPartitionId.isAllPartitions()) {
|
if (entity != null && !requestPartitionId.isAllPartitions()) {
|
||||||
if (entity.getPartitionId() != null && entity.getPartitionId().getPartitionId() != null) {
|
if (entity.getPartitionId() != null && entity.getPartitionId().getPartitionId() != null) {
|
||||||
if (!requestPartitionId.hasPartitionId(entity.getPartitionId().getPartitionId())) {
|
if (!requestPartitionId.hasPartitionId(entity.getPartitionId().getPartitionId())) {
|
||||||
ourLog.debug("Performing a read for PartitionId={} but entity has partition: {}", requestPartitionId, entity.getPartitionId());
|
ourLog.debug("Performing a read for PartitionId={} but entity has partition: {}", requestPartitionId, entity.getPartitionId());
|
||||||
|
|
|
@ -975,6 +975,58 @@ public class PartitioningSqlR4Test extends BasePartitioningR4Test {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRead_PidId_UnknownResourceId() {
|
||||||
|
// Read in specific Partition
|
||||||
|
{
|
||||||
|
addReadPartition(1);
|
||||||
|
try {
|
||||||
|
myPatientDao.read(new IdType("Patient/1"), mySrd);
|
||||||
|
fail();
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read in null Partition
|
||||||
|
{
|
||||||
|
addReadDefaultPartition();
|
||||||
|
try {
|
||||||
|
myPatientDao.read(new IdType("Patient/1"), mySrd);
|
||||||
|
fail();
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRead_PidId_ResourceIdOnlyExistsInDifferentPartition() {
|
||||||
|
IIdType id = createPatient(withPartition(2), withActiveTrue());
|
||||||
|
// Read in specific Partition
|
||||||
|
{
|
||||||
|
addReadPartition(1);
|
||||||
|
try {
|
||||||
|
myPatientDao.read(id, mySrd);
|
||||||
|
fail();
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read in null Partition
|
||||||
|
{
|
||||||
|
addReadDefaultPartition();
|
||||||
|
try {
|
||||||
|
myPatientDao.read(id, mySrd);
|
||||||
|
fail();
|
||||||
|
} catch (ResourceNotFoundException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRead_ForcedId_SpecificPartition() {
|
public void testRead_ForcedId_SpecificPartition() {
|
||||||
IIdType patientIdNull = createPatient(withPutPartition(null), withActiveTrue(), withId("NULL"));
|
IIdType patientIdNull = createPatient(withPutPartition(null), withActiveTrue(), withId("NULL"));
|
||||||
|
|
Loading…
Reference in New Issue