Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -489,7 +489,10 @@ else if (state == QueryState.CLOSING)
.append(", state=").append(state)
.append(", schema=").append(ctx.schemaName())
.append(", initiatorId=").append(initiatorId)
.append(", sql='").append(sql);
.append(", sql='").append(sql).append('\'');

if (QueryUtils.INCLUDE_SENSITIVE && params != null && params.length != 0)
msgSb.append(", params=").append(S.arrayToString(params));

msgSb.append(']');

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1040,6 +1040,39 @@ public void testSqlFieldsQueryWithInitiatorId() throws Exception {
assertTrue(logLsnr.check(1000));
}

/** Checks that query parameters are printed in the long query warning only when sensitive data is allowed. */
@Test
public void testLongQueryParametersInLog() throws Exception {
IgniteCache<Long, Long> cache = prepareTestCache(grid(0));

long arg = LONG_QRY_TIMEOUT + 1;

boolean includeSensitive = QueryUtils.INCLUDE_SENSITIVE;

try {
for (boolean incl : new boolean[] {true, false}) {
QueryUtils.INCLUDE_SENSITIVE = incl;

LogListener paramsLsnr = LogListener.matches(LONG_QUERY_FINISHED_MSG)
.andMatches("params=[" + arg + "]").build();

LogListener finishedLsnr = LogListener.matches(LONG_QUERY_FINISHED_MSG).build();

log.registerListener(paramsLsnr);
log.registerListener(finishedLsnr);

cache.query(new SqlFieldsQuery("SELECT sleep(?)").setArgs(arg))
.getAll();

assertTrue(finishedLsnr.check(1000));
assertEquals(incl, paramsLsnr.check());
}
}
finally {
QueryUtils.INCLUDE_SENSITIVE = includeSensitive;
}
}

/**
* Verifies that query total execution time is correctly accumulated in the DURATION_TOTAL field of the
* SQL_QUERIES_HISTORY system view.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser;
import org.apache.ignite.internal.processors.query.running.RunningQueryManager;
import org.apache.ignite.internal.processors.query.running.TrackableQuery;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.h2.command.Prepared;
import org.h2.engine.Session;
Expand Down Expand Up @@ -76,6 +77,9 @@ public class H2QueryInfo implements TrackableQuery {
/** Query initiator ID. */
private final String initiatorId;

/** Query parameters. */
private final Object[] params;

/** Query SQL plan. */
private volatile String plan;

Expand All @@ -86,8 +90,17 @@ public class H2QueryInfo implements TrackableQuery {
* @param nodeId Originator node id.
* @param qryId Query id.
* @param initiatorId Query initiator id.
* @param params Query parameters.
*/
public H2QueryInfo(QueryType type, PreparedStatement stmt, String sql, UUID nodeId, long qryId, String initiatorId) {
public H2QueryInfo(
QueryType type,
PreparedStatement stmt,
String sql,
UUID nodeId,
long qryId,
String initiatorId,
@Nullable Object[] params
) {
try {
assert stmt != null;

Expand All @@ -96,6 +109,7 @@ public H2QueryInfo(QueryType type, PreparedStatement stmt, String sql, UUID node
this.nodeId = nodeId;
this.qryId = qryId;
this.initiatorId = initiatorId;
this.params = params;

beginTs = U.currentTimeMillis();

Expand Down Expand Up @@ -210,8 +224,12 @@ public synchronized void resumeTracking() {
.append(", enforceJoinOrder=").append(enforceJoinOrder)
.append(", schema=").append(schema)
.append(", initiatorId=").append(initiatorId)
.append(", sql='").append(sql)
.append("', plan=").append(plan());
.append(", sql='").append(sql).append("'");

if (QueryUtils.INCLUDE_SENSITIVE && params != null && params.length != 0)
msgSb.append(", params=").append(S.arrayToString(params));

msgSb.append(", plan=").append(plan());

printInfo(msgSb);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,7 @@ private GridQueryFieldsResult executeSelectLocal(
H2Utils.bindParameters(stmt, F.asList(params));

qryInfo = new H2QueryInfo(H2QueryInfo.QueryType.LOCAL, stmt, qry,
ctx.localNodeId(), qryId, qryDesc.queryInitiatorId());
ctx.localNodeId(), qryId, qryDesc.queryInitiatorId(), params);

heavyQryTracker.startTracking(qryInfo);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import java.sql.PreparedStatement;
import java.util.UUID;
import org.jetbrains.annotations.Nullable;

/**
* Map query info.
Expand All @@ -40,6 +41,7 @@ public class MapH2QueryInfo extends H2QueryInfo {
* @param qryId Query id.
* @param locQryId Local query id.
* @param initiatorId Query initiator id.
* @param params Query parameters.
* @param reqId Request ID.
* @param segment Segment.
*/
Expand All @@ -50,10 +52,11 @@ public MapH2QueryInfo(
long qryId,
long locQryId,
String initiatorId,
@Nullable Object[] params,
long reqId,
int segment
) {
super(QueryType.MAP, stmt, sql, nodeId, qryId, initiatorId);
super(QueryType.MAP, stmt, sql, nodeId, qryId, initiatorId, params);

this.locQryId = locQryId;
this.reqId = reqId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import java.sql.PreparedStatement;
import java.util.UUID;
import org.jetbrains.annotations.Nullable;

/**
* Reduce query info.
Expand All @@ -33,10 +34,19 @@ public class ReduceH2QueryInfo extends H2QueryInfo {
* @param nodeId Originator node id.
* @param qryId Query id.
* @param initiatorId Query initiator id.
* @param params Query parameters.
* @param reqId Request ID.
*/
public ReduceH2QueryInfo(PreparedStatement stmt, String sql, UUID nodeId, long qryId, String initiatorId, long reqId) {
super(QueryType.REDUCE, stmt, sql, nodeId, qryId, initiatorId);
public ReduceH2QueryInfo(
PreparedStatement stmt,
String sql,
UUID nodeId,
long qryId,
String initiatorId,
@Nullable Object[] params,
long reqId
) {
super(QueryType.REDUCE, stmt, sql, nodeId, qryId, initiatorId, params);

this.reqId = reqId;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -441,13 +441,13 @@ private void onQueryRequest0(
// Ensure we are on the target node for this replicated query.
if (qry.node() == null || (segmentId == 0 && qry.node().equals(ctx.localNodeId()))) {
String sql = qry.query();
Collection<Object> params0 = F.asList(qry.parameters(params));
Object[] params0 = qry.parameters(params);

PreparedStatement stmt = conn.prepareStatement(sql, H2StatementCache.queryFlags(
distributedJoins,
enforceJoinOrder));

H2Utils.bindParameters(stmt, params0);
H2Utils.bindParameters(stmt, F.asList(params0));

GridQueryCancel qryCancel = qryResults.queryCancel(qryIdx);

Expand All @@ -468,6 +468,7 @@ private void onQueryRequest0(
qryId,
runningQryId,
qryInitiatorId,
params0,
reqId,
segmentId
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ else if (QueryUtils.wasCancelled(err))
H2Utils.bindParameters(stmt, F.asList(rdc.parameters(params)));

qryInfo = new ReduceH2QueryInfo(stmt, qry.originalSql(),
ctx.localNodeId(), qryId, qryInitiatorId, qryReqId);
ctx.localNodeId(), qryId, qryInitiatorId, params, qryReqId);

h2.heavyQueriesTracker().startTracking(qryInfo);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,32 @@ public void testQueryInitiatorId() {
LONG_QUERY_WARNING_TIMEOUT + 1);
}

/**
* Verifies query parameters in logs.
*/
@Test
@MultiNodeTest
public void testQueryParameters() throws InterruptedException {
ListeningTestLogger testLog = testLog();

boolean includeSensitive = QueryUtils.INCLUDE_SENSITIVE;

try {
for (boolean incl : new boolean[] {true, false}) {
QueryUtils.INCLUDE_SENSITIVE = incl;

checkParameters(testLog, "LOCAL", "SELECT sleep_func(?, 0)", incl);

checkParameters(testLog, "MAP", "SELECT val FROM test WHERE id = sleep_func(?, 0)", incl);

checkParameters(testLog, "REDUCE", "SELECT sleep_func(?, sum(val)) FROM test WHERE id + 1 = 1", incl);
}
}
finally {
QueryUtils.INCLUDE_SENSITIVE = includeSensitive;
}
}

/** Verifies map query information in long-query logs. */
@Test
@MultiNodeTest
Expand Down Expand Up @@ -546,6 +572,29 @@ private void checkInitiatorId(ListeningTestLogger log, String type, String sql,
assertTrue(lsnr.check());
}

/** */
private void checkParameters(
ListeningTestLogger log,
String type,
String sql,
boolean includeSensitive
) throws InterruptedException {
int arg = LONG_QUERY_WARNING_TIMEOUT + 1;

LogListener paramsLsnr = LogListener.matches(LONG_QUERY_FINISHED_MSG).andMatches("type=" + type)
.andMatches("params=[" + arg + "]").build();

LogListener finishedLsnr = LogListener.matches(LONG_QUERY_FINISHED_MSG).andMatches("type=" + type).build();

log.registerListener(paramsLsnr);
log.registerListener(finishedLsnr);

ignite.cache("test").query(new SqlFieldsQuery(sql).setArgs(arg)).getAll();

assertTrue(finishedLsnr.check(1000));
assertEquals(includeSensitive, paramsLsnr.check());
}

/**
* Do several fast queries.
* Log messages must not contain info about long query.
Expand Down
Loading