blob: ecdde2ee32d5a6bc62823531d4c9553b466d3b76 [file]
/*
* Copyright 1999-2019 Seata.io Group.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.seata.core.exception.TransactionException;
import io.seata.core.model.BranchStatus;
import io.seata.core.model.GlobalStatus;
import io.seata.server.session.BranchSession;
import io.seata.server.session.GlobalSession;
import io.seata.server.session.SessionCondition;
import io.seata.server.session.SessionManager;
import io.seata.server.storage.file.ReloadableStore;
import io.seata.server.store.SessionStorable;
import io.seata.server.store.TransactionStoreManager;
import io.seata.server.store.TransactionStoreManager.LogOperation;
import io.seata.server.storage.file.TransactionWriteStore;
import io.seata.server.storage.file.store.FileTransactionStoreManager;
/**
* The type Write store test.
*
* @author slievrly
* write cost:87281,read cost:158922 65535*5 1000 per open init 1024 write cost:86454,read
* cost:160541 65535*5 2000 per open init 1024 write cost:82953,read cost:157736 65535*5 2000 per open init
* 65535*5*9 write cost:115079,read cost:163664 65535*5 2000 per open init 65535*5*9 schedule flush 10||2s
*/
public class WriteStoreTest {
private static String vgroup = "vgroupMock";
private static String appname = "appnameMock";
private static String instname = "seataMocK";
private static int trx_num = 65535 * 5;
private static int trx_begin = 0;
/**
* The entry point of application.
*
* @param args the input arguments
* @throws InterruptedException the interrupted exception
* @throws IOException the io exception
*/
public static void main(String[] args) throws InterruptedException, IOException {
TransactionStoreManager transactionStoreManager = new FileTransactionStoreManager(
"~/Documents/test/data",
new SessionManager() {
@Override
public void destroy() {
}
@Override
public void addGlobalSession(GlobalSession session) throws TransactionException {
}
@Override
public GlobalSession findGlobalSession(String xid) {
return null;
}
@Override
public GlobalSession findGlobalSession(String xid, boolean withBranchSessions) {
return null;
}
@Override
public void updateGlobalSessionStatus(GlobalSession session, GlobalStatus status)
throws TransactionException {
}
@Override
public void removeGlobalSession(GlobalSession session) throws TransactionException {
}
@Override
public void addBranchSession(GlobalSession globalSession, BranchSession session)
throws TransactionException {
}
@Override
public void updateBranchSessionStatus(BranchSession session, BranchStatus status)
throws TransactionException {
}
@Override
public void removeBranchSession(GlobalSession globalSession, BranchSession session)
throws TransactionException {
}
@Override
public Collection<GlobalSession> allSessions() {
return null;
}
@Override
public List<GlobalSession> findGlobalSessions(SessionCondition condition) {
List<GlobalSession> globalSessions = new ArrayList<>();
int begin = 10000;
int num = 1000;
for (int i = begin; i < begin + num; i++) {
BranchSession branchSession1 = new BranchSession();
branchSession1.setTransactionId(i);
branchSession1.setBranchId(begin + num + (i - begin) * 2);
branchSession1.setResourceId("mockDbkeY1");
BranchSession branchSession2 = new BranchSession();
branchSession2.setTransactionId(i);
branchSession2.setBranchId(begin + num + (i - begin) * 2 + 1);
branchSession2.setResourceId("mockDbkeY2");
GlobalSession globalSession = new GlobalSession(appname, vgroup, instname, 60000);
try {
globalSession.add(branchSession1);
globalSession.add(branchSession2);
globalSessions.add(globalSession);
} catch (Exception exx) {}
}
return globalSessions;
}
@Override
public <T> T lockAndExecute(GlobalSession globalSession, GlobalSession.LockCallable<T> lockCallable)
throws TransactionException {
return null;
}
@Override
public void onBegin(GlobalSession globalSession) throws TransactionException {
}
@Override
public void onStatusChange(GlobalSession globalSession, GlobalStatus status)
throws TransactionException {
}
@Override
public void onBranchStatusChange(GlobalSession globalSession, BranchSession branchSession,
BranchStatus status) throws TransactionException {
}
@Override
public void onAddBranch(GlobalSession globalSession, BranchSession branchSession)
throws TransactionException {
}
@Override
public void onRemoveBranch(GlobalSession globalSession, BranchSession branchSession)
throws TransactionException {
}
@Override
public void onClose(GlobalSession globalSession) throws TransactionException {
}
@Override
public void onSuccessEnd(GlobalSession globalSession) throws TransactionException {
}
@Override
public void onFailEnd(GlobalSession globalSession) throws TransactionException {
}
});
long beginWriteMills = System.currentTimeMillis();
write(transactionStoreManager);
long endWriteMills = System.currentTimeMillis();
Thread.sleep(10 * 1000);
long beginReadMills = System.currentTimeMillis();
Map<SessionStorable, LogOperation> resultMap = readAll(transactionStoreManager);
long endReadMills = System.currentTimeMillis();
if ((resultMap.size() % (65535)) % 3000 == 0) {
System.out.print("check success");
} else {
System.out.print("check failed");
}
System.out.print(
"write cost:" + (endWriteMills - beginWriteMills) + ",read cost:" + (endReadMills - beginReadMills));
}
private static void write(TransactionStoreManager transactionStoreManager) {
for (int i = trx_begin; i < trx_begin + trx_num; i++) {
GlobalSession globalSession = new GlobalSession(appname, vgroup, instname, 60000);
transactionStoreManager.writeSession(LogOperation.GLOBAL_ADD, globalSession);
BranchSession branchSession1 = new BranchSession();
branchSession1.setTransactionId(globalSession.getTransactionId());
branchSession1.setBranchId(trx_begin + trx_num + (i - trx_begin) * 2);
branchSession1.setResourceId("mockDbkeY1");
transactionStoreManager.writeSession(LogOperation.BRANCH_ADD, branchSession1);
transactionStoreManager.writeSession(LogOperation.BRANCH_UPDATE, branchSession1);
transactionStoreManager.writeSession(LogOperation.BRANCH_REMOVE, branchSession1);
BranchSession branchSession2 = new BranchSession();
branchSession2.setTransactionId(globalSession.getTransactionId());
branchSession2.setBranchId(trx_begin + (i - trx_begin) + i * 2 + 1);
branchSession2.setResourceId("mockDbkeY2");
transactionStoreManager.writeSession(LogOperation.BRANCH_ADD, branchSession2);
transactionStoreManager.writeSession(LogOperation.BRANCH_UPDATE, branchSession2);
transactionStoreManager.writeSession(LogOperation.BRANCH_REMOVE, branchSession2);
transactionStoreManager.writeSession(LogOperation.GLOBAL_UPDATE, globalSession);
transactionStoreManager.writeSession(LogOperation.GLOBAL_REMOVE, globalSession);
}
}
private static Map<SessionStorable, LogOperation> readAll(TransactionStoreManager transactionStoreManager) {
Map<SessionStorable, LogOperation> resultMap = new HashMap<>(65535 * 5 * 9);
while (((ReloadableStore)transactionStoreManager).hasRemaining(true)) {
List<TransactionWriteStore> transactionWriteStores = ((ReloadableStore)transactionStoreManager).readWriteStore(2000,
true);
if (transactionWriteStores != null) {
for (TransactionWriteStore transactionWriteStore : transactionWriteStores) {
printLog(transactionWriteStore);
resultMap.put(transactionWriteStore.getSessionRequest(), transactionWriteStore.getOperate());
}
}
}
while (((ReloadableStore)transactionStoreManager).hasRemaining(false)) {
List<TransactionWriteStore> transactionWriteStores = ((ReloadableStore)transactionStoreManager).readWriteStore(2000,
false);
if (transactionWriteStores != null) {
for (TransactionWriteStore transactionWriteStore : transactionWriteStores) {
printLog(transactionWriteStore);
resultMap.put(transactionWriteStore.getSessionRequest(), transactionWriteStore.getOperate());
}
}
}
return resultMap;
}
private static void printLog(TransactionWriteStore transactionWriteStore) {
if (transactionWriteStore.getSessionRequest() instanceof GlobalSession) {
GlobalSession globalSession = (GlobalSession)transactionWriteStore.getSessionRequest();
System.out.print(
"xid:" + globalSession.getTransactionId() + "," + globalSession.getApplicationId() + "," + globalSession
.getTransactionServiceGroup() + "," + globalSession.getTransactionName() + "," + globalSession
.getTimeout());
} else {
BranchSession branchSession = (BranchSession)transactionWriteStore.getSessionRequest();
System.out.print(
"xid:" + branchSession.getTransactionId() + ",branchId:" + branchSession.getBranchId() + ","
+ branchSession.getResourceId());
}
System.out.println(",op:" + transactionWriteStore.getOperate().name());
}
}