Re: [osgi-dev] Intermittent failure to getService

2020-03-02 Thread Peter Kriens via osgi-dev
Some remarks:

* Yes, it is thread safe. In OSGi we mark all thread safe types with the 
@ThreadSafe annotation.
* The error message is not in the log you listed. Since the log contains a 
deactivation message, I hope you're handling the case corrected that you're 
being called after deactivation? Seems too simple, but anyway ... :-)

* And for something completely different, is there any reason you use the 
prototype scope? You real code might need it but for this code it just looks 
like making it accidentally complex?
* And last but not least, you seem to be using slf4j? Did you wire up the OSGi 
log to it? I've seen cases where the information was in the OSGi log but those 
messages were discarded.

Kind regards,

Peter Kriens


> On 2 Mar 2020, at 12:03, Alain Picard via osgi-dev  
> wrote:
> 
> 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  > 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 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  > 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 > > 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 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> elementsToValidate;
>> private Set validated = Sets.newHashSet();
>> private boolean batch;
>> 
>> private EditingDomain domain;
>> private AdapterFactory adapterFactory;
>> 
>> @Reference
>> private volatile List validationProviders;  //NOSONAR as 
>> per OSGi 112.3.9.1 
>> 
>> @Reference
>> private ValidationUtils validationUtils;
>> 
>> @Activate
>> private void activate() {
>> log.trace("Activating {}/{}", getClass(), 

[osgi-dev] Bndtools starter

2020-03-02 Thread Peter Kriens via osgi-dev
I've written a little booklet and created a number of videos to make it easier 
to get started with bndtools. 

https://bndtools.org/workspace.html

If you have any feedback, let me know. I heard from a lot of people that they 
had a hard time starting with the Bndtools which is a real shame. When properly 
setup, it is hard to beat with the Gradle build for Github Actions and the 
almost script language like fluidity of Bndtools.

Again, let me know if I can make improvements. And if you're interested in 
providing an audio tape with a native speaker with a better voice for the 
videos, don't hesitate to contact me. Would be appreciated.

Kind regards,

Peter Kriens

___
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev


Re: [osgi-dev] Intermittent failure to getService

2020-03-02 Thread Alain Picard via osgi-dev
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  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 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  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 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> elementsToValidate;
>> private Set validated = Sets.newHashSet();
>> private boolean batch;
>>
>> private EditingDomain domain;
>> private AdapterFactory adapterFactory;
>>
>> @Reference
>> private volatile List 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

Re: [osgi-dev] Intermittent failure to getService

2020-03-02 Thread Alain Picard via osgi-dev
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 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  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 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> elementsToValidate;
> private Set validated = Sets.newHashSet();
> private boolean batch;
>
> private EditingDomain domain;
> private AdapterFactory adapterFactory;
>
> @Reference
> private volatile List 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
>
> 

Re: [osgi-dev] Intermittent failure to getService

2020-03-02 Thread Tim Ward via osgi-dev
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  
> 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 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> elementsToValidate;
> private Set validated = Sets.newHashSet();
> private boolean batch;
> 
> private EditingDomain domain;
> private AdapterFactory adapterFactory;
> 
> @Reference
> private volatile List 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