Question: The method getDiagnosticForEObject can be called by different
threads. Can this be the source of the issue? I see that
ComponentServiceObject is tagged as ThreadSafe, but?

Alain


On Mon, Mar 2, 2020 at 5:47 AM Alain Picard <pic...@castortech.com> wrote:

> Tim,
>
> I don't think so. BaValidationManagerExt is used in only 1 place and it is
> instantiated in activate and released in deactivate:
> @Component(
> factory = ValidationManager.CONFIG_FACTORY,
> service = ValidationManager.class
> )
> public final class CoreValidationManager extends
> CDODefaultTransactionHandler1 implements ValidationManager,
> CDOTransactionHandler2 {
> ...
> @Reference(scope=ReferenceScope.PROTOTYPE_REQUIRED)
> private ComponentServiceObjects<ValidationManagerExt> extenderFactory;
> private ValidationManagerExt extender;
>
> @Activate
> private void activate() {
> log.trace("Activating {}", getClass()); //$NON-NLS-1$
>
> extender = extenderFactory.getService();
> }
>
> @Deactivate
> private void deactivate() {
> log.trace("Deactivating {}", getClass()); //$NON-NLS-1$
> extenderFactory.ungetService(extender);
> }
>
> Cheers,
> Alain
>
> Alain Picard
> Chief Strategy Officer
> Castor Technologies Inc
> o:514-360-7208
> m:813-787-3424
>
> pic...@castortech.com
> www.castortech.com
>
>
> On Mon, Mar 2, 2020 at 3:40 AM Tim Ward <tim.w...@paremus.com> wrote:
>
>> Hi Alain,
>>
>> Is it possible that someone has a reference to a BaValidationManagerExt
>> service instance that they aren’t releasing after ungetting it (or that
>> they’re holding onto after it has been unregistered)? It might be an SCR
>> bug, but it’s more likely to be some code holding onto a component instance
>> that it shouldn’t.
>>
>> Best Regards,
>>
>> Tim
>>
>> On 29 Feb 2020, at 13:29, Alain Picard via osgi-dev <
>> osgi-dev@mail.osgi.org> wrote:
>>
>> Hi
>>
>> I am having a very intermittent issue with getService on a prototype
>> component. This is called hundreds of times and I put a breakpoint a few
>> weeks ago and have now gotten the error.
>>
>> I have this class:
>> @Component(scope=ServiceScope.PROTOTYPE,
>> property= org.osgi.framework.Constants.SERVICE_RANKING + ":Integer=10"
>> )
>> public final class BaValidationManagerExt implements ValidationManagerExt
>> {
>> private final Logger log = LoggerFactory.getLogger(getClass());
>>
>> @Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED)
>> private ComponentServiceObjects<Validator> validatorFactory;
>>
>> @Activate
>> private void activate() {
>> log.trace("Activating {}/{}", getClass(), System.identityHashCode(this));
>> //$NON-NLS-1$
>> }
>>
>> @Deactivate
>> private void deactivate() {
>> log.trace("Deactivating {}/{}", getClass(),
>> System.identityHashCode(this)); //$NON-NLS-1$
>> }
>> ....
>> @Override
>> public Diagnostic getDiagnosticForEObject(EObject eObj) {
>> log.trace("Getting diagnostic for {}", eObj); //$NON-NLS-1$
>> Validator validator = validatorFactory.getService();
>>
>> if (validator != null) {
>> try {
>> return validator.runValidation(false, Collections.singletonMap(eObj, new
>> HashSet<>()),
>> new NullProgressMonitor()).getB();
>> }
>> finally {
>> validatorFactory.ungetService(validator);
>> }
>> }
>> else {
>> log.error("Validator Service not found for {}", eObj, new Throwable());
>> //$NON-NLS-1$
>> return Diagnostic.CANCEL_INSTANCE;
>> }
>> }
>> }
>>
>> and the validator:
>> @Component(
>> scope = ServiceScope.PROTOTYPE,
>> property= org.osgi.framework.Constants.SERVICE_RANKING + ":Integer=10"
>> )
>> public final class BaValidator implements Validator {
>> private final Logger log = LoggerFactory.getLogger(getClass());
>>
>> private Map<EObject, Set<EObject>> elementsToValidate;
>> private Set<EObject> validated = Sets.newHashSet();
>> private boolean batch;
>>
>> private EditingDomain domain;
>> private AdapterFactory adapterFactory;
>>
>> @Reference
>> private volatile List<ValidationProvider> validationProviders;  //NOSONAR
>> as per OSGi 112.3.9.1
>>
>> @Reference
>> private ValidationUtils validationUtils;
>>
>> @Activate
>> private void activate() {
>> log.trace("Activating {}/{}", getClass(), System.identityHashCode(this));
>> //$NON-NLS-1$
>> }
>>
>> @Deactivate
>> private void deactivate() {
>> log.trace("Deactivating {}/{}", getClass(),
>> System.identityHashCode(this)); //$NON-NLS-1$
>> }
>> ...
>> }
>>
>> The error is on the highlighted line, which happens since getService
>> returns null.
>>
>> As can be seen here, ValidatorFactory serviceObjects is null which seems
>> to be what makes it return null:
>> ComponentServiceObjectsImpl [instances=[], serviceObjects=null,
>> deactivated=false, hashCode=301166435]
>>
>> I am not seeing any special in the logs (tracing is on). Just before I
>> see a number of successful call to the same code with the last one being:
>> just before in the logs:
>> 08:00:45.854 [Worker-1: Create Diagram] TRACE c.c.i.v.b.p.BaValidator -
>> Activating class
>> com.castortech.iris.validation.ba.provider.BaValidator/1297753057
>> 08:00:45.857 [Worker-1: Create Diagram] TRACE c.c.i.v.b.p.BaValidator -
>> Notify 4 listeners with diagnostics ([Diagnostic OK
>> source=com.castortech.iris.ba.validation code=0
>>  data=[RadialDiagramImpl{[cdoID->6558b1f9-dbcf-4e9d-b7b8-73779b5ada8f]
>> 08:00:45.858 [Worker-1: Create Diagram] TRACE c.c.i.v.b.p.BaValidator -
>> Deactivating class
>> com.castortech.iris.validation.ba.provider.BaValidator/1297753057
>>
>>
>> Has anyone seen this before or can provide some pointers to address
>> and/or debug this.
>>
>> Thanks
>> Alain
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>>
>>
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to