Skip to content

Commit 1e41028

Browse files
committed
[FELIX-6066] Prevent duplicate activation of ConfigurationManager
1 parent 207a63c commit 1e41028

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

configadmin/src/main/java/org/apache/felix/cm/impl/persistence/PersistenceManagerTracker.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,10 @@ public void run()
175175
{
176176
deactivate();
177177
}
178-
activate(holder.getPersistenceManager());
178+
if (!holder.isActivated()) {
179+
activate(holder.getPersistenceManager());
180+
holder.activate();
181+
}
179182
}
180183
});
181184
}
@@ -197,7 +200,7 @@ public void modifiedService(final ServiceReference<PersistenceManager> reference
197200
this.holders.remove(holder);
198201
this.holders.add(new Holder(reference, holder.getPersistenceManager()));
199202
Collections.sort(this.holders);
200-
if ( holders.get(0) == holder && oldHolder.compareTo(holder) != 0 )
203+
if ( holders.get(0) == holder && oldHolder != null && oldHolder.compareTo(holder) != 0 )
201204
{
202205
this.workerQueue.enqueue(new Runnable()
203206
{
@@ -206,7 +209,10 @@ public void modifiedService(final ServiceReference<PersistenceManager> reference
206209
public void run()
207210
{
208211
deactivate();
209-
activate(holder.getPersistenceManager());
212+
if (!holder.isActivated()) {
213+
activate(holder.getPersistenceManager());
214+
holder.activate();
215+
}
210216
}
211217
});
212218
}
@@ -234,7 +240,11 @@ public void run()
234240
deactivate();
235241
if ( !holders.isEmpty() )
236242
{
237-
activate(holders.get(0).getPersistenceManager());
243+
Holder h = holders.get(0);
244+
if (!h.isActivated()) {
245+
activate(h.getPersistenceManager());
246+
h.activate();
247+
}
238248
}
239249
}
240250
});
@@ -248,6 +258,9 @@ public static final class Holder implements Comparable<Holder>
248258

249259
private final ExtPersistenceManager manager;
250260

261+
// no need to synchronize, as it's changed only in WorkQueue tasks
262+
private boolean activated;
263+
251264
public Holder(final ServiceReference<PersistenceManager> ref, final ExtPersistenceManager epm)
252265
{
253266
this.reference = ref;
@@ -266,6 +279,14 @@ public int compareTo(final Holder o)
266279
return -reference.compareTo(o.reference);
267280
}
268281

282+
public boolean isActivated() {
283+
return activated;
284+
}
285+
286+
public void activate() {
287+
this.activated = true;
288+
}
289+
269290
@Override
270291
public int hashCode()
271292
{

0 commit comments

Comments
 (0)