[
https://issues.apache.org/jira/browse/FELIX-6812?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18040292#comment-18040292
]
Felix Marx commented on FELIX-6812:
-----------------------------------
I created [https://github.com/apache/felix-dev/pull/458] to track a potential
solution that uses *listConfigurations()* instead of {*}getConfiguration(){*}.
In our test environment. This solution solves the dangling configurations.
> FileInstall re-creates deleted ConfigAdmin configurations when processing
> stale CM_UPDATED events
> -------------------------------------------------------------------------------------------------
>
> Key: FELIX-6812
> URL: https://issues.apache.org/jira/browse/FELIX-6812
> Project: Felix
> Issue Type: Bug
> Components: Configuration Admin, File Install
> Affects Versions: fileinstall-3.7.4, configadmin-1.9.26
> Reporter: Felix Marx
> Priority: Major
>
> When an in-memory configuration (no {{{}felix.fileinstall.filename{}}}) is
> deleted via {{{}Configuration.delete(){}}}, and a stale {{CM_UPDATED}} event
> for the same PID is later delivered to {{{}ConfigInstaller{}}}, FileInstall
> calls {{ConfigurationAdmin.getConfiguration(pid, "?")}} in the {{CM_UPDATED}}
> handler. Since the configuration had been deleted, ConfigAdmin recreates a
> new empty configuration, effectively resurrecting it with no properties.
> FileInstall then ignores the event (no {{{}felix.fileinstall.filename{}}}),
> but the configuration remains in ConfigAdmin’s cache.
> This means FileInstall can recreate deleted configurations which it does not
> own and which are not backed by any file.
> Attached you will find 2 stacktraces that we have in our code:
> Initial deletion (still part of the original CM_UPDATED)
> {code:java}
> Breakpoint reached at
> org.apache.felix.cm.impl.ConfigurationManager.fireConfigurationEvent(ConfigurationManager.java:667)
> at
> org.apache.felix.cm.impl.ConfigurationManager.deleted(ConfigurationManager.java:598)
> at
> org.apache.felix.cm.impl.ConfigurationImpl.delete(ConfigurationImpl.java:276)
> at
> org.apache.felix.cm.impl.ConfigurationAdapter.delete(ConfigurationAdapter.java:184)
> at
> com.instana.agent.main.impl.ConfigurationServiceImpl.deleteAndRemoveFromInventory(ConfigurationServiceImpl.java:306)
> at
> com.instana.agent.main.impl.ConfigurationServiceImpl.deleteAndRemoveFromInventoryBecauseProcessDied(ConfigurationServiceImpl.java:289)
> at
> com.instana.agent.main.impl.ConfigurationServiceImpl.deleteProcessDependentConfiguration(ConfigurationServiceImpl.java:164)
> at
> com.instana.agent.process.handling.sensor.SensorUtilImpl.remove(SensorUtilImpl.java:288)
> at com.instana.agent.process.sensor.Process.getStats(Process.java:358)
> at
> com.instana.agent.process.sensor.Process$$Lambda$901.1176822721.run(Unknown
> Source:-1) at
> com.instana.agent.api.ObservableRunnable.run(ObservableRunnable.java:65)
> at
> com.instana.agent.util.ErrorLoggingRunnable.run(ErrorLoggingRunnable.java:33)
> at
> com.instana.agent.task.orchestrator.api.ExecutionPipeline.execute(ExecutionPipeline.java:247)
> at
> com.instana.agent.task.orchestrator.api.ExecutionPipeline.lambda$wrapWithErrorLogging$5(ExecutionPipeline.java:357)
> at
> com.instana.agent.task.orchestrator.api.ExecutionPipeline$$Lambda$500.1618304857.run(Unknown
> Source:-1) at
> com.instana.agent.util.ErrorLoggingRunnable.run(ErrorLoggingRunnable.java:33)
> at
> com.instana.agent.task.orchestrator.impl.ScheduledFutureCallbackTask.run(ScheduledFutureCallbackTask.java:66)
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
> at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305) at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
> at
> com.instana.agent.task.orchestrator.impl.CallbackDecoratedRunnableScheduledFuture.run(CallbackDecoratedRunnableScheduledFuture.java:53)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> at
> io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
> at java.lang.Thread.run(Thread.java:829)
> # Content of the event
> 2 - CM event Fire ConfigurationEvent:
> pid=com.instana.agent.memcached.sensor.Memcached.8ba1c3ef-5823-4d51-9ba5-53bbceaed49c
> {code}
> Re-creation of the configuration:
> {code:java}
> Breakpoint reached at
> org.apache.felix.cm.impl.ConfigurationManager.cacheConfiguration(ConfigurationManager.java:328)
> at
> org.apache.felix.cm.impl.ConfigurationManager.createConfiguration(ConfigurationManager.java:516)
> at
> org.apache.felix.cm.impl.ConfigurationAdminImpl.getConfiguration(ConfigurationAdminImpl.java:167)
> at
> org.apache.felix.fileinstall.internal.ConfigInstaller.doConfigurationEvent(ConfigInstaller.java:240)
> at
> org.apache.felix.fileinstall.internal.ConfigInstaller.configurationEvent(ConfigInstaller.java:222)
> at
> org.apache.felix.cm.impl.ConfigurationManager$FireConfigurationEvent.sendEvent(ConfigurationManager.java:1721)
> at
> org.apache.felix.cm.impl.ConfigurationManager$FireConfigurationEvent.run(ConfigurationManager.java:1662)
> at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:122)
> at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:84) at
> java.lang.Thread.run(Thread.java:829)configurations.size: 45
> # content of the event
> Addition of
> com.instana.agent.memcached.sensor.Memcached.8ba1c3ef-5823-4d51-9ba5-53bbceaed49c{code}
>
> We use Karaf 4.2.16, with a self compiled version of felix fileinstall 3.7.5.
> The issue is still present in the latest version.
> We also know that by allowing to call *delete* within the *activate* method
> of our components, we can trigger this issue with a higher percentage.
> Nevertheless fileinstall should not be able to create a configuration in
> configadmin when checking if a config should be written back.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)