Re: same configuration registered with multiple PIDs in ManagedServiceFactory
Awesome. Thanks everyone! Great writeup Grzegorz - clearly non-trivial and very subtle. Best, Jesse From: Grzegorz Grzybek Sent: Thursday, June 1, 2023 5:44 AM To: user@karaf.apache.org Subject: Re: same configuration registered with multiple PIDs in ManagedServiceFactory EXTERNAL EMAIL DON'T BE QUICK TO CLICK If you believe this email is suspicious, report via ‘Phish Alert Report’ button Hello I've added quite a long comment under https://issues.apache.org/jira/browse/KARAF-6074 showing my investigation. So this is actually NOT a race condition - feature configs with dash in name will ALWAYS create two configurations from the factory PID. And yes - reverting https://github.com/apache/karaf/commit/1221b0158d2494523cf94cc3f223bd552a2467c7 helps with duplicate PID, but actually gives you REAL race condition (happening intermittently) described at https://issues.apache.org/jira/browse/KARAF-7389. What actually is needed is: -if (pid.contains("~")) { -cid.name<http://cid.name> = pid.substring(n + 1); -} +cid.name<http://cid.name> = pid.substring(n + 1); which ensures that both Karaf and felix.fileinstall operate on the same PID (and not only factory PID). let me prepare a PR. regards Grzegorz Grzybek śr., 31 maj 2023 o 17:47 Grzegorz Grzybek mailto:gr.grzy...@gmail.com>> napisał(a): I personally didn't check with factory pids (dash in the name). I remember I spotted the problem when dealing with FeatureDeployer (deploy/ folder) for Fuse - https://issues.apache.org/jira/browse/KARAF-6074 (but not necessarily related to this config problem). Also from quick search of my history, https://issues.apache.org/jira/browse/KARAF-7389 was needed to prevent reading half-written file. More - tomorrow (CEST) ;) regards Grzegorz Grzybek śr., 31 maj 2023 o 17:25 Jean-Baptiste Onofré mailto:j...@nanthrax.net>> napisał(a): Good catch. I remember we investigated some race condition issues with Greg. Let me check if the name matches. Regards JB On Wed, May 31, 2023 at 4:45 PM Jesse White mailto:je...@opennms.com>> wrote: > > Good find Ben, and thanks Grzegorz. > > Reverting that commit does solve the problem, so it must be related. > > I also found that this change does the trick: > > diff --git > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > index 40bb666a34..fce2c1221c 100644 > --- > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > +++ > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > @@ -68,9 +68,7 @@ public class FeatureConfigInstaller { > if (n > 0) { > cid.isFactoryPid = true; > cid.factoryPid = pid.substring(0, n); > -if (pid.contains("~")) { > -cid.name<http://cid.name> = pid.substring(n + 1); > -} > +cid.name<http://cid.name> = pid.substring(n + 1); > } > return cid; > } > > I guess there's some mismatch about the "name" of the config, so it gets > treated as two distinct objects. > > Best, > Jesse > > From: Grzegorz Grzybek mailto:gr.grzy...@gmail.com>> > Sent: Wednesday, May 31, 2023 10:33 AM > To: user@karaf.apache.org<mailto:user@karaf.apache.org> > mailto:user@karaf.apache.org>> > Subject: Re: same configuration registered with multiple PIDs in > ManagedServiceFactory > > > EXTERNAL EMAIL DON'T BE QUICK TO CLICK > > If you believe this email is suspicious, report via ‘Phish Alert Report’ > button > > > Hello > > I remember adding some safety logic related to feature-embedded > configuration. Because you're using dash ("-") in the PID, you're actually > adding a factory PID. And there may be some hidden race condition here. > > Let me check this problem tomorrow. > > regards > Grzegorz Grzybek > > śr., 31 maj 2023 o 16:29 ran...@opennms.org<mailto:ran...@opennms.org> > mailto:ran...@opennms.org>> napisał(a): > > Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems relevant > is this change, maybe the issue with multiple threads writing the config at > the same time needs to be solved in a different way? > > > > My guess is this fixed the race condition by making it atomic, but it doesn’t > stop it from happening twice in quick s
Re: same configuration registered with multiple PIDs in ManagedServiceFactory
Hello I've added quite a long comment under https://issues.apache.org/jira/browse/KARAF-6074 showing my investigation. So this is actually NOT a race condition - feature configs with dash in name will ALWAYS create two configurations from the factory PID. And yes - reverting https://github.com/apache/karaf/commit/1221b0158d2494523cf94cc3f223bd552a2467c7 helps with duplicate PID, but actually gives you REAL race condition (happening intermittently) described at https://issues.apache.org/jira/browse/KARAF-7389. What actually is needed is: -if (pid.contains("~")) { -cid.name = pid.substring(n + 1); -} +cid.name = pid.substring(n + 1); which ensures that both Karaf and felix.fileinstall operate on the same PID (and not only factory PID). let me prepare a PR. regards Grzegorz Grzybek śr., 31 maj 2023 o 17:47 Grzegorz Grzybek napisał(a): > I personally didn't check with factory pids (dash in the name). > I remember I spotted the problem when dealing with FeatureDeployer > (deploy/ folder) for Fuse - > https://issues.apache.org/jira/browse/KARAF-6074 (but not necessarily > related to this config problem). > > Also from quick search of my history, > https://issues.apache.org/jira/browse/KARAF-7389 was needed to prevent > reading half-written file. > > More - tomorrow (CEST) ;) > > regards > Grzegorz Grzybek > > śr., 31 maj 2023 o 17:25 Jean-Baptiste Onofré > napisał(a): > >> Good catch. >> >> I remember we investigated some race condition issues with Greg. >> >> Let me check if the name matches. >> >> Regards >> JB >> >> On Wed, May 31, 2023 at 4:45 PM Jesse White wrote: >> > >> > Good find Ben, and thanks Grzegorz. >> > >> > Reverting that commit does solve the problem, so it must be related. >> > >> > I also found that this change does the trick: >> > >> > diff --git >> a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java >> b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java >> > index 40bb666a34..fce2c1221c 100644 >> > --- >> a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java >> > +++ >> b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java >> > @@ -68,9 +68,7 @@ public class FeatureConfigInstaller { >> > if (n > 0) { >> > cid.isFactoryPid = true; >> > cid.factoryPid = pid.substring(0, n); >> > -if (pid.contains("~")) { >> > -cid.name = pid.substring(n + 1); >> > -} >> > +cid.name = pid.substring(n + 1); >> > } >> > return cid; >> > } >> > >> > I guess there's some mismatch about the "name" of the config, so it >> gets treated as two distinct objects. >> > >> > Best, >> > Jesse >> > >> > From: Grzegorz Grzybek >> > Sent: Wednesday, May 31, 2023 10:33 AM >> > To: user@karaf.apache.org >> > Subject: Re: same configuration registered with multiple PIDs in >> ManagedServiceFactory >> > >> > >> > EXTERNAL EMAIL DON'T BE QUICK TO CLICK >> > >> > If you believe this email is suspicious, report via ‘Phish Alert >> Report’ button >> > >> > >> > Hello >> > >> > I remember adding some safety logic related to feature-embedded >> configuration. Because you're using dash ("-") in the PID, you're actually >> adding a factory PID. And there may be some hidden race condition here. >> > >> > Let me check this problem tomorrow. >> > >> > regards >> > Grzegorz Grzybek >> > >> > śr., 31 maj 2023 o 16:29 ran...@opennms.org >> napisał(a): >> > >> > Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems >> relevant is this change, maybe the issue with multiple threads writing the >> config at the same time needs to be solved in a different way? >> > >> > >> > >> > My guess is this fixed the race condition by making it atomic, but it >> doesn’t stop it from happening twice in quick succession. >> > >> > commit 1221b0158d2494523cf94cc3f223bd552a2467c7 >> > >> > Author: Grzegorz Grzybek gr.grzy.
Re: same configuration registered with multiple PIDs in ManagedServiceFactory
I personally didn't check with factory pids (dash in the name). I remember I spotted the problem when dealing with FeatureDeployer (deploy/ folder) for Fuse - https://issues.apache.org/jira/browse/KARAF-6074 (but not necessarily related to this config problem). Also from quick search of my history, https://issues.apache.org/jira/browse/KARAF-7389 was needed to prevent reading half-written file. More - tomorrow (CEST) ;) regards Grzegorz Grzybek śr., 31 maj 2023 o 17:25 Jean-Baptiste Onofré napisał(a): > Good catch. > > I remember we investigated some race condition issues with Greg. > > Let me check if the name matches. > > Regards > JB > > On Wed, May 31, 2023 at 4:45 PM Jesse White wrote: > > > > Good find Ben, and thanks Grzegorz. > > > > Reverting that commit does solve the problem, so it must be related. > > > > I also found that this change does the trick: > > > > diff --git > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > index 40bb666a34..fce2c1221c 100644 > > --- > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > +++ > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > @@ -68,9 +68,7 @@ public class FeatureConfigInstaller { > > if (n > 0) { > > cid.isFactoryPid = true; > > cid.factoryPid = pid.substring(0, n); > > -if (pid.contains("~")) { > > -cid.name = pid.substring(n + 1); > > -} > > +cid.name = pid.substring(n + 1); > > } > > return cid; > > } > > > > I guess there's some mismatch about the "name" of the config, so it gets > treated as two distinct objects. > > > > Best, > > Jesse > > > > From: Grzegorz Grzybek > > Sent: Wednesday, May 31, 2023 10:33 AM > > To: user@karaf.apache.org > > Subject: Re: same configuration registered with multiple PIDs in > ManagedServiceFactory > > > > > > EXTERNAL EMAIL DON'T BE QUICK TO CLICK > > > > If you believe this email is suspicious, report via ‘Phish Alert Report’ > button > > > > > > Hello > > > > I remember adding some safety logic related to feature-embedded > configuration. Because you're using dash ("-") in the PID, you're actually > adding a factory PID. And there may be some hidden race condition here. > > > > Let me check this problem tomorrow. > > > > regards > > Grzegorz Grzybek > > > > śr., 31 maj 2023 o 16:29 ran...@opennms.org > napisał(a): > > > > Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems > relevant is this change, maybe the issue with multiple threads writing the > config at the same time needs to be solved in a different way? > > > > > > > > My guess is this fixed the race condition by making it atomic, but it > doesn’t stop it from happening twice in quick succession. > > > > commit 1221b0158d2494523cf94cc3f223bd552a2467c7 > > > > Author: Grzegorz Grzybek gr.grzy...@gmail.com > > > > Date: Wed Feb 9 11:53:33 2022 +0100 > > > > > > > > [KARAF-7389] Prevent two threads (feature installer, CM Event > Dispatcher through fileinstall) writing the same config file > > > > > > > > (cherry picked from commit f3260d5ab641cdbf1bbd594875c07d974ed470a0) > > > > > > > > diff --git > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > > > index ba46eb3a2d..40bb666a34 100644 > > > > --- > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > > > +++ > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > > > @@ -139,2 +139,3 @@ public class FeatureConfigInstaller { > > > > properties.put(CONFIG_KEY, cid.pid); > > > > +cfg.update(cfgProps); > > > > if (storage != null && configCfgStore) { > > > > @@ -142,3 +143,2 @@ public class FeatureConfigInstaller { > &
Re: same configuration registered with multiple PIDs in ManagedServiceFactory
Good catch. I remember we investigated some race condition issues with Greg. Let me check if the name matches. Regards JB On Wed, May 31, 2023 at 4:45 PM Jesse White wrote: > > Good find Ben, and thanks Grzegorz. > > Reverting that commit does solve the problem, so it must be related. > > I also found that this change does the trick: > > diff --git > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > index 40bb666a34..fce2c1221c 100644 > --- > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > +++ > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > @@ -68,9 +68,7 @@ public class FeatureConfigInstaller { > if (n > 0) { > cid.isFactoryPid = true; > cid.factoryPid = pid.substring(0, n); > -if (pid.contains("~")) { > -cid.name = pid.substring(n + 1); > -} > +cid.name = pid.substring(n + 1); > } > return cid; > } > > I guess there's some mismatch about the "name" of the config, so it gets > treated as two distinct objects. > > Best, > Jesse > ____ > From: Grzegorz Grzybek > Sent: Wednesday, May 31, 2023 10:33 AM > To: user@karaf.apache.org > Subject: Re: same configuration registered with multiple PIDs in > ManagedServiceFactory > > > EXTERNAL EMAIL DON'T BE QUICK TO CLICK > > If you believe this email is suspicious, report via ‘Phish Alert Report’ > button > > > Hello > > I remember adding some safety logic related to feature-embedded > configuration. Because you're using dash ("-") in the PID, you're actually > adding a factory PID. And there may be some hidden race condition here. > > Let me check this problem tomorrow. > > regards > Grzegorz Grzybek > > śr., 31 maj 2023 o 16:29 ran...@opennms.org napisał(a): > > Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems relevant > is this change, maybe the issue with multiple threads writing the config at > the same time needs to be solved in a different way? > > > > My guess is this fixed the race condition by making it atomic, but it doesn’t > stop it from happening twice in quick succession. > > commit 1221b0158d2494523cf94cc3f223bd552a2467c7 > > Author: Grzegorz Grzybek gr.grzy...@gmail.com > > Date: Wed Feb 9 11:53:33 2022 +0100 > > > > [KARAF-7389] Prevent two threads (feature installer, CM Event Dispatcher > through fileinstall) writing the same config file > > > > (cherry picked from commit f3260d5ab641cdbf1bbd594875c07d974ed470a0) > > > > diff --git > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > index ba46eb3a2d..40bb666a34 100644 > > --- > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > +++ > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > @@ -139,2 +139,3 @@ public class FeatureConfigInstaller { > > properties.put(CONFIG_KEY, cid.pid); > > +cfg.update(cfgProps); > > if (storage != null && configCfgStore) { > > @@ -142,3 +143,2 @@ public class FeatureConfigInstaller { > > } > > -cfg.update(cfgProps); > > try { > > @@ -327,7 +327,9 @@ public class FeatureConfigInstaller { > > if (!cfgFile.exists()) { > > +File tmpCfgFile = File.createTempFile(cfgFile.getName(), > ".tmp", cfgFile.getParentFile()); > > if (jsonFormat) { > > -Configurations.buildWriter().build(new > FileWriter(cfgFile)).writeConfiguration(convertToDict(props)); > > + Configurations.buildWriter().build(new > FileWriter(tmpCfgFile)).writeConfiguration(convertToDict(props)); > > } else { > > -props.save(cfgFile); > > +props.save(tmpCfgFile); > > } > > +tmpCfgFile.renameTo(cfgFile); > > } else { > > > > From: Jesse White > Date: Tuesd
Re: same configuration registered with multiple PIDs in ManagedServiceFactory
Good find Ben, and thanks Grzegorz. Reverting that commit does solve the problem, so it must be related. I also found that this change does the trick: diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java index 40bb666a34..fce2c1221c 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java @@ -68,9 +68,7 @@ public class FeatureConfigInstaller { if (n > 0) { cid.isFactoryPid = true; cid.factoryPid = pid.substring(0, n); -if (pid.contains("~")) { -cid.name = pid.substring(n + 1); -} +cid.name = pid.substring(n + 1); } return cid; } I guess there's some mismatch about the "name" of the config, so it gets treated as two distinct objects. Best, Jesse From: Grzegorz Grzybek Sent: Wednesday, May 31, 2023 10:33 AM To: user@karaf.apache.org Subject: Re: same configuration registered with multiple PIDs in ManagedServiceFactory EXTERNAL EMAIL DON'T BE QUICK TO CLICK If you believe this email is suspicious, report via ‘Phish Alert Report’ button Hello I remember adding some safety logic related to feature-embedded configuration. Because you're using dash ("-") in the PID, you're actually adding a factory PID. And there may be some hidden race condition here. Let me check this problem tomorrow. regards Grzegorz Grzybek śr., 31 maj 2023 o 16:29 ran...@opennms.org<mailto:ran...@opennms.org> mailto:ran...@opennms.org>> napisał(a): Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems relevant is this change, maybe the issue with multiple threads writing the config at the same time needs to be solved in a different way? My guess is this fixed the race condition by making it atomic, but it doesn’t stop it from happening twice in quick succession. commit 1221b0158d2494523cf94cc3f223bd552a2467c7 Author: Grzegorz Grzybek gr.grzy...@gmail.com<mailto:gr.grzy...@gmail.com> Date: Wed Feb 9 11:53:33 2022 +0100 [KARAF-7389] Prevent two threads (feature installer, CM Event Dispatcher through fileinstall) writing the same config file (cherry picked from commit f3260d5ab641cdbf1bbd594875c07d974ed470a0) diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java index ba46eb3a2d..40bb666a34 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java @@ -139,2 +139,3 @@ public class FeatureConfigInstaller { properties.put(CONFIG_KEY, cid.pid); +cfg.update(cfgProps); if (storage != null && configCfgStore) { @@ -142,3 +143,2 @@ public class FeatureConfigInstaller { } -cfg.update(cfgProps); try { @@ -327,7 +327,9 @@ public class FeatureConfigInstaller { if (!cfgFile.exists()) { +File tmpCfgFile = File.createTempFile(cfgFile.getName(), ".tmp", cfgFile.getParentFile()); if (jsonFormat) { -Configurations.buildWriter().build(new FileWriter(cfgFile)).writeConfiguration(convertToDict(props)); +Configurations.buildWriter().build(new FileWriter(tmpCfgFile)).writeConfiguration(convertToDict(props)); } else { -props.save(cfgFile); +props.save(tmpCfgFile); } +tmpCfgFile.renameTo(cfgFile); } else { From: Jesse White mailto:je...@opennms.com>> Date: Tuesday, May 30, 2023 at 7:11 PM To: user@karaf.apache.org<mailto:user@karaf.apache.org> mailto:user@karaf.apache.org>> Subject: same configuration registered with multiple PIDs in ManagedServiceFactory Hey folks, I've encountered some odd behavior with Karaf 4.4.3, and I'd like to confirm if this is a bug or if there are some settings I can tune to alter the behavior. Here's how to reproduce: * Start Karaf 4.4.3 w/ JDK 11 * Install the managed factory example * feature:repo-add mvn:org.apache.karaf.examples/karaf-config-example-features/4.4.3/xml * feature:install karaf-config-example-managed-factory * Copy the attached 'config.xml' fi
Re: same configuration registered with multiple PIDs in ManagedServiceFactory
Hello I remember adding some safety logic related to feature-embedded configuration. Because you're using dash ("-") in the PID, you're actually adding a factory PID. And there may be some hidden race condition here. Let me check this problem tomorrow. regards Grzegorz Grzybek śr., 31 maj 2023 o 16:29 ran...@opennms.org napisał(a): > Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems > relevant is this change, maybe the issue with multiple threads writing the > config at the same time needs to be solved in a different way? > > > > My guess is this fixed the race condition by making it atomic, but it > doesn’t stop it from happening twice in quick succession. > > commit 1221b0158d2494523cf94cc3f223bd552a2467c7 > > Author: Grzegorz Grzybek gr.grzy...@gmail.com > > Date: Wed Feb 9 11:53:33 2022 +0100 > > > > [KARAF-7389] Prevent two threads (feature installer, CM Event > Dispatcher through fileinstall) writing the same config file > > > > (cherry picked from commit f3260d5ab641cdbf1bbd594875c07d974ed470a0) > > > > diff --git > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > index ba46eb3a2d..40bb666a34 100644 > > --- > a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > +++ > b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java > > @@ -139,2 +139,3 @@ public class FeatureConfigInstaller { > > properties.put(CONFIG_KEY, cid.pid); > > +cfg.update(cfgProps); > > if (storage != null && configCfgStore) { > > @@ -142,3 +143,2 @@ public class FeatureConfigInstaller { > > } > > -cfg.update(cfgProps); > > try { > > @@ -327,7 +327,9 @@ public class FeatureConfigInstaller { > > if (!cfgFile.exists()) { > > +File tmpCfgFile = File.createTempFile(cfgFile.getName(), > ".tmp", cfgFile.getParentFile()); > > if (jsonFormat) { > > -Configurations.buildWriter().build(new > FileWriter(cfgFile)).writeConfiguration(convertToDict(props)); > > +Configurations.buildWriter().build(new > FileWriter(tmpCfgFile)).writeConfiguration(convertToDict(props)); > > } else { > > -props.save(cfgFile); > > + props.save(tmpCfgFile); > > } > > +tmpCfgFile.renameTo(cfgFile); > > } else { > > > > *From: *Jesse White > *Date: *Tuesday, May 30, 2023 at 7:11 PM > *To: *user@karaf.apache.org > *Subject: *same configuration registered with multiple PIDs in > ManagedServiceFactory > > Hey folks, > > > > I've encountered some odd behavior with Karaf 4.4.3, and I'd like to > confirm if this is a bug or if there are some settings I can tune to alter > the behavior. > > > > Here's how to reproduce: > >- Start Karaf 4.4.3 w/ JDK 11 >- Install the managed factory example > > >- feature:repo-add > mvn:org.apache.karaf.examples/karaf-config-example-features/4.4.3/xml > > >- feature:install karaf-config-example-managed-factory > > >- Copy the attached 'config.xml' file to the 'deploy/' directory >- Wait about 5 seconds, and notice the following output to the console > > New configuration with pid > org.apache.karaf.example.config.04388423-2d46-4308-8214-3dcd1e0b8fd0 > > key1 = value1 > > key2 = value2 > > org.apache.karaf.features.configKey = org.apache.karaf.example.config-abc > > service.factoryPid = org.apache.karaf.example.config > > service.pid = > org.apache.karaf.example.config.04388423-2d46-4308-8214-3dcd1e0b8fd0 > > 18:42:02.131 INFO [features-3-thread-1] Done. > > 18:42:10.999 INFO > [fileinstall-/Users/jesse/labs/karaf/apache-karaf-4.4.3/etc] Creating > configuration {org.apache.karaf.example.config~abc} from > /Users/jesse/labs/karaf/apache-karaf-4.4.3/etc/org.apache.karaf.example.config-abc.cfg > > New configuration with pid org.apache.karaf.example.config~abc > > felix.fileinstall.filename = > file:/Users/jesse/labs/karaf/apache-karaf-4.4.3/etc/org.apache.karaf.example.config-abc.cfg > > key1 = value1 > > key2 = value2 > > org.apache.karaf.features.configKey = org.apache.karaf.example.config-abc > > service.factory
Re: same configuration registered with multiple PIDs in ManagedServiceFactory
Looking at a diff between 4.3.6 and 4.3.7, the only thing that seems relevant is this change, maybe the issue with multiple threads writing the config at the same time needs to be solved in a different way? My guess is this fixed the race condition by making it atomic, but it doesn’t stop it from happening twice in quick succession. commit 1221b0158d2494523cf94cc3f223bd552a2467c7 Author: Grzegorz Grzybek gr.grzy...@gmail.com<mailto:gr.grzy...@gmail.com> Date: Wed Feb 9 11:53:33 2022 +0100 [KARAF-7389] Prevent two threads (feature installer, CM Event Dispatcher through fileinstall) writing the same config file (cherry picked from commit f3260d5ab641cdbf1bbd594875c07d974ed470a0) diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java index ba46eb3a2d..40bb666a34 100644 --- a/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java +++ b/features/core/src/main/java/org/apache/karaf/features/internal/service/FeatureConfigInstaller.java @@ -139,2 +139,3 @@ public class FeatureConfigInstaller { properties.put(CONFIG_KEY, cid.pid); +cfg.update(cfgProps); if (storage != null && configCfgStore) { @@ -142,3 +143,2 @@ public class FeatureConfigInstaller { } -cfg.update(cfgProps); try { @@ -327,7 +327,9 @@ public class FeatureConfigInstaller { if (!cfgFile.exists()) { +File tmpCfgFile = File.createTempFile(cfgFile.getName(), ".tmp", cfgFile.getParentFile()); if (jsonFormat) { -Configurations.buildWriter().build(new FileWriter(cfgFile)).writeConfiguration(convertToDict(props)); +Configurations.buildWriter().build(new FileWriter(tmpCfgFile)).writeConfiguration(convertToDict(props)); } else { -props.save(cfgFile); +props.save(tmpCfgFile); } +tmpCfgFile.renameTo(cfgFile); } else { From: Jesse White Date: Tuesday, May 30, 2023 at 7:11 PM To: user@karaf.apache.org Subject: same configuration registered with multiple PIDs in ManagedServiceFactory Hey folks, I've encountered some odd behavior with Karaf 4.4.3, and I'd like to confirm if this is a bug or if there are some settings I can tune to alter the behavior. Here's how to reproduce: * Start Karaf 4.4.3 w/ JDK 11 * Install the managed factory example * feature:repo-add mvn:org.apache.karaf.examples/karaf-config-example-features/4.4.3/xml * feature:install karaf-config-example-managed-factory * Copy the attached 'config.xml' file to the 'deploy/' directory * Wait about 5 seconds, and notice the following output to the console New configuration with pid org.apache.karaf.example.config.04388423-2d46-4308-8214-3dcd1e0b8fd0 key1 = value1 key2 = value2 org.apache.karaf.features.configKey = org.apache.karaf.example.config-abc service.factoryPid = org.apache.karaf.example.config service.pid = org.apache.karaf.example.config.04388423-2d46-4308-8214-3dcd1e0b8fd0 18:42:02.131 INFO [features-3-thread-1] Done. 18:42:10.999 INFO [fileinstall-/Users/jesse/labs/karaf/apache-karaf-4.4.3/etc] Creating configuration {org.apache.karaf.example.config~abc} from /Users/jesse/labs/karaf/apache-karaf-4.4.3/etc/org.apache.karaf.example.config-abc.cfg New configuration with pid org.apache.karaf.example.config~abc felix.fileinstall.filename = file:/Users/jesse/labs/karaf/apache-karaf-4.4.3/etc/org.apache.karaf.example.config-abc.cfg key1 = value1 key2 = value2 org.apache.karaf.features.configKey = org.apache.karaf.example.config-abc service.factoryPid = org.apache.karaf.example.config service.pid = org.apache.karaf.example.config~abc Note that the single config results in multiple callbacks under two separate pids. This seems isolated to cases where the deploy/ folder is used to write the config, and doesn't happen when the configuration is manually placed in etc/. Following the same instructions with Karaf 4.3.6 has the expected behavior. Karaf 4.3.7 and later experience this issue though. Any ideas? Thanks, Jesse CONFIDENTIALITY NOTICE This e-mail message and any attachments are only for the use of the intended recipient and may contain information that is privileged, confidential or exempt from disclosure under applicable law. If you are not the intended recipient, any disclosure, distribution or other use of this e-mail message or attachments is prohibited. If you have received this e-mail message in error, please delete and notify the sender immediately. Thank you.
same configuration registered with multiple PIDs in ManagedServiceFactory
Hey folks, I've encountered some odd behavior with Karaf 4.4.3, and I'd like to confirm if this is a bug or if there are some settings I can tune to alter the behavior. Here's how to reproduce: * Start Karaf 4.4.3 w/ JDK 11 * Install the managed factory example * feature:repo-add mvn:org.apache.karaf.examples/karaf-config-example-features/4.4.3/xml * feature:install karaf-config-example-managed-factory * Copy the attached 'config.xml' file to the 'deploy/' directory * Wait about 5 seconds, and notice the following output to the console New configuration with pid org.apache.karaf.example.config.04388423-2d46-4308-8214-3dcd1e0b8fd0 key1 = value1 key2 = value2 org.apache.karaf.features.configKey = org.apache.karaf.example.config-abc service.factoryPid = org.apache.karaf.example.config service.pid = org.apache.karaf.example.config.04388423-2d46-4308-8214-3dcd1e0b8fd0 18:42:02.131 INFO [features-3-thread-1] Done. 18:42:10.999 INFO [fileinstall-/Users/jesse/labs/karaf/apache-karaf-4.4.3/etc] Creating configuration {org.apache.karaf.example.config~abc} from /Users/jesse/labs/karaf/apache-karaf-4.4.3/etc/org.apache.karaf.example.config-abc.cfg New configuration with pid org.apache.karaf.example.config~abc felix.fileinstall.filename = file:/Users/jesse/labs/karaf/apache-karaf-4.4.3/etc/org.apache.karaf.example.config-abc.cfg key1 = value1 key2 = value2 org.apache.karaf.features.configKey = org.apache.karaf.example.config-abc service.factoryPid = org.apache.karaf.example.config service.pid = org.apache.karaf.example.config~abc Note that the single config results in multiple callbacks under two separate pids. This seems isolated to cases where the deploy/ folder is used to write the config, and doesn't happen when the configuration is manually placed in etc/. Following the same instructions with Karaf 4.3.6 has the expected behavior. Karaf 4.3.7 and later experience this issue though. Any ideas? Thanks, Jesse CONFIDENTIALITY NOTICE This e-mail message and any attachments are only for the use of the intended recipient and may contain information that is privileged, confidential or exempt from disclosure under applicable law. If you are not the intended recipient, any disclosure, distribution or other use of this e-mail message or attachments is prohibited. If you have received this e-mail message in error, please delete and notify the sender immediately. Thank you. http://karaf.apache.org/xmlns/features/v1.6.0"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.6.0 http://karaf.apache.org/xmlns/features/v1.6.0";> key1=value1 key2=value2