modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
| 12 ++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
New commits:
commit 9a09c435eeebc9d46271fafb8ff0b7be3c7a0c1e
Author: John Sanda <jsanda(a)redhat.com>
Date: Sun May 26 11:59:54 2013 -0400
handle race condition during raw data inserts
MeasurementDataManagerBean passes a callback to MetricsServer.addData(). That
callback is invoked once for each raw data object that is persisted and then
after all of the data has been persisted. The callback populates a list with
the inserted raw data, and that list is then used to update the alert
notification cache. I was seeing NPEs in AgentConditionCache.checkConditions
because the collection passed to it contained null elements. Through some
tedious debugging I beleive that this is a result of concurrent inserts to the
list in the aforementione callback. A lock is now used to serialize inserts in
that list.
diff --git
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
index a8457d1..77a8904 100644
---
a/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
+++
b/modules/enterprise/server/jar/src/main/java/org/rhq/enterprise/server/measurement/MeasurementDataManagerBean.java
@@ -33,6 +33,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeoutException;
+import java.util.concurrent.locks.ReentrantLock;
import javax.ejb.Asynchronous;
import javax.ejb.EJB;
@@ -230,7 +231,9 @@ public class MeasurementDataManagerBean implements
MeasurementDataManagerLocal,
MetricsServer metricsServer = sessionManagerBean.getMetricsServer();
metricsServer.addNumericData(data, new RawDataInsertedCallback() {
- private List<MeasurementData> insertedData = new
ArrayList<MeasurementData>();
+ private ReentrantLock lock = new ReentrantLock();
+
+ private List<MeasurementData> insertedData = new
ArrayList<MeasurementData>(data.size());
@Override
public void onFinish() {
@@ -240,7 +243,12 @@ public class MeasurementDataManagerBean implements
MeasurementDataManagerLocal,
@Override
public void onSuccess(MeasurementDataNumeric measurementDataNumeric) {
- insertedData.add(measurementDataNumeric);
+ try {
+ lock.lock();
+ insertedData.add(measurementDataNumeric);
+ } finally {
+ lock.unlock();
+ }
}
@Override
Show replies by date