|
|
|
@ -44,6 +44,7 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend |
|
|
|
private final ExecutorService callbackExecutor; |
|
|
|
private final ScheduledExecutorService timeoutExecutor; |
|
|
|
private final int concurrencyLimit; |
|
|
|
private final int printQueriesFreq; |
|
|
|
private final boolean perTenantLimitsEnabled; |
|
|
|
private final String perTenantLimitsConfiguration; |
|
|
|
private final ConcurrentMap<TenantId, TbRateLimits> perTenantLimits = new ConcurrentHashMap<>(); |
|
|
|
@ -57,12 +58,14 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend |
|
|
|
protected final AtomicInteger totalExpired = new AtomicInteger(); |
|
|
|
protected final AtomicInteger totalRejected = new AtomicInteger(); |
|
|
|
protected final AtomicInteger totalRateLimited = new AtomicInteger(); |
|
|
|
protected final AtomicInteger printQueriesIdx = new AtomicInteger(); |
|
|
|
|
|
|
|
public AbstractBufferedRateExecutor(int queueLimit, int concurrencyLimit, long maxWaitTime, int dispatcherThreads, int callbackThreads, long pollMs, |
|
|
|
boolean perTenantLimitsEnabled, String perTenantLimitsConfiguration) { |
|
|
|
boolean perTenantLimitsEnabled, String perTenantLimitsConfiguration, int printQueriesFreq) { |
|
|
|
this.maxWaitTime = maxWaitTime; |
|
|
|
this.pollMs = pollMs; |
|
|
|
this.concurrencyLimit = concurrencyLimit; |
|
|
|
this.printQueriesFreq = printQueriesFreq; |
|
|
|
this.queue = new LinkedBlockingDeque<>(queueLimit); |
|
|
|
this.dispatcherExecutor = Executors.newFixedThreadPool(dispatcherThreads); |
|
|
|
this.callbackExecutor = Executors.newWorkStealingPool(callbackThreads); |
|
|
|
@ -131,6 +134,13 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend |
|
|
|
if (curLvl <= concurrencyLimit) { |
|
|
|
taskCtx = queue.take(); |
|
|
|
final AsyncTaskContext<T, V> finalTaskCtx = taskCtx; |
|
|
|
if (printQueriesFreq > 0) { |
|
|
|
if (printQueriesIdx.incrementAndGet() >= printQueriesFreq) { |
|
|
|
printQueriesIdx.set(0); |
|
|
|
String query = queryToString(finalTaskCtx); |
|
|
|
log.info("[{}] Cassandra query: {}", taskCtx.getId(), query); |
|
|
|
} |
|
|
|
} |
|
|
|
logTask("Processing", finalTaskCtx); |
|
|
|
concurrencyLevel.incrementAndGet(); |
|
|
|
long timeout = finalTaskCtx.getCreateTime() + maxWaitTime - System.currentTimeMillis(); |
|
|
|
@ -187,17 +197,8 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend |
|
|
|
private void logTask(String action, AsyncTaskContext<T, V> taskCtx) { |
|
|
|
if (log.isTraceEnabled()) { |
|
|
|
if (taskCtx.getTask() instanceof CassandraStatementTask) { |
|
|
|
CassandraStatementTask cassStmtTask = (CassandraStatementTask) taskCtx.getTask(); |
|
|
|
if (cassStmtTask.getStatement() instanceof BoundStatement) { |
|
|
|
BoundStatement stmt = (BoundStatement) cassStmtTask.getStatement(); |
|
|
|
String query = stmt.preparedStatement().getQueryString(); |
|
|
|
try { |
|
|
|
query = toStringWithValues(stmt, ProtocolVersion.V5); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("Can't convert to query with values", e); |
|
|
|
} |
|
|
|
log.trace("[{}] {} task: {}, BoundStatement query: {}", taskCtx.getId(), action, taskCtx, query); |
|
|
|
} |
|
|
|
String query = queryToString(taskCtx); |
|
|
|
log.trace("[{}] {} task: {}, BoundStatement query: {}", taskCtx.getId(), action, taskCtx, query); |
|
|
|
} else { |
|
|
|
log.trace("[{}] {} task: {}", taskCtx.getId(), action, taskCtx); |
|
|
|
} |
|
|
|
@ -206,6 +207,22 @@ public abstract class AbstractBufferedRateExecutor<T extends AsyncTask, F extend |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private String queryToString(AsyncTaskContext<T, V> taskCtx) { |
|
|
|
CassandraStatementTask cassStmtTask = (CassandraStatementTask) taskCtx.getTask(); |
|
|
|
if (cassStmtTask.getStatement() instanceof BoundStatement) { |
|
|
|
BoundStatement stmt = (BoundStatement) cassStmtTask.getStatement(); |
|
|
|
String query = stmt.preparedStatement().getQueryString(); |
|
|
|
try { |
|
|
|
query = toStringWithValues(stmt, ProtocolVersion.V5); |
|
|
|
} catch (Exception e) { |
|
|
|
log.warn("Can't convert to query with values", e); |
|
|
|
} |
|
|
|
return query; |
|
|
|
} else { |
|
|
|
return "Not Cassandra Statement Task"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static String toStringWithValues(BoundStatement boundStatement, ProtocolVersion protocolVersion) { |
|
|
|
CodecRegistry codecRegistry = boundStatement.preparedStatement().getCodecRegistry(); |
|
|
|
PreparedStatement preparedStatement = boundStatement.preparedStatement(); |
|
|
|
|