33import com .actiontech .dble .backend .datasource .PhysicalDbGroup ;
44import com .actiontech .dble .backend .datasource .PhysicalDbInstance ;
55import com .actiontech .dble .backend .mysql .ByteUtil ;
6+ import com .actiontech .dble .backend .mysql .nio .handler .ResponseHandler ;
67import com .actiontech .dble .config .ErrorCode ;
78import com .actiontech .dble .net .connection .BackendConnection ;
89import com .actiontech .dble .net .mysql .MySQLPacket ;
10+ import com .actiontech .dble .server .SessionStage ;
11+ import com .actiontech .dble .server .status .SlowQueryLog ;
12+ import com .actiontech .dble .server .trace .RwTraceResult ;
13+ import com .actiontech .dble .server .trace .TraceRecord ;
14+ import com .actiontech .dble .services .mysqlsharding .MySQLResponseService ;
915import com .actiontech .dble .services .rwsplit .*;
1016import com .actiontech .dble .singleton .RouteService ;
1117import com .actiontech .dble .util .StringUtil ;
1622import java .io .IOException ;
1723import java .sql .SQLException ;
1824import java .sql .SQLSyntaxErrorException ;
25+ import java .util .Map ;
26+ import java .util .concurrent .ConcurrentHashMap ;
1927
2028public class RWSplitNonBlockingSession {
2129
@@ -24,6 +32,9 @@ public class RWSplitNonBlockingSession {
2432 private volatile BackendConnection conn ;
2533 private final RWSplitService rwSplitService ;
2634 private PhysicalDbGroup rwGroup ;
35+ private volatile RwTraceResult traceResult = new RwTraceResult ();
36+
37+ private volatile SessionStage sessionStage = SessionStage .Init ;
2738
2839 public RWSplitNonBlockingSession (RWSplitService service ) {
2940 this .rwSplitService = service ;
@@ -62,6 +73,10 @@ public void execute(Boolean master, byte[] originPacket, Callback callback, bool
6273 if (handler == null ) return ;
6374 PhysicalDbInstance instance = rwGroup .rwSelect (canRunOnMaster (master ), isWriteStatistical (writeStatistical ), localRead );
6475 checkDest (!instance .isReadInstance ());
76+ endRoute ();
77+ setPreExecuteEnd (RwTraceResult .SqlTraceType .RWSPLIT_QUERY );
78+ setTraceSimpleHandler ((ResponseHandler ) handler );
79+ traceResult .setDBInstance (instance );
6580 instance .getConnection (rwSplitService .getSchema (), handler , null , false );
6681 } catch (IOException e ) {
6782 LOGGER .warn ("select conn error" , e );
@@ -78,6 +93,10 @@ private RWSplitHandler getRwSplitHandler(byte[] originPacket, Callback callback)
7893 if (LOGGER .isDebugEnabled ()) {
7994 LOGGER .debug ("select bind conn[id={}]" , conn .getId ());
8095 }
96+ endRoute ();
97+ setPreExecuteEnd (RwTraceResult .SqlTraceType .RWSPLIT_QUERY );
98+ setTraceSimpleHandler (handler );
99+ traceResult .setDBInstance ((PhysicalDbInstance ) conn .getInstance ());
81100 // for ps needs to send master
82101 if ((originPacket != null && originPacket .length > 4 && originPacket [4 ] == MySQLPacket .COM_STMT_EXECUTE )) {
83102 long statementId = ByteUtil .readUB4 (originPacket , 5 );
@@ -204,4 +223,105 @@ public RWSplitService getService() {
204223 public BackendConnection getConn () {
205224 return conn ;
206225 }
226+
227+
228+ public void setRequestTime () {
229+ sessionStage = SessionStage .Read_SQL ;
230+ long requestTime = 0 ;
231+
232+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
233+ requestTime = System .nanoTime ();
234+ traceResult .setVeryStartPrepare (requestTime );
235+ }
236+
237+ }
238+
239+ public void startProcess () {
240+ sessionStage = SessionStage .Parse_SQL ;
241+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
242+ traceResult .setParseStartPrepare (new TraceRecord (System .nanoTime ()));
243+ }
244+ }
245+
246+ public void endParse () {
247+ sessionStage = SessionStage .Route_Calculation ;
248+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
249+ traceResult .ready ();
250+ // traceResult.setRouteStart(new TraceRecord(System.nanoTime()));
251+ }
252+ }
253+
254+
255+ public void endRoute () {
256+ sessionStage = SessionStage .Prepare_to_Push ;
257+ }
258+
259+
260+ public void setPreExecuteEnd (RwTraceResult .SqlTraceType type ) {
261+ sessionStage = SessionStage .Execute_SQL ;
262+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
263+ traceResult .setType (type );
264+ traceResult .setPreExecuteEnd (new TraceRecord (System .nanoTime ()));
265+ traceResult .clearConnReceivedMap ();
266+ traceResult .clearConnFlagMap ();
267+ }
268+ }
269+
270+ public void setTraceSimpleHandler (ResponseHandler simpleHandler ) {
271+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
272+ traceResult .setSimpleHandler (simpleHandler );
273+ }
274+ }
275+
276+
277+ public void setResponseTime (boolean isSuccess ) {
278+ sessionStage = SessionStage .Finished ;
279+ long responseTime = 0 ;
280+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
281+ responseTime = System .nanoTime ();
282+ traceResult .setVeryEnd (responseTime );
283+ if (isSuccess && SlowQueryLog .getInstance ().isEnableSlowLog ()) {
284+ SlowQueryLog .getInstance ().putSlowQueryLog (this .rwSplitService , (RwTraceResult ) traceResult );
285+ traceResult = new RwTraceResult ();
286+ }
287+ }
288+ }
289+
290+ public void setBackendResponseEndTime (MySQLResponseService service ) {
291+ sessionStage = SessionStage .First_Node_Fetched_Result ;
292+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
293+ ResponseHandler responseHandler = service .getResponseHandler ();
294+ if (responseHandler != null ) {
295+ TraceRecord record = new TraceRecord (System .nanoTime ());
296+ Map <String , TraceRecord > connMap = new ConcurrentHashMap <>();
297+ String key = String .valueOf (service .getConnection ().getId ());
298+ connMap .put (key , record );
299+ traceResult .addToConnFinishedMap (responseHandler , connMap );
300+ }
301+ }
302+
303+ }
304+
305+
306+
307+ public void setBackendResponseTime (MySQLResponseService service ) {
308+ sessionStage = SessionStage .Fetching_Result ;
309+ long responseTime = 0 ;
310+ if (SlowQueryLog .getInstance ().isEnableSlowLog ()) {
311+ ResponseHandler responseHandler = service .getResponseHandler ();
312+ String key = String .valueOf (service .getConnection ().getId ());
313+ if (responseHandler != null && traceResult .addToConnFlagMap (key ) == null ) {
314+ responseTime = System .nanoTime ();
315+ TraceRecord record = new TraceRecord (responseTime );
316+ Map <String , TraceRecord > connMap = new ConcurrentHashMap <>();
317+ connMap .put (key , record );
318+ traceResult .addToConnReceivedMap (responseHandler , connMap );
319+ }
320+ }
321+
322+
323+ }
324+
325+
326+
207327}
0 commit comments