package com.taobao.tddl.qatest.group; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import com.taobao.diamond.mockserver.MockServer; import com.taobao.tddl.atom.common.TAtomConstants; import com.taobao.tddl.common.GroupDataSourceRouteHelper; public class ChangeMasterSlaveTest extends GroupTestCase { @BeforeClass public static void setUp() throws Exception { } @Before public void init() throws Exception { super.setUp(); clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); } @Test public void dynamicChangeMSDSTest() throws Exception { // 主备切换之前,正常执行一条sql String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; tddlJT.update(sql, new Object[] { RANDOM_ID, time }); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0); Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(time, String.valueOf(re.get("gmt_create"))); // 清除数据 clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); // 主备切换(确保推送成功) for (int i = 0; i < 2; i++) { MockServer.setConfigInfo(tds.getFullDbGroupKey(), "qatest_normal_0:r,qatest_normal_0_bac:wr,qatest_normal_1_bac:r"); TimeUnit.SECONDS.sleep(SLEEP_TIME); } // 主备切换之后,正常执行一条sql clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; int rs = tddlJT.update(sql, new Object[] { RANDOM_ID, time }); Assert.assertEquals(1, rs); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(1); re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(time, String.valueOf(re.get("gmt_create"))); // 清除数据 clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); // 指定写库的dataSourceIndex GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(2); sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; rs = tddlJT.update(sql, new Object[] { RANDOM_ID, time }); Assert.assertEquals(1, rs); } @Test public void dynamicAddMasterDSTest() throws Exception { // 主备切换之前,正常执行一条sql String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; tddlJT.update(sql, new Object[] { RANDOM_ID, time }); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0); Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(time, String.valueOf(re.get("gmt_create"))); // 清除数据 clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); // 加库,并将写库转移到新加入的库 dataMap = new HashMap<String, String>(); initAtomConfig(ATOM_NORMAL_1_PATH, APPNAME, DBKEY_1); // 加库qatest_normal_1 dataMap.put(tds.getFullDbGroupKey(), "qatest_normal_0:r,qatest_normal_0_bac:r,qatest_normal_1_bac:r,qatest_normal_1:wr"); // 主备切换(确保推送成功) for (int i = 0; i < 3; i++) { MockServer.setConfigInfos(dataMap); TimeUnit.SECONDS.sleep(SLEEP_TIME); } // 主备切换之后,正常执行一条sql clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; // 主备切换之后,正常执行一条sql tddlJT.update(sql, new Object[] { RANDOM_ID, time }); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(3); re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(time, String.valueOf(re.get("gmt_create"))); } @Test public void writeDataToReadOnlyDSTest() throws Exception { // 主备切换之前,正常执行一条sql String sql = "insert into normaltbl_0001 (pk,gmt_create) values (?,?)"; tddlJT.update(sql, new Object[] { RANDOM_ID, time }); GroupDataSourceRouteHelper.executeByGroupDataSourceIndex(0); Map re = tddlJT.queryForMap("select * from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.assertEquals(time, String.valueOf(re.get("gmt_create"))); // 清除数据 clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); // 修改为只读(确保推送成功) for (int i = 0; i < 3; i++) { MockServer.setConfigInfo(TAtomConstants.getGlobalDataId(DBKEY_0), "ip=10.232.31.154\r\nport=3306\r\ndbName=qatest_normal_0\r\ndbType=mysql\r\ndbStatus=R"); TimeUnit.SECONDS.sleep(SLEEP_TIME); } // 主备切换之后,正常执行一条sql try { clearData(tddlJT, "delete from normaltbl_0001 where pk=?", new Object[] { RANDOM_ID }); Assert.fail(); } catch (Exception e) { Assert.assertTrue(e.getMessage().indexOf("com.taobao.tddl.group.exception.NoMoreDataSourceException") != -1); } // 恢复 MockServer.setConfigInfo(TAtomConstants.getGlobalDataId(DBKEY_0), "ip=10.232.31.154\r\nport=3306\r\ndbName=qatest_normal_0\r\ndbType=mysql\r\ndbStatus=WR"); TimeUnit.SECONDS.sleep(SLEEP_TIME); } }