Skip to content

Commit 1851089

Browse files
authored
Added option usePrefixPath (#78)
2 parents dab1ae0 + 4d35dfd commit 1851089

File tree

10 files changed

+151
-42
lines changed

10 files changed

+151
-42
lines changed

jdbc/src/main/java/tech/ydb/jdbc/YdbTracer.java

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.ArrayList;
44
import java.util.Date;
55
import java.util.List;
6+
import java.util.Objects;
67
import java.util.concurrent.atomic.AtomicLong;
78
import java.util.logging.Level;
89
import java.util.logging.Logger;
@@ -23,15 +24,18 @@ public class YdbTracer {
2324
private final List<Record> records = new ArrayList<>();
2425

2526
private String txID = null;
27+
private String label = null;
2628
private boolean isMarked = false;
2729
private boolean isClosed = false;
2830

2931
private class Record {
3032
private final long executedAt = System.currentTimeMillis();
3133
private final String message;
34+
private final boolean isRequest;
3235

33-
Record(String message) {
36+
Record(String message, boolean isRequest) {
3437
this.message = message;
38+
this.isRequest = isRequest;
3539
}
3640
}
3741

@@ -50,17 +54,33 @@ public static YdbTracer current() {
5054
}
5155

5256
public void trace(String message) {
53-
records.add(new Record(message));
57+
records.add(new Record(message, false));
58+
}
59+
60+
public void traceRequest(String message) {
61+
records.add(new Record(message, true));
5462
}
5563

5664
public void setId(String id) {
57-
this.txID = id;
58-
trace("set-id " + id);
65+
if (!Objects.equals(id, txID)) {
66+
this.txID = id;
67+
trace("set-id " + id);
68+
}
5969
}
6070

6171
public void markToPrint() {
62-
this.isMarked = true;
63-
trace("markToPrint");
72+
if (!isMarked) {
73+
this.isMarked = true;
74+
trace("markToPrint");
75+
}
76+
}
77+
78+
public void markToPrint(String label) {
79+
if (!isMarked) {
80+
this.isMarked = true;
81+
this.label = label;
82+
trace("markToPrint " + label);
83+
}
6484
}
6585

6686
public void close() {
@@ -74,15 +94,33 @@ public void close() {
7494
}
7595

7696
long finishedAt = System.currentTimeMillis();
97+
long requestsTime = 0;
7798

78-
final String id = txID != null ? txID : "anonymous-" + ANONYMOUS_COUNTER.incrementAndGet();
79-
LOGGER.log(level, "Trace[{0}] started at {1}", new Object[] {id, startDate});
99+
String id = txID != null ? txID : "anonymous-" + ANONYMOUS_COUNTER.incrementAndGet();
100+
String traceID = label == null ? id : label + "-" + id;
101+
LOGGER.log(level, "Trace[{0}] started at {1}", new Object[] {traceID, startDate});
80102
long last = startedAt;
103+
long requestsCount = 0;
104+
boolean lastIsRequest = false;
81105
for (Record record: records) {
82-
long ms = record.executedAt - last;
83-
LOGGER.log(level, "Trace[{0}] {1} ms {2}", new Object[] {id, ms, record.message});
84-
last = record.executedAt;
106+
if (record.isRequest) {
107+
requestsCount++;
108+
lastIsRequest = true;
109+
if (record.message != null) {
110+
LOGGER.log(level, "Query[{0}]: {1}", new Object[] {traceID, record.message.replaceAll("\\s", " ")});
111+
}
112+
} else {
113+
long ms = record.executedAt - last;
114+
if (lastIsRequest) {
115+
requestsTime += ms;
116+
lastIsRequest = false;
117+
}
118+
LOGGER.log(level, "Trace[{0}] {1} ms {2}", new Object[] {traceID, ms, record.message});
119+
last = record.executedAt;
120+
}
85121
}
86-
LOGGER.log(level, "Trace[{0}] finished in {1} ms", new Object[] {id, finishedAt - startedAt});
122+
LOGGER.log(level, "Trace[{0}] finished in {1} ms, {2} requests take {3} ms", new Object[] {
123+
traceID, finishedAt - startedAt, requestsCount, requestsTime
124+
});
87125
}
88126
}

jdbc/src/main/java/tech/ydb/jdbc/context/BaseYdbExecutor.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,17 @@ public abstract class BaseYdbExecutor implements YdbExecutor {
3333
private final SessionRetryContext retryCtx;
3434
private final Duration sessionTimeout;
3535
private final TableClient tableClient;
36+
3637
private final AtomicReference<YdbQueryResult> currResult;
3738
protected final boolean traceEnabled;
39+
protected final String prefixPragma;
3840

3941
public BaseYdbExecutor(YdbContext ctx) {
4042
this.retryCtx = ctx.getRetryCtx();
4143
this.traceEnabled = ctx.isTxTracerEnabled();
4244
this.sessionTimeout = ctx.getOperationProperties().getSessionTimeout();
4345
this.tableClient = ctx.getTableClient();
46+
this.prefixPragma = ctx.getPrefixPragma();
4447
this.currResult = new AtomicReference<>();
4548
}
4649

@@ -87,16 +90,27 @@ public YdbTracer trace(String message) {
8790
return tracer;
8891
}
8992

93+
protected YdbTracer traceRequest(String type, String message) {
94+
if (!traceEnabled) {
95+
return null;
96+
}
97+
YdbTracer tracer = YdbTracer.current();
98+
tracer.trace("--> " + type);
99+
tracer.traceRequest(message);
100+
return tracer;
101+
}
102+
90103
@Override
91104
public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query) throws SQLException {
92105
ensureOpened();
93106

94-
String yql = query.getPreparedYql();
107+
String yql = prefixPragma + query.getPreparedYql();
95108
YdbContext ctx = statement.getConnection().getCtx();
96109
YdbValidator validator = statement.getValidator();
97110

98111
// Scheme query does not affect transactions or result sets
99-
YdbTracer tracer = trace("--> scheme >>\n" + yql);
112+
YdbTracer tracer = traceRequest("scheme query", yql);
113+
100114
ExecuteSchemeQuerySettings settings = ctx.withDefaultTimeout(new ExecuteSchemeQuerySettings());
101115
validator.execute(QueryType.SCHEME_QUERY + " >>\n" + yql, tracer,
102116
() -> retryCtx.supplyStatus(session -> session.executeSchemeQuery(yql, settings))
@@ -114,9 +128,9 @@ public YdbQueryResult executeBulkUpsert(YdbStatement statement, YdbQuery query,
114128
throws SQLException {
115129
ensureOpened();
116130

117-
String yql = query.getPreparedYql();
131+
String yql = prefixPragma + query.getPreparedYql();
118132
YdbValidator validator = statement.getValidator();
119-
YdbTracer tracer = trace("--> bulk upsert >>\n" + yql);
133+
YdbTracer tracer = traceRequest("bulk upsert", yql);
120134
validator.execute(QueryType.BULK_QUERY + " >>\n" + yql, tracer,
121135
() -> retryCtx.supplyStatus(session -> session.executeBulkUpsert(tablePath, rows))
122136
);
@@ -129,18 +143,20 @@ public YdbQueryResult executeBulkUpsert(YdbStatement statement, YdbQuery query,
129143
}
130144

131145
@Override
132-
public YdbQueryResult executeScanQuery(YdbStatement statement, YdbQuery query, String yql, Params params)
146+
public YdbQueryResult executeScanQuery(YdbStatement statement, YdbQuery query, String preparedYql, Params params)
133147
throws SQLException {
134148
ensureOpened();
135149

150+
String yql = prefixPragma + preparedYql;
136151
YdbContext ctx = statement.getConnection().getCtx();
137152
YdbValidator validator = statement.getValidator();
138153
Duration scanQueryTimeout = ctx.getOperationProperties().getScanQueryTimeout();
139154
ExecuteScanQuerySettings settings = ExecuteScanQuerySettings.newBuilder()
140155
.withRequestTimeout(scanQueryTimeout)
141156
.build();
142157
String msg = QueryType.SCAN_QUERY + " >>\n" + yql;
143-
final YdbTracer tracer = trace("--> scan query >>\n" + yql);
158+
159+
final YdbTracer tracer = traceRequest("scan query", yql);
144160
final Session session = createNewTableSession(validator);
145161

146162
StreamQueryResult lazy = validator.call(msg, null, () -> {

jdbc/src/main/java/tech/ydb/jdbc/context/QueryServiceExecutor.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ public void commit(YdbContext ctx, YdbValidator validator) throws SQLException {
188188
return;
189189
}
190190

191-
YdbTracer tracer = trace("--> commit");
191+
YdbTracer tracer = traceRequest("commit", null);
192192
CommitTransactionSettings settings = ctx.withRequestTimeout(CommitTransactionSettings.newBuilder()).build();
193193
try {
194194
validator.clearWarnings();
@@ -212,7 +212,7 @@ public void rollback(YdbContext ctx, YdbValidator validator) throws SQLException
212212
return;
213213
}
214214

215-
YdbTracer tracer = trace("--> rollback");
215+
YdbTracer tracer = traceRequest("rollback", null);
216216
RollbackTransactionSettings settings = ctx.withRequestTimeout(RollbackTransactionSettings.newBuilder())
217217
.build();
218218

@@ -231,7 +231,7 @@ public void rollback(YdbContext ctx, YdbValidator validator) throws SQLException
231231

232232
@Override
233233
public YdbQueryResult executeDataQuery(
234-
YdbStatement statement, YdbQuery query, String yql, Params params, long timeout, boolean keepInCache
234+
YdbStatement statement, YdbQuery query, String preparedYql, Params params, long timeout, boolean keepInCache
235235
) throws SQLException {
236236
ensureOpened();
237237

@@ -254,8 +254,10 @@ public YdbQueryResult executeDataQuery(
254254

255255
final QueryTransaction localTx = nextTx;
256256

257+
String yql = prefixPragma + preparedYql;
258+
257259
if (useStreamResultSet) {
258-
YdbTracer tracer = trace("--> stream query >>\n" + yql);
260+
YdbTracer tracer = traceRequest("stream query", yql);
259261
String msg = "STREAM_QUERY >>\n" + yql;
260262
StreamQueryResult lazy = validator.call(msg, null, () -> {
261263
final CompletableFuture<Result<StreamQueryResult>> future = new CompletableFuture<>();
@@ -314,7 +316,7 @@ public void onNextPart(QueryResultPart part) {
314316
return updateCurrentResult(lazy);
315317
}
316318

317-
YdbTracer tracer = trace("--> data query >>\n" + yql);
319+
YdbTracer tracer = traceRequest("data query", yql);
318320
try {
319321
QueryReader result = validator.call(QueryType.DATA_QUERY + " >>\n" + yql, tracer,
320322
() -> QueryReader.readFrom(localTx.createQuery(yql, isAutoCommit, params, settings))
@@ -347,12 +349,12 @@ public void onNextPart(QueryResultPart part) {
347349
public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query) throws SQLException {
348350
ensureOpened();
349351

350-
String yql = query.getPreparedYql();
352+
String yql = prefixPragma + query.getPreparedYql();
351353
YdbContext ctx = statement.getConnection().getCtx();
352354
YdbValidator validator = statement.getValidator();
353355

354356
// Scheme query does not affect transactions or result sets
355-
YdbTracer tracer = trace("--> scheme query >>\n" + yql);
357+
YdbTracer tracer = traceRequest("scheme query", yql);
356358
ExecuteQuerySettings settings = ctx.withRequestTimeout(ExecuteQuerySettings.newBuilder()).build();
357359
try (QuerySession session = createNewQuerySession(validator)) {
358360
validator.call(QueryType.SCHEME_QUERY + " >>\n" + yql, tracer, () -> session
@@ -373,15 +375,15 @@ public YdbQueryResult executeSchemeQuery(YdbStatement statement, YdbQuery query)
373375
public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query) throws SQLException {
374376
ensureOpened();
375377

376-
String yql = query.getPreparedYql();
378+
String yql = prefixPragma + query.getPreparedYql();
377379
YdbContext ctx = statement.getConnection().getCtx();
378380
YdbValidator validator = statement.getValidator();
379381

380382
// Scheme query does not affect transactions or result sets
381383
ExecuteQuerySettings settings = ctx.withRequestTimeout(ExecuteQuerySettings.newBuilder())
382384
.withExecMode(QueryExecMode.EXPLAIN)
383385
.build();
384-
YdbTracer tracer = trace("--> explain query >>\n" + yql);
386+
YdbTracer tracer = traceRequest("explain query", yql);
385387

386388
try (QuerySession session = createNewQuerySession(validator)) {
387389
QueryInfo res = validator.call(QueryType.EXPLAIN_QUERY + " >>\n" + yql, tracer, () -> session

jdbc/src/main/java/tech/ydb/jdbc/context/TableServiceExecutor.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public void commit(YdbContext ctx, YdbValidator validator) throws SQLException {
118118

119119
Session session = tx.getSession(validator);
120120
CommitTxSettings settings = ctx.withDefaultTimeout(new CommitTxSettings());
121-
YdbTracer tracer = trace("--> commit");
121+
YdbTracer tracer = traceRequest("commit", null);
122122

123123
try {
124124
validator.clearWarnings();
@@ -144,7 +144,7 @@ public void rollback(YdbContext ctx, YdbValidator validator) throws SQLException
144144

145145
Session session = tx.getSession(validator);
146146
RollbackTxSettings settings = ctx.withDefaultTimeout(new RollbackTxSettings());
147-
YdbTracer tracer = trace("--> rollback");
147+
YdbTracer tracer = traceRequest("rollback", null);
148148

149149
try {
150150
validator.clearWarnings();
@@ -180,8 +180,8 @@ public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query
180180

181181
YdbContext ctx = statement.getConnection().getCtx();
182182
YdbValidator validator = statement.getValidator();
183-
String yql = query.getPreparedYql();
184-
YdbTracer tracer = trace("--> explain >>\n" + yql);
183+
String yql = prefixPragma + query.getPreparedYql();
184+
YdbTracer tracer = traceRequest("explain", yql);
185185

186186
ExplainDataQuerySettings settings = ctx.withDefaultTimeout(new ExplainDataQuerySettings());
187187
try (Session session = createNewTableSession(validator)) {
@@ -196,13 +196,14 @@ public YdbQueryResult executeExplainQuery(YdbStatement statement, YdbQuery query
196196
}
197197

198198
@Override
199-
public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, String yql, Params params,
199+
public YdbQueryResult executeDataQuery(YdbStatement statement, YdbQuery query, String preparedYql, Params params,
200200
long timeout, boolean keepInCache) throws SQLException {
201201
ensureOpened();
202202

203203
YdbValidator validator = statement.getValidator();
204-
final Session session = tx.getSession(validator);
205-
YdbTracer tracer = trace("--> data query >>\n" + yql);
204+
Session session = tx.getSession(validator);
205+
String yql = prefixPragma + preparedYql;
206+
YdbTracer tracer = traceRequest("data query", yql);
206207
try {
207208
DataQueryResult result = validator.call(
208209
QueryType.DATA_QUERY + " >>\n" + yql, tracer,

jdbc/src/main/java/tech/ydb/jdbc/context/YdbContext.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ public class YdbContext implements AutoCloseable {
7474
private final QueryClientImpl queryClient;
7575
private final SchemeClient schemeClient;
7676
private final SessionRetryContext retryCtx;
77+
private final String prefixPath;
78+
private final String prefixPragma;
7779

7880
private final Cache<String, YdbQuery> queriesCache;
7981
private final Cache<String, QueryStat> statsCache;
@@ -120,6 +122,14 @@ private YdbContext(
120122
queryParamsCache = null;
121123
tableDescribeCache = null;
122124
}
125+
126+
if (config.hasPrefixPath()) {
127+
prefixPath = joined(transport.getDatabase(), config.getPrefixPath());
128+
prefixPragma = "PRAGMA TablePathPrefix = \"" + prefixPath + "\";\n";
129+
} else {
130+
prefixPath = transport.getDatabase();
131+
prefixPragma = "";
132+
}
123133
}
124134

125135
/**
@@ -131,8 +141,16 @@ public GrpcTransport getGrpcTransport() {
131141
return grpcTransport;
132142
}
133143

134-
public String getDatabase() {
135-
return grpcTransport.getDatabase();
144+
private String joined(String path1, String path2) {
145+
return path1.endsWith("/") || path2.startsWith("/") ? path1 + path2 : path1 + "/" + path2;
146+
}
147+
148+
public String getPrefixPath() {
149+
return prefixPath;
150+
}
151+
152+
String getPrefixPragma() {
153+
return prefixPragma;
136154
}
137155

138156
public SchemeClient getSchemeClient() {
@@ -372,8 +390,7 @@ public YdbPreparedQuery findOrPrepareParams(YdbQuery query, YdbPrepareMode mode)
372390
}
373391

374392
if (query.getYqlBatcher() != null && (mode == YdbPrepareMode.AUTO || type == QueryType.BULK_QUERY)) {
375-
String tableName = query.getYqlBatcher().getTableName();
376-
String tablePath = tableName.startsWith("/") ? tableName : getDatabase() + "/" + tableName;
393+
String tablePath = joined(getPrefixPath(), query.getYqlBatcher().getTableName());
377394
TableDescription description = tableDescribeCache.getIfPresent(tablePath);
378395
if (description == null) {
379396
DescribeTableSettings settings = withDefaultTimeout(new DescribeTableSettings());

jdbc/src/main/java/tech/ydb/jdbc/impl/YdbDatabaseMetaDataImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ private List<String> listTables(String tableNamePattern) throws SQLException {
13151315
}
13161316

13171317
private List<String> listTables(Predicate<String> filter) throws SQLException {
1318-
String databaseWithSuffix = withSuffix(connection.getCtx().getDatabase());
1318+
String databaseWithSuffix = withSuffix(connection.getCtx().getPrefixPath());
13191319
return tables(databaseWithSuffix, databaseWithSuffix, filter);
13201320
}
13211321

@@ -1352,7 +1352,7 @@ private List<String> tables(String databasePrefix, String path, Predicate<String
13521352
private TableDescription describeTable(String table) throws SQLException {
13531353
DescribeTableSettings settings = connection.getCtx().withDefaultTimeout(new DescribeTableSettings());
13541354

1355-
String databaseWithSuffix = withSuffix(connection.getCtx().getDatabase());
1355+
String databaseWithSuffix = withSuffix(connection.getCtx().getPrefixPath());
13561356

13571357
return validator.call("Describe table " + table, null, () -> executor
13581358
.describeTable(databaseWithSuffix + table, settings)

0 commit comments

Comments
 (0)