Skip to content

Commit

Permalink
Eliminate unnecessary resource unfreezing
Browse files Browse the repository at this point in the history
Here we remove unnecessary unfreezing and re-freezing of resource
objects that is done when updating the availability status.

This should alleviate issues like MID-5766 or MID-5767, maybe also
MID-5768. However, these concurrency issues will be still there
(only with lower probability of occurrence), and must be addressed.
  • Loading branch information
mederly committed Sep 18, 2019
1 parent aa78a65 commit 03f676b
Showing 1 changed file with 12 additions and 12 deletions.
Expand Up @@ -1002,12 +1002,12 @@ public void testConnectionConnector(ConnectorSpec connectorSpec, Map<String,Coll
connectorManager.cacheConfiguredConnector(connectorInstanceCacheEntry, connectorSpec);
}

public void modifyResourceAvailabilityStatus(PrismObject<ResourceType> resource, AvailabilityStatusType newStatus, OperationResult result){
public void modifyResourceAvailabilityStatus(PrismObject<ResourceType> resource, AvailabilityStatusType newStatus, OperationResult result) {
ResourceType resourceType = resource.asObjectable();

synchronized (resource) {
AvailabilityStatusType currentStatus = ResourceTypeUtil.getLastAvailabilityStatus(resourceType);
if (!newStatus.equals(currentStatus)) {
if (newStatus != currentStatus) {
LOGGER.debug("Changing availability status of {}: {} -> {}", resource, currentStatus, newStatus);
List<PropertyDelta<?>> modifications = new ArrayList<>();
PropertyDelta<?> statusDelta = createResourceAvailabilityStatusDelta(resource, newStatus);
Expand All @@ -1016,19 +1016,19 @@ public void modifyResourceAvailabilityStatus(PrismObject<ResourceType> resource,
try {
repositoryService.modifyObject(ResourceType.class, resourceType.getOid(), modifications, result);
InternalMonitor.recordCount(InternalCounters.RESOURCE_REPOSITORY_MODIFY_COUNT);
} catch(SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException ex) {
} catch (SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException ex) {
throw new SystemException(ex);
}
resource.modifyUnfrozen(() -> {
if (resourceType.getOperationalState() == null) {
OperationalStateType operationalState = new OperationalStateType();
operationalState.setLastAvailabilityStatus(newStatus);
resourceType.setOperationalState(operationalState);
} else {
resourceType.getOperationalState().setLastAvailabilityStatus(newStatus);
}
});
}
resource.modifyUnfrozen(() -> {
if (resourceType.getOperationalState() == null) {
OperationalStateType operationalState = new OperationalStateType();
operationalState.setLastAvailabilityStatus(newStatus);
resourceType.setOperationalState(operationalState);
} else {
resourceType.getOperationalState().setLastAvailabilityStatus(newStatus);
}
});
}
}

Expand Down

0 comments on commit 03f676b

Please sign in to comment.