UDF / UDA execution time in trace

patch by Christopher Batey; reviewed by Robert Stupp for CASSANDRA-9723
This commit is contained in:
Christopher Batey 2015-07-18 17:51:00 +02:00 committed by Robert Stupp
parent 506068b181
commit e651fdd5f6
4 changed files with 26 additions and 5 deletions

View File

@ -1,3 +1,6 @@
2.2.1
* UDF / UDA execution time in trace (CASSANDRA-9723)
2.2.0 2.2.0
* Fix cqlsh copy methods and other windows specific issues (CASSANDRA-9795) * Fix cqlsh copy methods and other windows specific issues (CASSANDRA-9795)
* Don't wrap byte arrays in SequentialWriter (CASSANDRA-9797) * Don't wrap byte arrays in SequentialWriter (CASSANDRA-9797)

View File

@ -1938,7 +1938,7 @@ User-defined aggregates can be used in "@SELECT@":#selectStmt statement.
A complete working example for user-defined aggregates (assuming that a keyspace has been selected using the "@USE@":#useStmt statement): A complete working example for user-defined aggregates (assuming that a keyspace has been selected using the "@USE@":#useStmt statement):
bc(sample).. bc(sample)..
CREATE FUNCTION averageState ( state tuple<int,bigint>, val int ) CREATE OR REPLACE FUNCTION averageState ( state tuple<int,bigint>, val int )
CALLED ON NULL INPUT CALLED ON NULL INPUT
RETURNS tuple<int,bigint> RETURNS tuple<int,bigint>
LANGUAGE java LANGUAGE java
@ -1950,7 +1950,7 @@ CREATE FUNCTION averageState ( state tuple<int,bigint>, val int )
return state; return state;
'; ';
CREATE FUNCTION averageFinal ( state tuple<int,bigint> ) CREATE OR REPLACE FUNCTION averageFinal ( state tuple<int,bigint> )
CALLED ON NULL INPUT CALLED ON NULL INPUT
RETURNS double RETURNS double
LANGUAGE java LANGUAGE java
@ -1962,7 +1962,7 @@ CREATE FUNCTION averageFinal ( state tuple<int,bigint> )
return Double.valueOf(r); return Double.valueOf(r);
'; ';
CREATE AGGREGATE average ( int ) CREATE OR REPLACE AGGREGATE average ( int )
SFUNC averageState SFUNC averageState
STYPE tuple<int,bigint> STYPE tuple<int,bigint>
FINALFUNC averageFinal FINALFUNC averageFinal

View File

@ -27,6 +27,7 @@ import org.slf4j.LoggerFactory;
import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.exceptions.InvalidRequestException;
import org.apache.cassandra.tracing.Tracing;
/** /**
* Base class for user-defined-aggregates. * Base class for user-defined-aggregates.
@ -142,6 +143,9 @@ public class UDAggregate extends AbstractFunction implements AggregateFunction
{ {
return new Aggregate() return new Aggregate()
{ {
private long stateFunctionCount;
private long stateFunctionDuration;
private ByteBuffer state; private ByteBuffer state;
{ {
reset(); reset();
@ -149,6 +153,8 @@ public class UDAggregate extends AbstractFunction implements AggregateFunction
public void addInput(int protocolVersion, List<ByteBuffer> values) throws InvalidRequestException public void addInput(int protocolVersion, List<ByteBuffer> values) throws InvalidRequestException
{ {
long startTime = System.nanoTime();
stateFunctionCount++;
List<ByteBuffer> fArgs = new ArrayList<>(values.size() + 1); List<ByteBuffer> fArgs = new ArrayList<>(values.size() + 1);
fArgs.add(state); fArgs.add(state);
fArgs.addAll(values); fArgs.addAll(values);
@ -162,19 +168,26 @@ public class UDAggregate extends AbstractFunction implements AggregateFunction
{ {
state = stateFunction.execute(protocolVersion, fArgs); state = stateFunction.execute(protocolVersion, fArgs);
} }
stateFunctionDuration += (System.nanoTime() - startTime) / 1000;
} }
public ByteBuffer compute(int protocolVersion) throws InvalidRequestException public ByteBuffer compute(int protocolVersion) throws InvalidRequestException
{ {
// final function is traced in UDFunction
Tracing.trace("Executed UDA {}: {} call(s) to state function {} in {}\u03bcs", name(), stateFunctionCount, stateFunction.name(), stateFunctionDuration);
if (finalFunction == null) if (finalFunction == null)
return state; return state;
List<ByteBuffer> fArgs = Collections.singletonList(state); List<ByteBuffer> fArgs = Collections.singletonList(state);
return finalFunction.execute(protocolVersion, fArgs); ByteBuffer result = finalFunction.execute(protocolVersion, fArgs);
return result;
} }
public void reset() public void reset()
{ {
state = initcond != null ? initcond.duplicate() : null; state = initcond != null ? initcond.duplicate() : null;
stateFunctionDuration = 0;
stateFunctionCount = 0;
} }
}; };
} }

View File

@ -34,6 +34,7 @@ import org.apache.cassandra.cql3.*;
import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.exceptions.*; import org.apache.cassandra.exceptions.*;
import org.apache.cassandra.service.MigrationManager; import org.apache.cassandra.service.MigrationManager;
import org.apache.cassandra.tracing.Tracing;
import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.ByteBufferUtil;
/** /**
@ -140,7 +141,11 @@ public abstract class UDFunction extends AbstractFunction implements ScalarFunct
if (!isCallableWrtNullable(parameters)) if (!isCallableWrtNullable(parameters))
return null; return null;
return executeUserDefined(protocolVersion, parameters);
long tStart = System.nanoTime();
ByteBuffer result = executeUserDefined(protocolVersion, parameters);
Tracing.trace("Executed UDF {} in {}\u03bcs", name(), (System.nanoTime() - tStart) / 1000);
return result;
} }
public boolean isCallableWrtNullable(List<ByteBuffer> parameters) public boolean isCallableWrtNullable(List<ByteBuffer> parameters)