Skip to content

Commit f05918f

Browse files
hengyoushxcaspar
andauthored
fix issue #304 (#306)
Signed-off-by: hengyoush <[email protected]> Co-authored-by: xcaspar <[email protected]>
1 parent 81f8143 commit f05918f

File tree

5 files changed

+49
-21
lines changed

5 files changed

+49
-21
lines changed

chaosblade-exec-plugin/chaosblade-exec-plugin-mysql/src/main/java/com/alibaba/chaosblade/exec/plugin/mysql/Mysql5Enhancer.java

+29-13
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727

2828
import java.lang.reflect.Method;
2929

30+
import static com.alibaba.chaosblade.exec.plugin.mysql.MysqlConstant.MYSQL_IO_CLASS;
31+
import static com.alibaba.chaosblade.exec.plugin.mysql.MysqlConstant.MYSQL_SERVER_PREPARED_STMT_METHOD;
32+
3033
/**
3134
* @author yefei
3235
* @create 2020-11-19 16:14
@@ -42,23 +45,36 @@ public EnhancerModel doBeforeAdvice(ClassLoader classLoader, String className, O
4245
return null;
4346
}
4447

45-
Object statement = methodArguments[0];
46-
Object query = methodArguments[1];
48+
boolean isMysqlIOClass = MYSQL_IO_CLASS.equals(className);
49+
Object statement;
50+
Object query;
4751
Object catalog;
48-
if (methodArguments.length == 10) {
49-
// mysql 5.1.x
50-
catalog = methodArguments[8];
51-
} else if (methodArguments.length == 11) {
52-
// mysql 5.0.x
53-
catalog = methodArguments[9];
52+
Object mysqlIO;
53+
if (isMysqlIOClass) {
54+
statement = methodArguments[0];
55+
query = methodArguments[1];
56+
if (methodArguments.length == 10) {
57+
// mysql 5.1.x
58+
catalog = methodArguments[8];
59+
} else if (methodArguments.length == 11) {
60+
// mysql 5.0.x
61+
catalog = methodArguments[9];
62+
} else {
63+
logger.warn("The necessary parameters is null or length is not equal 10 or 11, {}",
64+
methodArguments != null ? methodArguments.length : null);
65+
return null;
66+
}
67+
mysqlIO = object;
5468
} else {
55-
logger.warn("The necessary parameters is null or length is not equal 10 or 11, {}",
56-
methodArguments != null ? methodArguments.length : null);
57-
return null;
69+
statement = object;
70+
query = ReflectUtil.getSuperclassFieldValue(object, "originalSql", false);
71+
catalog = ReflectUtil.getSuperclassFieldValue(object, "currentCatalog", false);
72+
Object connection = ReflectUtil.getSuperclassFieldValue(object, "connection", false);
73+
mysqlIO = ReflectUtil.getSuperclassFieldValue(connection, "io", false);
5874
}
5975

60-
String host = ReflectUtil.getFieldValue(object, "host", false);
61-
Integer port = ReflectUtil.getFieldValue(object, "port", false);
76+
String host = ReflectUtil.getFieldValue(mysqlIO, "host", false);
77+
Integer port = ReflectUtil.getFieldValue(mysqlIO, "port", false);
6278
String sql = (String) query;
6379
String database = null;
6480

chaosblade-exec-plugin/chaosblade-exec-plugin-mysql/src/main/java/com/alibaba/chaosblade/exec/plugin/mysql/Mysql8Enhancer.java

+10-3
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,21 @@ public EnhancerModel doBeforeAdvice(ClassLoader classLoader, String className, O
4242
return null;
4343
}
4444

45-
Object callingQuery = methodArguments[0];
46-
Object connection = ReflectUtil.getSuperclassFieldValue(callingQuery, "connection", false);
47-
String sql = String.valueOf(methodArguments[1]);
45+
Object callingQuery;
46+
String sql;
47+
if (MysqlConstant.MYSQL8_NATIVE_SESSION_CLASS.equals(className)) {
48+
callingQuery = methodArguments[0];
49+
sql = String.valueOf(methodArguments[1]);
50+
} else {
51+
callingQuery = object;
52+
sql = null;
53+
}
4854

4955
if (ReflectUtil.isAssignableFrom(classLoader, callingQuery.getClass(), "com.mysql.cj.jdbc.JdbcPreparedStatement")) {
5056
sql = ReflectUtil.invokeMethod(callingQuery, "getPreparedSql", new Object[0], false);
5157
}
5258

59+
Object connection = ReflectUtil.getSuperclassFieldValue(callingQuery, "connection", false);
5360
String host = ReflectUtil.getFieldValue(connection, "origHostToConnectTo", false);
5461
Integer port = ReflectUtil.getFieldValue(connection, "origPortToConnectTo", false);
5562
String database = ReflectUtil.getFieldValue(connection, "database", false);;

chaosblade-exec-plugin/chaosblade-exec-plugin-mysql/src/main/java/com/alibaba/chaosblade/exec/plugin/mysql/MysqlConstant.java

+4
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,13 @@ public interface MysqlConstant {
3131

3232
String MYSQL_IO_CLASS = "com.mysql.jdbc.MysqlIO";
3333
String INTERCEPTOR_PRE_METHOD = "sqlQueryDirect";
34+
String MYSQL_SERVER_PREPARED_STMT_CLASS = "com.mysql.jdbc.ServerPreparedStatement";
35+
String MYSQL_SERVER_PREPARED_STMT_METHOD = "serverExecute";
3436

3537
String MYSQL8_NATIVE_SESSION_CLASS = "com.mysql.cj.NativeSession";
3638
String MYSQL8_NATIVE_SESSION_METHOD = "execSQL";
39+
String MYSQL8_SERVER_PREPARED_STMT_CLASS = "com.mysql.cj.jdbc.ServerPreparedStatement";
40+
String MYSQL8SERVER_PREPARED_STMT_METHOD = "serverExecute";
3741

3842

3943
String AWS_MYSQL_NATIVE_SESSION_CLASS = "software.aws.rds.jdbc.mysql.shading.com.mysql.cj.NativeSession";

chaosblade-exec-plugin/chaosblade-exec-plugin-mysql/src/main/java/com/alibaba/chaosblade/exec/plugin/mysql/MysqlEnhancer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public EnhancerModel doBeforeAdvice(ClassLoader classLoader, String className, O
4848
Method method, Object[] methodArguments)
4949
throws Exception {
5050

51-
if (MYSQL_IO_CLASS.equals(className)) {
51+
if (MYSQL_IO_CLASS.equals(className) || MYSQL_SERVER_PREPARED_STMT_CLASS.equals(className)) {
5252
return mysql5Enhancer.doBeforeAdvice(classLoader, className, object, method, methodArguments);
5353
}else if(AWS_MYSQL_NATIVE_SESSION_CLASS.equals(className)) {
5454
return mysqlAwsEnhancer.doBeforeAdvice(classLoader, className, object, method, methodArguments);

chaosblade-exec-plugin/chaosblade-exec-plugin-mysql/src/main/java/com/alibaba/chaosblade/exec/plugin/mysql/MysqlPointCut.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.alibaba.chaosblade.exec.common.aop.matcher.clazz.ClassMatcher;
2121
import com.alibaba.chaosblade.exec.common.aop.matcher.clazz.NameClassMatcher;
2222
import com.alibaba.chaosblade.exec.common.aop.matcher.clazz.OrClassMatcher;
23+
import com.alibaba.chaosblade.exec.common.aop.matcher.clazz.SuperClassMatcher;
2324
import com.alibaba.chaosblade.exec.common.aop.matcher.method.MethodMatcher;
2425
import com.alibaba.chaosblade.exec.common.aop.matcher.method.NameMethodMatcher;
2526
import com.alibaba.chaosblade.exec.common.aop.matcher.method.OrMethodMatcher;
@@ -36,8 +37,8 @@ public ClassMatcher getClassMatcher() {
3637
OrClassMatcher orClassMatcher = new OrClassMatcher();
3738

3839
return orClassMatcher
39-
.or(new NameClassMatcher(MYSQL_IO_CLASS))
40-
.or(new NameClassMatcher(MYSQL8_NATIVE_SESSION_CLASS))
40+
.or(new NameClassMatcher(MYSQL_IO_CLASS)).or(new NameClassMatcher(MYSQL_SERVER_PREPARED_STMT_CLASS))
41+
.or(new NameClassMatcher(MYSQL8_NATIVE_SESSION_CLASS)).or(new NameClassMatcher(MYSQL8_SERVER_PREPARED_STMT_CLASS))
4142
.or(new NameClassMatcher(AWS_MYSQL_NATIVE_SESSION_CLASS))
4243
.or(new NameClassMatcher(IO_SHARDING_STATEMENT_EXECUTOR_CLASS))
4344
.or(new NameClassMatcher(APACHE_SHARDING_EXECUTOR_ENGINE_CLASS))
@@ -48,8 +49,8 @@ public ClassMatcher getClassMatcher() {
4849
public MethodMatcher getMethodMatcher() {
4950
OrMethodMatcher orMethodMatcher = new OrMethodMatcher();
5051
return orMethodMatcher
51-
.or(new NameMethodMatcher(INTERCEPTOR_PRE_METHOD))
52-
.or(new NameMethodMatcher(MYSQL8_NATIVE_SESSION_METHOD))
52+
.or(new NameMethodMatcher(INTERCEPTOR_PRE_METHOD)).or(new NameMethodMatcher(MYSQL_SERVER_PREPARED_STMT_METHOD))
53+
.or(new NameMethodMatcher(MYSQL8_NATIVE_SESSION_METHOD)).or(new NameMethodMatcher(MYSQL8SERVER_PREPARED_STMT_METHOD))
5354
.or(new NameMethodMatcher(AWS_MYSQL_NATIVE_SESSION_METHOD))
5455
.or(new NameMethodMatcher(IO_SHARDING_STATEMENT_EXECUTOR_METHOD))
5556
.or(new NameMethodMatcher(APACHE_SHARDING_EXECUTOR_ENGINE_METHOD));

0 commit comments

Comments
 (0)