On the topic of bouncing…

What is a good way to test for robustness against this phenomenon? Is there 
some kind of Monkey Testing [1] framework to help with this?


[1] https://en.wikipedia.org/wiki/Monkey_testing 
<https://en.wikipedia.org/wiki/Monkey_testing>




> On Jul 12, 2018, at 23:11, Peter Kriens <peter.kri...@aqute.biz> wrote:
> 
> Well, OSGi has a tendency to punish short cuts. In the long run this is very 
> valuable, I’ve seen too many software disasters to sleep well at night. 
> However, for a developer behind his screen and a looming deadline the long 
> term goals are unfortunately not so urgent :-(
> 
> Kind regards,
> 
>       Peter Kriens
> 
> 
> 
>> On 12 Jul 2018, at 13:38, David Leangen via osgi-dev <osgi-dev@mail.osgi.org 
>> <mailto:osgi-dev@mail.osgi.org>> wrote:
>> 
>> 
>> As always, thank you VERY much to all of you for your great suggestions. I 
>> will look into this from tomorrow. I didn’t know the concept of “bouncing”. 
>> That is interesting. Now that I am aware, I will give more thought to it.
>> 
>> One thing I have seen stated before on this list is that OSGi is indeed 
>> complex, but it is not accidental complexity. It is simply making complexity 
>> explicit, and providing the tools to work with complexity. I completely 
>> agree with this statement.
>> 
>> I am still learning all the time, and am always amazed that there is still 
>> so much deeper to go. Thanks for helping me along this journey.
>> 
>> 
>> Cheers,
>> =David
>> 
>> 
>> 
>>> On Jul 12, 2018, at 17:42, Fauth Dirk (AA-AS/EIS2-EU) via osgi-dev 
>>> <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>> wrote:
>>> 
>>> If it is a bouncing problem, than you could also try to configure the 
>>> behavior using the property
>>>  
>>> ds.delayed.keepInstances=true
>>> 
>>> From the Apache Felix documentation:
>>>  
>>> Whether or not to keep instances of delayed components once they are not 
>>> referred to any more. The Declarative Services specifications suggests that 
>>> instances of delayed components are disposed off if there is not used any 
>>> longer. Setting this flag causes the components to not be disposed off and 
>>> thus prevent them from being constantly recreated if often used. Examples 
>>> of such components may be EventHandler services. The default is to dispose 
>>> off unused components. See FELIX-3039 
>>> <https://issues.apache.org/jira/browse/FELIX-3039> for details.
>>>  
>>> http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html
>>>  
>>> <http://felix.apache.org/documentation/subprojects/apache-felix-service-component-runtime.html>
>>>  
>>> Equinox DS had this set by default, while the default in Felix SCR is 
>>> false. With the usage of Felix SCR in Eclipse we needed to explicitly set 
>>> this parameter to true so the previous behavior persists.
>>>  
>>> Mit freundlichen Grüßen / Best regards 
>>> 
>>> Dirk Fauth
>>> 
>>> Automotive Service Solutions, ESI application (AA-AS/EIS2-EU) 
>>> Robert Bosch GmbH | Postfach 11 29 | 73201 Plochingen | GERMANY | 
>>> www.bosch.com <http://www.bosch.com/> 
>>> Tel. +49 7153 666-1155 | dirk.fa...@de.bosch.com 
>>> <mailto:dirk.fa...@de.bosch.com> 
>>> 
>>> Sitz: Stuttgart, Registergericht: Amtsgericht Stuttgart, HRB 14000;
>>> Aufsichtsratsvorsitzender: Franz Fehrenbach; Geschäftsführung: Dr. Volkmar 
>>> Denner,
>>> Prof. Dr. Stefan Asenkerschbaumer, Dr. Michael Bolle, Dr. Rolf Bulander, 
>>> Dr. Stefan Hartung, Dr. Markus Heyn,
>>> Dr. Dirk Hoheisel, Christoph Kübel, Uwe Raschke, Peter Tyroller 
>>> 
>>> 
>>> Von: osgi-dev-boun...@mail.osgi.org <mailto:osgi-dev-boun...@mail.osgi.org> 
>>> [mailto:osgi-dev-boun...@mail.osgi.org 
>>> <mailto:osgi-dev-boun...@mail.osgi.org>] Im Auftrag von Tim Ward via 
>>> osgi-dev
>>> Gesendet: Donnerstag, 12. Juli 2018 10:22
>>> An: Peter Kriens <peter.kri...@aqute.biz <mailto:peter.kri...@aqute.biz>>; 
>>> OSGi Developer Mail List <osgi-dev@mail.osgi.org 
>>> <mailto:osgi-dev@mail.osgi.org>>
>>> Betreff: Re: [osgi-dev] Double config
>>>  
>>> Hi David,
>>> 
>>> 
>>> This is a gift! :-) It means your code is not handling the dynamics 
>>> correctly and now you know it! 
>>>  
>>> I’m not sure that there’s quite enough evidence to come to this conclusion. 
>>> It could simply be that everything is working fine with a static policy, 
>>> and working the way that DS is supposed to. In general a DS component being 
>>> bounced like this is nothing to worry about, it’s just a change rippling 
>>> through the system, and it’s typically resolved in very short order. If you 
>>> do want to reason about why, however, then there are several places to look.
>>>  
>>> For some reason, the Component gets activated, deactivated, then activated 
>>> again, which is not desirable.
>>> ...
>>> 1. How can I figure out why this is happening. I have tried many 
>>> approaches, but can’t seem to get a clue as to why this is happening. Since 
>>> it generally doesn’t seem to happen for other configured components, I am 
>>> assuming that it is not a Configurator problem.
>>>  
>>> From the rest of your email it is clear that the configured component 
>>> provides a service. This will make it lazy by default. You have also stated 
>>> that you’re using has a required configuration policy. Therefore it will 
>>> only be activated when:
>>>  
>>> There is a configuration present
>>> All of the mandatory services are satisfied
>>> Someone is actually using the service
>>>  
>>> The component will then be deactivated when any of these things are 
>>> no-longer true, and so this means that your component may be being bounced 
>>> for several reasons, only one of which is to do with configuration. 
>>>  
>>> While it seems unlikely to me, you seem to be fairly convinced that the 
>>> configuration is at fault so lets start there.
>>>  
>>> Does the generated XML file in your bundle actually say that the 
>>> configuration is required. This is the configuration used by DS (not the 
>>> annotations) at runtime. It’s unlikely that this has gone wrong, but it’s 
>>> an easy check
>>> Do you have more than one way of putting configuration into the runtime? If 
>>> you are also using File Install, or some other configuration management 
>>> agent, then it’s entirely possible that you’re seeing a configuration 
>>> update occurring.
>>> Do you have multiple configuration bundles which both contain a 
>>> configuration for this component? The configurator will process these one 
>>> at a time, and it will result in configuration bouncing
>>> Is it possible that something is forcing a re-resolve of your configuration 
>>> bundle or the configurator? This could easily trigger the configurations to 
>>> be reprocessed.
>>>  
>>> Now in my view the most likely reason for this behaviour is that the 
>>> configured component isnot being bounced due to a configuration change. The 
>>> most likely suspect is that the component is simply not being used at that 
>>> time, and so it is being disposed (DS lazy behaviour). This could easily 
>>> happen if one of the dependent services that you mention starts using your 
>>> component, and then is bounced (by a configuration update or whatever) 
>>> which causes your component to be released. If nobody else is using your 
>>> component at the time then it will be deactivated and released. The easiest 
>>> way to verify this is to make your component immediate. This will remove 
>>> the laziness, and you will get a good idea as to whether the bounce is 
>>> caused by things that you depend on, or by things that depend on you. If 
>>> making your component immediate removes the “problem” then it proves that 
>>> this isn’t a problem at all (and you can then remove the immediate 
>>> behaviour again).
>>>  
>>> If making your component immediate doesn’t stop the bouncing then the third 
>>> set of things to check is the list of services that your component depends 
>>> on. Is it possible that one of them is being bounced due to a configuration 
>>> update, or perhaps one of their service dependencies being 
>>> unregistered/re-registered? As I mentioned before, bouncing of DS 
>>> components is simply the way that updates propagate through the system when 
>>> services use a static policy. It isn’t inherently a bad thing, but if you 
>>> want to avoid it you have to be dynamic all the way down the dependency 
>>> graph. Usually this is a lot more effort than it’s worth!
>>>  
>>> I hope this helps,
>>>  
>>> Tim
>>>  
>>> 
>>> 
>>> On 12 Jul 2018, at 08:39, Peter Kriens via osgi-dev <osgi-dev@mail.osgi.org 
>>> <mailto:osgi-dev@mail.osgi.org>> wrote:
>>>  
>>> This is a gift! :-) It means your code is not handling the dynamics 
>>> correctly and now you know it! 
>>> 
>>> The cause is that that the DS starts the components before the Configurator 
>>> has done its work. The easiest solution seems to be to use start levels. If 
>>> your code CAN handle the dynamics, then this is one of the few legitimate 
>>> places where startlevels are useful. I usually oppose it because people do 
>>> not handle the dynamics correctly and want a short cut. This is fine until 
>>> it is not. And the ‘not’ happens guaranteed one day. So first fix the 
>>> dynamics, and then think of solutions that improve the experience.
>>> 
>>> For this purpose, enRoute Classic had a 
>>> ‘osgi.enroute.configurer.api.ConfigurationDone’ service. If you made an 
>>> @Reference to ConfigurationDone then you were guaranteed to not start 
>>> before the Configurer had done its magic. Since you did not want to depend 
>>> on such a specific service for reasons of cohesion, I developed 
>>> AggregateState. One of the aggregated states was then the presence of the 
>>> ConfigurationDone service. Although this is also not perfectly cohesive it 
>>> at least aggregates all the uncohesive things in one place and it is 
>>> configurable.
>>> 
>>> Although this works the customer still is not completely happy since also 
>>> the Aggregate State feels uncohesive. So we’ve been discussing a new angle. 
>>> I want to try to make the Configuration Records _transient_. In Felix 
>>> Config Admin you can provide a persistence service (and it was recently 
>>> made useful). I was thinking of setting a special property in the 
>>> configuration (something like ‘:persistence:transient’). The persistence 
>>> layer would then _not_ persist it. I.e. after a restart there would be no 
>>> configuration until the Configurer sets it. This will (I expect) seriously 
>>> diminish the bouncing caused for these kind of components.
>>> 
>>> And if you’re asking why I am still on the enRoute classic Configurer. 
>>> Well, it has ‘precious’ fields and they solved a nasty problem. We needed 
>>> to use a well defined value but if the user set one of those values, we 
>>> wanted to keep the user’s value. Quite a common scenario. With `precious` 
>>> fields you rely on default values (so no value for a precious field in the 
>>> configurer’s input) but copy the previous value to the newer configuration, 
>>> if present. Works quite well.
>>> 
>>> I think `transient` and `precious` could be nice extensions to the new 
>>> Configurator for R8.
>>> 
>>> Hope this helps. Kind regards,
>>> 
>>>             Peter Kriens
>>> 
>>> 
>>> On 12 Jul 2018, at 00:48, David Leangen via osgi-dev 
>>> <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>> wrote:
>>> 
>>> 
>>> Hi!
>>> 
>>> A question about component configuration.
>>> 
>>> I have a component that has a required configuration policy. Using a (pre 
>>> R7) Configurator to configure the component. For some reason, the Component 
>>> gets activated, deactivated, then activated again, which is not desirable.
>>> 
>>> Questions:
>>> 
>>> 1. How can I figure out why this is happening. I have tried many 
>>> approaches, but can’t seem to get a clue as to why this is happening. Since 
>>> it generally doesn’t seem to happen for other configured components, I am 
>>> assuming that it is not a Configurator problem.
>>> 
>>> 2. Is there a way to prohibit this from happening?
>>> 
>>> 
>>> In the meantime, I will make the dependent services more dynamic so they 
>>> are not thrown off by this change, but their behavior is actually correct: 
>>> the expectation is that the configured service should only get instantiated 
>>> once, so a static @Reference is correct.
>>> 
>>> 
>>> Thanks!
>>> =David
>>> 
>>> 
>>> _______________________________________________
>>> OSGi Developer Mail List
>>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>
>>> https://mail.osgi.org/mailman/listinfo/osgi-dev 
>>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>>> 
>>> _______________________________________________
>>> OSGi Developer Mail List
>>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>
>>> https://mail.osgi.org/mailman/listinfo/osgi-dev 
>>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>>>  
>>> _______________________________________________
>>> OSGi Developer Mail List
>>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>
>>> https://mail.osgi.org/mailman/listinfo/osgi-dev 
>>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org <mailto: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