You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by al...@apache.org on 2012/02/03 10:53:40 UTC
svn commit: r1240053 -
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/QueryStatImpl.java
Author: alexparvulescu
Date: Fri Feb 3 09:53:40 2012
New Revision: 1240053
URL: http://svn.apache.org/viewvc?rev=1240053&view=rev
Log:
JCR-3225 ConcurrentModificationException in QueryStatImpl
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/QueryStatImpl.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/QueryStatImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/QueryStatImpl.java?rev=1240053&r1=1240052&r2=1240053&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/QueryStatImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/stats/QueryStatImpl.java Fri Feb 3 09:53:40 2012
@@ -115,16 +115,19 @@ public class QueryStatImpl implements Qu
final QueryStatDtoImpl qs = new QueryStatDtoImpl(language, statement,
durationMs);
slowQueries.offer(qs);
- Iterator<QueryStatDtoImpl> iterator = popularQueries.iterator();
- while (iterator.hasNext()) {
- QueryStatDtoImpl qsdi = iterator.next();
- if (qsdi.equals(qs)) {
- qs.setOccurrenceCount(qsdi.getOccurrenceCount() + 1);
- iterator.remove();
- break;
+
+ synchronized (popularQueries) {
+ Iterator<QueryStatDtoImpl> iterator = popularQueries.iterator();
+ while (iterator.hasNext()) {
+ QueryStatDtoImpl qsdi = iterator.next();
+ if (qsdi.equals(qs)) {
+ qs.setOccurrenceCount(qsdi.getOccurrenceCount() + 1);
+ iterator.remove();
+ break;
+ }
}
+ popularQueries.offer(qs);
}
- popularQueries.offer(qs);
}
public void clearSlowQueriesQueue() {
@@ -142,11 +145,17 @@ public class QueryStatImpl implements Qu
}
public QueryStatDto[] getPopularQueries() {
- QueryStatDtoImpl[] top = popularQueries
- .toArray(new QueryStatDtoImpl[popularQueries.size()]);
+ QueryStatDtoImpl[] top = new QueryStatDtoImpl[0];
+ int size = 0;
+ int maxSize = 0;
+ synchronized (popularQueries) {
+ top = popularQueries.toArray(new QueryStatDtoImpl[popularQueries
+ .size()]);
+ size = popularQueries.size();
+ maxSize = popularQueries.getMaxSize();
+ }
Arrays.sort(top, Collections.reverseOrder(comparatorOccurrence));
- int retSize = Math.min(popularQueries.size(),
- popularQueries.getMaxSize() / POPULAR_QUEUE_MULTIPLIER);
+ int retSize = Math.min(size, maxSize / POPULAR_QUEUE_MULTIPLIER);
QueryStatDto[] retval = new QueryStatDto[retSize];
for (int i = 0; i < retSize; i++) {
top[i].setPosition(i + 1);