diff --git a/bin/cassandra.bat b/bin/cassandra.bat index 02f96777e7..a16bf1a280 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -54,7 +54,7 @@ if NOT DEFINED JAVA_HOME goto :err REM ----------------------------------------------------------------------------- REM JVM Opts we'll use in legacy run or installation set JAVA_OPTS=-ea^ - -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.2.8.jar"^ + -javaagent:"%CASSANDRA_HOME%\lib\jamm-0.3.0.jar"^ -Xms2G^ -Xmx2G^ -XX:+HeapDumpOnOutOfMemoryError^ diff --git a/bin/cassandra.in.sh b/bin/cassandra.in.sh index b4ed9b60b9..6b0581d797 100644 --- a/bin/cassandra.in.sh +++ b/bin/cassandra.in.sh @@ -48,7 +48,7 @@ done if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ || [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ] then - JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.8.jar" + JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" fi # Added sigar-bin to the java.library.path CASSANDRA-7838 diff --git a/build.xml b/build.xml index c7aa83e324..e5c5c834f5 100644 --- a/build.xml +++ b/build.xml @@ -336,7 +336,7 @@ - + @@ -686,7 +686,7 @@ - + @@ -1113,7 +1113,7 @@ - + @@ -1286,7 +1286,7 @@ - + @@ -1329,7 +1329,7 @@ - + diff --git a/conf/cassandra-env.ps1 b/conf/cassandra-env.ps1 index 685a86f60f..8793cf4e40 100644 --- a/conf/cassandra-env.ps1 +++ b/conf/cassandra-env.ps1 @@ -304,7 +304,7 @@ Function SetCassandraEnvironment if (($env:JVM_VENDOR -ne "OpenJDK") -or ($env:JVM_VERSION.CompareTo("1.6.0") -eq 1) -or (($env:JVM_VERSION -eq "1.6.0") -and ($env:JVM_PATCH_VERSION.CompareTo("22") -eq 1))) { - $env:JVM_OPTS = "$env:JVM_OPTS -javaagent:""$env:CASSANDRA_HOME\lib\jamm-0.2.8.jar""" + $env:JVM_OPTS = "$env:JVM_OPTS -javaagent:""$env:CASSANDRA_HOME\lib\jamm-0.3.0.jar""" } # enable assertions. disabling this in production will give a modest diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index a7acb15e06..5a0b5e8816 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -173,7 +173,7 @@ JMX_PORT="7199" JVM_OPTS="$JVM_OPTS -ea" # add the jamm javaagent -JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.8.jar" +JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" # some JVMs will fill up their heap when accessed via JMX, see CASSANDRA-6541 JVM_OPTS="$JVM_OPTS -XX:+CMSClassUnloadingEnabled" diff --git a/debian/cassandra.in.sh b/debian/cassandra.in.sh index bf76cf710a..9f69ac9490 100644 --- a/debian/cassandra.in.sh +++ b/debian/cassandra.in.sh @@ -26,5 +26,5 @@ CLASSPATH="$CLASSPATH:$EXTRA_CLASSPATH" if [ "$JVM_VENDOR" != "OpenJDK" -o "$JVM_VERSION" \> "1.6.0" ] \ || [ "$JVM_VERSION" = "1.6.0" -a "$JVM_PATCH_VERSION" -ge 23 ] then - JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.2.8.jar" + JAVA_AGENT="$JAVA_AGENT -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar" fi diff --git a/lib/jamm-0.2.8.jar b/lib/jamm-0.2.8.jar deleted file mode 100644 index e1cb6690ac..0000000000 Binary files a/lib/jamm-0.2.8.jar and /dev/null differ diff --git a/lib/jamm-0.3.0.jar b/lib/jamm-0.3.0.jar new file mode 100644 index 0000000000..782f00ca0c Binary files /dev/null and b/lib/jamm-0.3.0.jar differ diff --git a/lib/licenses/jamm-0.2.8.txt b/lib/licenses/jamm-0.3.0.txt similarity index 100% rename from lib/licenses/jamm-0.2.8.txt rename to lib/licenses/jamm-0.3.0.txt diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index 23c1b8b639..eb78ec7bd2 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -53,10 +53,15 @@ import org.apache.cassandra.io.util.FileDataInput; import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.UUIDGen; +import org.github.jamm.Unmetered; import static org.apache.cassandra.utils.FBUtilities.fromJsonMap; import static org.apache.cassandra.utils.FBUtilities.json; +/** + * This class can be tricky to modify. Please read http://wiki.apache.org/cassandra/ConfigurationNotes for how to do so safely. + */ +@Unmetered public final class CFMetaData { private static final Logger logger = LoggerFactory.getLogger(CFMetaData.class); diff --git a/src/java/org/apache/cassandra/cql3/MeasurableForPreparedCache.java b/src/java/org/apache/cassandra/cql3/MeasurableForPreparedCache.java deleted file mode 100644 index 6b3b4b5549..0000000000 --- a/src/java/org/apache/cassandra/cql3/MeasurableForPreparedCache.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cassandra.cql3; - -import org.github.jamm.MemoryMeter; - -public interface MeasurableForPreparedCache -{ - public long measureForPreparedCache(MemoryMeter meter); -} diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java index 1b45ca297c..82b354e605 100644 --- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java +++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java @@ -18,7 +18,10 @@ package org.apache.cassandra.cql3; import java.nio.ByteBuffer; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -28,19 +31,28 @@ import com.googlecode.concurrentlinkedhashmap.EntryWeigher; import com.googlecode.concurrentlinkedhashmap.EvictionListener; import org.antlr.runtime.*; -import org.github.jamm.MemoryMeter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.concurrent.ScheduledExecutors; import org.apache.cassandra.cql3.functions.*; + import org.apache.cassandra.cql3.statements.*; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.*; +import org.apache.cassandra.db.composites.CType; +import org.apache.cassandra.db.composites.CellName; +import org.apache.cassandra.db.composites.CellNameType; +import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.marshal.AbstractType; -import org.apache.cassandra.exceptions.*; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.apache.cassandra.exceptions.RequestExecutionException; +import org.apache.cassandra.exceptions.RequestValidationException; +import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.metrics.CQLMetrics; -import org.apache.cassandra.service.*; +import org.apache.cassandra.service.ClientState; +import org.apache.cassandra.service.IMigrationListener; +import org.apache.cassandra.service.MigrationManager; +import org.apache.cassandra.service.QueryState; import org.apache.cassandra.service.pager.QueryPager; import org.apache.cassandra.service.pager.QueryPagers; import org.apache.cassandra.thrift.ThriftClientState; @@ -49,6 +61,7 @@ import org.apache.cassandra.transport.messages.ResultMessage; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.MD5Digest; import org.apache.cassandra.utils.SemanticVersion; +import org.github.jamm.MemoryMeter; public class QueryProcessor implements QueryHandler { @@ -543,9 +556,7 @@ public class QueryProcessor implements QueryHandler private static long measure(Object key) { - return key instanceof MeasurableForPreparedCache - ? ((MeasurableForPreparedCache)key).measureForPreparedCache(meter) - : meter.measureDeep(key); + return meter.measureDeep(key); } private static class MigrationSubscriber implements IMigrationListener diff --git a/src/java/org/apache/cassandra/cql3/functions/Function.java b/src/java/org/apache/cassandra/cql3/functions/Function.java index cba9fcfe55..9e41fe4325 100644 --- a/src/java/org/apache/cassandra/cql3/functions/Function.java +++ b/src/java/org/apache/cassandra/cql3/functions/Function.java @@ -21,6 +21,10 @@ import java.util.List; import org.apache.cassandra.db.marshal.AbstractType; +import org.apache.cassandra.exceptions.InvalidRequestException; +import org.github.jamm.Unmetered; + +@Unmetered public interface Function { public FunctionName name(); diff --git a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java index 2db00df8da..a0aff3fee2 100644 --- a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java @@ -23,8 +23,9 @@ import java.util.*; import com.google.common.base.Function; import com.google.common.collect.*; import org.apache.cassandra.config.DatabaseDescriptor; + import org.apache.cassandra.tracing.Tracing; -import org.github.jamm.MemoryMeter; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +43,7 @@ import org.apache.cassandra.transport.messages.ResultMessage; * A BATCH statement parsed from a CQL query. * */ -public class BatchStatement implements CQLStatement, MeasurableForPreparedCache +public class BatchStatement implements CQLStatement { public static enum Type { @@ -87,17 +88,6 @@ public class BatchStatement implements CQLStatement, MeasurableForPreparedCache return false; } - public long measureForPreparedCache(MemoryMeter meter) - { - long size = meter.measure(this) - + meter.measureDeep(type) - + meter.measure(statements) - + meter.measureDeep(attrs); - for (ModificationStatement stmt : statements) - size += stmt.measureForPreparedCache(meter); - return size; - } - public int getBoundTerms() { return boundTerms; diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index ade97a03fd..2607e121b3 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -22,7 +22,6 @@ import java.util.*; import com.google.common.base.Function; import com.google.common.collect.Iterables; -import org.github.jamm.MemoryMeter; import org.apache.cassandra.auth.Permission; import org.apache.cassandra.config.CFMetaData; @@ -46,7 +45,7 @@ import org.apache.cassandra.utils.Pair; /* * Abstract parent class of individual modifications, i.e. INSERT, UPDATE and DELETE. */ -public abstract class ModificationStatement implements CQLStatement, MeasurableForPreparedCache +public abstract class ModificationStatement implements CQLStatement { private static final ColumnIdentifier CAS_RESULT_COLUMN = new ColumnIdentifier("[applied]", false); @@ -106,16 +105,6 @@ public abstract class ModificationStatement implements CQLStatement, MeasurableF return false; } - public long measureForPreparedCache(MemoryMeter meter) - { - return meter.measure(this) - + meter.measureDeep(attrs) - + meter.measureDeep(processedKeys) - + meter.measureDeep(columnOperations) - + (columnConditions == null ? 0 : meter.measureDeep(columnConditions)) - + (staticConditions == null ? 0 : meter.measureDeep(staticConditions)); - } - public abstract boolean requireFullClusteringKey(); public abstract void addUpdateForKey(ColumnFamily updates, ByteBuffer key, Composite prefix, UpdateParameters params) throws InvalidRequestException; diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 9fb636ed9a..2d28b71586 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -27,8 +27,6 @@ import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; -import org.github.jamm.MemoryMeter; - import org.apache.cassandra.auth.Permission; import org.apache.cassandra.cql3.*; import org.apache.cassandra.cql3.statements.SingleColumnRestriction.Contains; @@ -62,7 +60,7 @@ import org.apache.cassandra.utils.FBUtilities; * column family, expression, result count, and ordering clause. * */ -public class SelectStatement implements CQLStatement, MeasurableForPreparedCache +public class SelectStatement implements CQLStatement { private static final int DEFAULT_COUNT_PAGE_SIZE = 10000; @@ -177,20 +175,6 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache return selection.getResultMetadata(); } - public long measureForPreparedCache(MemoryMeter meter) - { - return meter.measure(this) - + meter.measureDeep(parameters) - + meter.measureDeep(selection) - + (limit == null ? 0 : meter.measureDeep(limit)) - + meter.measureDeep(keyRestrictions) - + meter.measureDeep(columnRestrictions) - + meter.measureDeep(metadataRestrictions) - + meter.measureDeep(restrictedColumns) - + (sliceRestriction == null ? 0 : meter.measureDeep(sliceRestriction)) - + (orderingIndexes == null ? 0 : meter.measureDeep(orderingIndexes)); - } - public int getBoundTerms() { return boundTerms; diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java index 2aa1eea20b..85b6dc7cec 100644 --- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java +++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java @@ -28,6 +28,7 @@ import org.apache.cassandra.cql3.CQL3Type; import org.apache.cassandra.exceptions.SyntaxException; import org.apache.cassandra.serializers.TypeSerializer; import org.apache.cassandra.serializers.MarshalException; +import org.github.jamm.Unmetered; /** * Specifies a Comparator for a specific type of ByteBuffer. @@ -37,6 +38,7 @@ import org.apache.cassandra.serializers.MarshalException; * should always handle those values even if they normally do not * represent a valid ByteBuffer for the type being compared. */ +@Unmetered public abstract class AbstractType implements Comparator { public final Comparator reverseComparator;