build: config spotless plugin and reformat code

This commit is contained in:
Frank.R.Wu 2023-06-15 11:08:12 +08:00
parent 6cd99cf17a
commit fc453d56fc
46 changed files with 1315 additions and 1584 deletions

View File

@ -2,6 +2,9 @@ plugins {
id 'java' id 'java'
id 'java-library' id 'java-library'
} }
apply from: '../spotless.gradle'
repositories { repositories {
mavenCentral() mavenCentral()
} }

View File

@ -9,28 +9,14 @@ public interface ChainOpener {
String register(String arg); String register(String arg);
void writeContractResultToLocalAndLedger( void writeContractResultToLocalAndLedger(String result, ContractClient client,
String result, ContractRequest contractRequest, OnHashCallback cb, long start, long l);
ContractClient client,
ContractRequest contractRequest,
OnHashCallback cb, long start, long l);
void writeToChain( void writeToChain(OnHashCallback cb, String from, String to, String data, String requestID,
OnHashCallback cb,
String from,
String to,
String data,
String requestID,
String namedLedger); String namedLedger);
void writeToChainWithContract( void writeToChainWithContract(OnHashCallback cb, String from, String to, String data,
OnHashCallback cb, String requestID, String contractID, String namedLedger);
String from,
String to,
String data,
String requestID,
String contractID,
String namedLedger);
JsonElement getLedgerParams(); JsonElement getLedgerParams();
} }

View File

@ -138,21 +138,16 @@ public class ContractClient {
// LOGGER.info("initProps ---- position-----2"); // LOGGER.info("initProps ---- position-----2");
String strEvent = get.syncGet("", "getDeclaredEvents", ""); String strEvent = get.syncGet("", "getDeclaredEvents", "");
LOGGER.debug("event: " + strEvent); LOGGER.debug("event: " + strEvent);
contractMeta.declaredEvents = contractMeta.declaredEvents = JsonUtil.fromJson(strEvent,
JsonUtil.fromJson( new TypeToken<Map<String, REventSemantics>>() {}.getType());
strEvent, new TypeToken<Map<String, REventSemantics>>() {
}.getType());
// LOGGER.info("initProps ---- position-----3"); // LOGGER.info("initProps ---- position-----3");
contractMeta.dependentContracts = JsonUtil.fromJson( contractMeta.dependentContracts =
get.syncGet("", "getDependentContracts", ""), JsonUtil.fromJson(get.syncGet("", "getDependentContracts", ""),
new TypeToken<Set<String>>() { new TypeToken<Set<String>>() {}.getType());
}.getType());
// LOGGER.info("initProps ---- position-----4"); // LOGGER.info("initProps ---- position-----4");
contractMeta.exportedFunctions = contractMeta.exportedFunctions =
JsonUtil.fromJson( JsonUtil.fromJson(get.syncGet("", "getExportedFunctions", ""),
get.syncGet("", "getExportedFunctions", ""), new TypeToken<List<FunctionDesp>>() {}.getType());
new TypeToken<List<FunctionDesp>>() {
}.getType());
contractMeta.logDetail = new HashMap<>(); contractMeta.logDetail = new HashMap<>();
for (FunctionDesp func : contractMeta.exportedFunctions) { for (FunctionDesp func : contractMeta.exportedFunctions) {
StringBuilder str = new StringBuilder(); StringBuilder str = new StringBuilder();
@ -164,8 +159,7 @@ public class ContractClient {
} }
if (anno.getType().equals("LogLocation")) { if (anno.getType().equals("LogLocation")) {
for (String logLoc : anno.getArgs()) { for (String logLoc : anno.getArgs()) {
if (logLoc.equals("\"dataware\"") if (logLoc.equals("\"dataware\"") || logLoc.equals("\"bdledger\"")
|| logLoc.equals("\"bdledger\"")
|| logLoc.equals("\"bdledger:\"")) { || logLoc.equals("\"bdledger:\"")) {
str.append("bdcontract;"); str.append("bdcontract;");
} else if (logLoc.startsWith("\"bdledger:") && logLoc.length() > 11) { } else if (logLoc.startsWith("\"bdledger:") && logLoc.length() > 11) {
@ -183,8 +177,7 @@ public class ContractClient {
String anno = get.syncGet("", "getAnnotations", ""); String anno = get.syncGet("", "getAnnotations", "");
contractMeta.annotations = contractMeta.annotations =
JsonUtil.fromJson(anno, new TypeToken<List<AnnotationNode>>() { JsonUtil.fromJson(anno, new TypeToken<List<AnnotationNode>>() {}.getType());
}.getType());
} catch (Exception e) { } catch (Exception e) {
// supoort contract process before version 0.70 // supoort contract process before version 0.70
@ -201,14 +194,12 @@ public class ContractClient {
contractMeta.contract = contractMeta.contract =
JsonUtil.fromJson(get.syncGet("", "getContract", ""), Contract.class); JsonUtil.fromJson(get.syncGet("", "getContract", ""), Contract.class);
contractMeta.id = contractMeta.contract.getID(); contractMeta.id = contractMeta.contract.getID();
get.setOfflineExceptionHandler( get.setOfflineExceptionHandler(new SocketGet.OfflineHandler() {
new SocketGet.OfflineHandler() {
@Override @Override
public void onException(SocketGet socketGet, Exception e) { public void onException(SocketGet socketGet, Exception e) {
if (e.getMessage().contains("Connection refused")) { if (e.getMessage().contains("Connection refused")) {
contractMeta.status = ContractStatusEnum.HANGED; contractMeta.status = ContractStatusEnum.HANGED;
ContractManager.instance.statusRecorder.resumeContractProcess( ContractManager.instance.statusRecorder.resumeContractProcess(contractMeta.id);
contractMeta.id);
} }
} }
}); });
@ -233,15 +224,12 @@ public class ContractClient {
String osJni = ((HardwareInfo.type == OSType.linux) ? "/jni/linux" : "/jni/mac"); String osJni = ((HardwareInfo.type == OSType.linux) ? "/jni/linux" : "/jni/mac");
darg += jniPath.getAbsolutePath() + osJni; darg += jniPath.getAbsolutePath() + osJni;
if (!new File(classpath).exists()) { if (!new File(classpath).exists()) {
ContractResult r = ContractResult r = new ContractResult(Status.Exception,
new ContractResult( new JsonPrimitive("incorrect path: yjs.jar"));
Status.Exception, new JsonPrimitive("incorrect path: yjs.jar"));
return JsonUtil.toJson(r); return JsonUtil.toJson(r);
} }
if (!new File(jniPath, "libs").exists()) { if (!new File(jniPath, "libs").exists()) {
ContractResult r = ContractResult r = new ContractResult(Status.Exception,
new ContractResult(
Status.Exception,
new JsonPrimitive("incorrect path: yjs.jar, missing libs")); new JsonPrimitive("incorrect path: yjs.jar, missing libs"));
return JsonUtil.toJson(r); return JsonUtil.toJson(r);
} }
@ -251,13 +239,17 @@ public class ContractClient {
pbParameters.add("-Dfile.encoding=UTF-8"); pbParameters.add("-Dfile.encoding=UTF-8");
pbParameters.add(darg); pbParameters.add(darg);
if (contractMeta.contract.getRemoteDebugPort() != 0) { if (contractMeta.contract.getRemoteDebugPort() != 0) {
pbParameters.add(String.format("-agentlib:jdwp=transport=dt_socket,address=%d,server=y,suspend=n", contractMeta.contract.getRemoteDebugPort())); pbParameters.add(String.format(
"-agentlib:jdwp=transport=dt_socket,address=%d,server=y,suspend=n",
contractMeta.contract.getRemoteDebugPort()));
} }
File classParent = new File(classpath).getParentFile(); File classParent = new File(classpath).getParentFile();
if (contractMeta.contract.isDebug()) { if (contractMeta.contract.isDebug()) {
pbParameters.add("-Dlog4j.configurationFile=" + new File(classParent, "log4j2.debug.properties").getAbsolutePath()); pbParameters.add("-Dlog4j.configurationFile="
+ new File(classParent, "log4j2.debug.properties").getAbsolutePath());
} else { } else {
pbParameters.add("-Dlog4j.configurationFile=" + new File(classParent, "log4j2.properties").getAbsolutePath()); pbParameters.add("-Dlog4j.configurationFile="
+ new File(classParent, "log4j2.properties").getAbsolutePath());
} }
pbParameters.add("-jar"); pbParameters.add("-jar");
pbParameters.add(classpath); pbParameters.add(classpath);
@ -268,7 +260,8 @@ public class ContractClient {
ProcessBuilder builder; ProcessBuilder builder;
String[] result = new String[pbParameters.size()]; String[] result = new String[pbParameters.size()];
pbParameters.toArray(result); pbParameters.toArray(result);
Constructor<ProcessBuilder> pbc = ProcessBuilder.class.getDeclaredConstructor(String[].class); Constructor<ProcessBuilder> pbc =
ProcessBuilder.class.getDeclaredConstructor(String[].class);
builder = pbc.newInstance(new Object[] {result}); builder = pbc.newInstance(new Object[] {result});
File directory = new File("./"); File directory = new File("./");
@ -294,10 +287,8 @@ public class ContractClient {
try { try {
// Set contractPort to max(mainPort, contractPort) // Set contractPort to max(mainPort, contractPort)
int portIndex = status.indexOf("mainPort"); int portIndex = status.indexOf("mainPort");
int port = int port = Integer.parseInt(
Integer.parseInt( status.substring(portIndex + 9, portIndex + 14).replaceAll("\\s+", ""));
status.substring(portIndex + 9, portIndex + 14)
.replaceAll("\\s+", ""));
if (port != startPort) { if (port != startPort) {
ContractManager.cPort.reSetPort(port + 1); ContractManager.cPort.reSetPort(port + 1);
} }
@ -327,20 +318,20 @@ public class ContractClient {
} }
get.syncGet("", "registerMangerPort", String.valueOf(ContractManager.cPort.getCMPort())); get.syncGet("", "registerMangerPort", String.valueOf(ContractManager.cPort.getCMPort()));
MultiContractMeta multiContractMeta = MultiContractMeta multiContractMeta = ContractManager.instance.multiContractRecorder
ContractManager.instance.multiContractRecorder.getMultiContractMeta(contractMeta.getID()); .getMultiContractMeta(contractMeta.getID());
if (multiContractMeta != null && multiContractMeta.getMembers() != null) { if (multiContractMeta != null && multiContractMeta.getMembers() != null) {
String setMemberResult = get.syncGet( String setMemberResult =
"", "setMembers", JsonUtil.toJson(multiContractMeta.getMembers())); get.syncGet("", "setMembers", JsonUtil.toJson(multiContractMeta.getMembers()));
LOGGER.info("setMember:" + setMemberResult); LOGGER.info("setMember:" + setMemberResult);
} else { } else {
LOGGER.info("setMember ignore, meta:" + (multiContractMeta == null) + (multiContractMeta == null ? "NULL" : " members:" + multiContractMeta.getMembers())); LOGGER.info("setMember ignore, meta:" + (multiContractMeta == null)
+ (multiContractMeta == null ? "NULL"
: " members:" + multiContractMeta.getMembers()));
} }
if (isBundlePath(contractMeta.contract.getScriptStr())) { if (isBundlePath(contractMeta.contract.getScriptStr())) {
status = status = get.syncGet("", "setContractBundle", JsonUtil.toJson(contractMeta.contract));
get.syncGet(
"", "setContractBundle", JsonUtil.toJson(contractMeta.contract));
} else { } else {
status = get.syncGet("", "setContract", JsonUtil.toJson(contractMeta.contract)); status = get.syncGet("", "setContract", JsonUtil.toJson(contractMeta.contract));
} }
@ -369,11 +360,7 @@ public class ContractClient {
return; return;
} }
lastUpdate = System.currentTimeMillis(); lastUpdate = System.currentTimeMillis();
get.asyncGet( get.asyncGet("", ".UsedMemory", "", new ResultCallback() {
"",
".UsedMemory",
"",
new ResultCallback() {
@Override @Override
public void onResult(String str) { public void onResult(String str) {
memory = Long.parseLong(str); memory = Long.parseLong(str);
@ -457,12 +444,10 @@ public class ContractClient {
} }
public void loadTimesAndTraffic() { public void loadTimesAndTraffic() {
String tempTime2 = String tempTime2 = KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(),
KeyValueDBUtil.instance.getValue( contractMeta.name + "-Times");
CMTables.ContractInfo.toString(), contractMeta.name + "-Times"); String tempTraffic2 = KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(),
String tempTraffic2 = contractMeta.name + "-Traffic");
KeyValueDBUtil.instance.getValue(
CMTables.ContractInfo.toString(), contractMeta.name + "-Traffic");
if (tempTime2 != null && !tempTime2.equals("")) { if (tempTime2 != null && !tempTime2.equals("")) {
times = Long.parseLong(tempTime2); times = Long.parseLong(tempTime2);
} }
@ -472,10 +457,10 @@ public class ContractClient {
} }
public void saveTimesAndTraffic() { public void saveTimesAndTraffic() {
KeyValueDBUtil.instance.setValue( KeyValueDBUtil.instance.setValue(CMTables.ContractInfo.toString(),
CMTables.ContractInfo.toString(), contractMeta.name + "-Times", times + ""); contractMeta.name + "-Times", times + "");
KeyValueDBUtil.instance.setValue( KeyValueDBUtil.instance.setValue(CMTables.ContractInfo.toString(),
CMTables.ContractInfo.toString(), contractMeta.name + "-Traffic", traffic + ""); contractMeta.name + "-Traffic", traffic + "");
} }
public void setMask(JsonObject args) { public void setMask(JsonObject args) {

View File

@ -38,22 +38,13 @@ import java.util.concurrent.*;
public class ContractManager { public class ContractManager {
public static final Object checkAndStartLock = new Object(); public static final Object checkAndStartLock = new Object();
static final Counter contractCounter = static final Counter contractCounter = Counter.build().name("execute_contract_counter")
Counter.build() .help("contract execution status").register();
.name("execute_contract_counter") static final Counter oracleCounter = Counter.build().name("execute_oracle_counter")
.help("contract execution status") .help("oracle execution status").register();
.register();
static final Counter oracleCounter =
Counter.build()
.name("execute_oracle_counter")
.help("oracle execution status")
.register();
static final Counter totalCounter = static final Counter totalCounter = Counter.build().name("execute_counter")
Counter.build() .help("contract and oracle execution status").register();
.name("execute_counter")
.help("contract and oracle execution status")
.register();
static final long memoryLimit = 100L * 1024L * 1024L; static final long memoryLimit = 100L * 1024L * 1024L;
private static final Logger LOGGER = LogManager.getLogger(ContractManager.class); private static final Logger LOGGER = LogManager.getLogger(ContractManager.class);
@ -66,12 +57,7 @@ public class ContractManager {
public static ContractPort cPort; public static ContractPort cPort;
public static boolean eventPersistenceEnabled = false; public static boolean eventPersistenceEnabled = false;
public static ExecutorService threadPool = public static ExecutorService threadPool =
new ThreadPoolExecutor( new ThreadPoolExecutor(8, 15, 60, TimeUnit.SECONDS, new SynchronousQueue<>());
8,
15,
60,
TimeUnit.SECONDS,
new SynchronousQueue<>());
public static ScheduledExecutorService scheduledThreadPool = public static ScheduledExecutorService scheduledThreadPool =
Executors.newScheduledThreadPool(10); Executors.newScheduledThreadPool(10);
@ -83,9 +69,8 @@ public class ContractManager {
KeyValueDBUtil.setupCM(); KeyValueDBUtil.setupCM();
KeyValueRocksDBUtil.setupCM(); KeyValueRocksDBUtil.setupCM();
TimeDBUtil.setupCM(); TimeDBUtil.setupCM();
logsDB = logsDB = new MultiIndexTimeRocksDBUtil("./ContractManagerDB",
new MultiIndexTimeRocksDBUtil( CMTables.LocalContractLogDB.toString());
"./ContractManagerDB", CMTables.LocalContractLogDB.toString());
} }
protected final EventBroker eventBroker; protected final EventBroker eventBroker;
@ -361,12 +346,8 @@ public class ContractManager {
} }
private static void fillContractResourceInfo( private static void fillContractResourceInfo(
Map<String, Map<String, String>> contractResourceInfo, Map<String, Map<String, String>> contractResourceInfo, String pid, String res,
String pid, String cpu, String mem, Scanner sc2) {
String res,
String cpu,
String mem,
Scanner sc2) {
sc2.close(); sc2.close();
Map<String, String> tmp = new HashMap<>(); Map<String, String> tmp = new HashMap<>();
@ -386,8 +367,8 @@ public class ContractManager {
return isNodeManager; return isNodeManager;
} }
public static void checkPointToLedger( public static void checkPointToLedger(OnHashCallback cb, String contractID, String data,
OnHashCallback cb, String contractID, String data, String requestID) { String requestID) {
boolean isMaster = instance.getContractIsMaster(contractID); boolean isMaster = instance.getContractIsMaster(contractID);
if (!isMaster) { if (!isMaster) {
LOGGER.info("非合约 " + contractID + "的master无需承担checkPoint上链任务!"); LOGGER.info("非合约 " + contractID + "的master无需承担checkPoint上链任务!");
@ -408,7 +389,8 @@ public class ContractManager {
return "bundle_" + md5; return "bundle_" + md5;
} else { } else {
String md5 = DigestUtils.md5Hex(c.getScriptStr()); String md5 = DigestUtils.md5Hex(c.getScriptStr());
if (c.getOwner() != null) md5 = DigestUtils.md5Hex(md5 + c.getOwner()); if (c.getOwner() != null)
md5 = DigestUtils.md5Hex(md5 + c.getOwner());
return "script_" + md5; return "script_" + md5;
} }
} catch (Exception e) { } catch (Exception e) {
@ -433,13 +415,15 @@ public class ContractManager {
public String getContractIDByName(String name) { public String getContractIDByName(String name) {
ContractMeta meta = statusRecorder.getContractMeta(name); ContractMeta meta = statusRecorder.getContractMeta(name);
if (meta != null) return meta.id; if (meta != null)
return meta.id;
return null; return null;
} }
public String getContractNameByID(String id) { public String getContractNameByID(String id) {
ContractMeta meta = statusRecorder.getContractMeta(id); ContractMeta meta = statusRecorder.getContractMeta(id);
if (meta != null) return meta.name; if (meta != null)
return meta.name;
return null; return null;
} }
@ -481,8 +465,8 @@ public class ContractManager {
} }
String result = client.get.syncGet("", "getDumpPeriod", "a"); String result = client.get.syncGet("", "getDumpPeriod", "a");
ContractMeta meta = client.contractMeta; ContractMeta meta = client.contractMeta;
addLocalContractLog( addLocalContractLog("getDumpPeriod", meta.contract.getID(), meta.name,
"getDumpPeriod", meta.contract.getID(), meta.name, meta.contract.getOwner()); meta.contract.getOwner());
if (!"failed".equals(result)) { if (!"failed".equals(result)) {
return result; return result;
@ -529,7 +513,8 @@ public class ContractManager {
if (f.exists() && f.isDirectory()) { if (f.exists() && f.isDirectory()) {
String path = null; String path = null;
for (File subFile : Objects.requireNonNull(f.listFiles())) { for (File subFile : Objects.requireNonNull(f.listFiles())) {
if (path == null) path = subFile.getName(); if (path == null)
path = subFile.getName();
else if (path.compareTo(subFile.getName()) < 0) { else if (path.compareTo(subFile.getName()) < 0) {
path = subFile.getName(); path = subFile.getName();
} }
@ -556,8 +541,8 @@ public class ContractManager {
loadProjectConfig(client); loadProjectConfig(client);
ContractMeta meta = client.contractMeta; ContractMeta meta = client.contractMeta;
addLocalContractLog( addLocalContractLog("changeDumpPeriod", meta.contract.getID(), meta.name,
"changeDumpPeriod", meta.contract.getID(), meta.name, meta.contract.getOwner()); meta.contract.getOwner());
r = new ContractResult(Status.Success, new JsonPrimitive("change dump period finished")); r = new ContractResult(Status.Success, new JsonPrimitive("change dump period finished"));
return JsonUtil.toJson(r); return JsonUtil.toJson(r);
@ -889,11 +874,10 @@ public class ContractManager {
ProjectConfig config = projectRecoder.getProjectConfig(client.getContractID()); ProjectConfig config = projectRecoder.getProjectConfig(client.getContractID());
LOGGER.debug("zz"); LOGGER.debug("zz");
String str = client.contractMeta.contract.getScriptStr(); String str = client.contractMeta.contract.getScriptStr();
/*if(config!=null){ /*
System.out.println("not NULL"); * if(config!=null){ System.out.println("not NULL");
client.setProjectConfig(JsonUtil.toJson(config)); * client.setProjectConfig(JsonUtil.toJson(config)); return; }
return; */
}*/
// TODO // TODO
loadMaskConfig(config, str); loadMaskConfig(config, str);
loadMockConfig(config, str); loadMockConfig(config, str);
@ -951,8 +935,8 @@ public class ContractManager {
KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), key); KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), key);
if (privateKeyStr == null || privateKeyStr.length() == 0) { if (privateKeyStr == null || privateKeyStr.length() == 0) {
privateKeyStr = SM2Util.generateSM2KeyPair().toJson(); privateKeyStr = SM2Util.generateSM2KeyPair().toJson();
KeyValueDBUtil.instance.setValue( KeyValueDBUtil.instance.setValue(CMTables.ContractInfo.toString(), key,
CMTables.ContractInfo.toString(), key, privateKeyStr); privateKeyStr);
} }
SM2KeyPair sm2Key = SM2KeyPair.fromJson(privateKeyStr); SM2KeyPair sm2Key = SM2KeyPair.fromJson(privateKeyStr);
c.setKey(sm2Key.getPrivateKey().toString(16)); c.setKey(sm2Key.getPrivateKey().toString(16));
@ -965,9 +949,8 @@ public class ContractManager {
if (JsonUtil.fromJson(ret, ContractResult.class).status == Status.Success) { if (JsonUtil.fromJson(ret, ContractResult.class).status == Status.Success) {
if (findConflictOfName(client.getContractName())) { if (findConflictOfName(client.getContractName())) {
invokeContractSuicide(client); invokeContractSuicide(client);
ContractResult r = ContractResult r = new ContractResult(Status.Error,
new ContractResult( new JsonPrimitive("Duplicate contract name."));
Status.Error, new JsonPrimitive("Duplicate contract name."));
return JsonUtil.toJson(r); return JsonUtil.toJson(r);
} }
} }
@ -1024,15 +1007,10 @@ public class ContractManager {
public void clearCache() { public void clearCache() {
final long time = System.currentTimeMillis() - 30000L; final long time = System.currentTimeMillis() - 30000L;
// LOGGER.info("try to clear cache, clear 0"); // LOGGER.info("try to clear cache, clear 0");
/* reqCache.entrySet() /*
.removeIf( * reqCache.entrySet() .removeIf( entry -> { RespCache cache = entry.getValue(); if (cache
entry -> { * == null) return true; if (cache.count < 0) return true; return cache.time < time; });
RespCache cache = entry.getValue(); *
if (cache == null) return true;
if (cache.count < 0) return true;
return cache.time < time;
});
*/ */
} }
@ -1045,11 +1023,8 @@ public class ContractManager {
LOGGER.debug("create cache:" + requestID); LOGGER.debug("create cache:" + requestID);
RespCache resp = new RespCache(); RespCache resp = new RespCache();
try { try {
resp.count = resp.count = Integer
Integer.parseInt( .parseInt(requestID.replaceFirst("[^_]*_", "").replaceAll("_.*$", ""));
requestID
.replaceFirst("[^_]*_", "")
.replaceAll("_.*$", ""));
} catch (Exception e) { } catch (Exception e) {
resp.count = 2; resp.count = 2;
} }
@ -1071,11 +1046,8 @@ public class ContractManager {
if (null == c.getContractID()) { if (null == c.getContractID()) {
LOGGER.info("合约Name转为ID error!"); LOGGER.info("合约Name转为ID error!");
cr = cr = new ContractResult(Status.Error,
new ContractResult( new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocallyAsync!"));
Status.Error,
new JsonPrimitive(
c.getContractID() + " Contract not Exists, CMLocallyAsync!"));
r.onResult(JsonUtil.toJson(cr)); r.onResult(JsonUtil.toJson(cr));
return; return;
} }
@ -1084,11 +1056,8 @@ public class ContractManager {
final ContractClient client = getClient(c.getContractID()); final ContractClient client = getClient(c.getContractID());
if (null == client) { if (null == client) {
cr = cr = new ContractResult(Status.Error,
new ContractResult( new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocallyAsync!"));
Status.Error,
new JsonPrimitive(
c.getContractID() + " Contract not Exists, CMLocallyAsync!"));
r.onResult(JsonUtil.toJson(cr)); r.onResult(JsonUtil.toJson(cr));
return; return;
} }
@ -1107,10 +1076,7 @@ public class ContractManager {
LOGGER.info("[Hit Cache] " + requestID); LOGGER.info("[Hit Cache] " + requestID);
r.onResult(cache.val); r.onResult(cache.val);
} else { } else {
executeInternalAsync( executeInternalAsync(client, c, new ResultCallback() {
client,
c,
new ResultCallback() {
@Override @Override
public void onResult(String str) { public void onResult(String str) {
cache.time = start; cache.time = start;
@ -1118,16 +1084,13 @@ public class ContractManager {
r.onResult(cache.val); r.onResult(cache.val);
cache.notifyAllWaiter(); cache.notifyAllWaiter();
} }
}, }, cb);
cb);
} }
return; return;
} }
} else { } else {
ContractResult re = ContractResult re = new ContractResult(Status.Error,
new ContractResult(
Status.Error,
new JsonPrimitive("Timeout due to insufficient requester")); new JsonPrimitive("Timeout due to insufficient requester"));
r.onResult(JsonUtil.toJson(re)); r.onResult(JsonUtil.toJson(re));
return; return;
@ -1156,7 +1119,8 @@ public class ContractManager {
request.setAction("getGlobal"); request.setAction("getGlobal");
request.setPublicKey(client.contractMeta.getPubkey()); request.setPublicKey(client.contractMeta.getPubkey());
request.doSignature(client.contractMeta.contract.key); request.doSignature(client.contractMeta.contract.key);
ContractResult result = JsonUtil.fromJson(executeLocally(request, null), ContractResult.class); ContractResult result =
JsonUtil.fromJson(executeLocally(request, null), ContractResult.class);
return JsonUtil.toJson(result.result); return JsonUtil.toJson(result.result);
} }
@ -1171,11 +1135,8 @@ public class ContractManager {
String requestID = c.getRequestID(); String requestID = c.getRequestID();
if (c.getContractID() == null) { if (c.getContractID() == null) {
LOGGER.error("合约Name转为ID error!"); LOGGER.error("合约Name转为ID error!");
ContractResult cr = ContractResult cr = new ContractResult(Status.Error,
new ContractResult( new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocally!"));
Status.Error,
new JsonPrimitive(
c.getContractID() + " Contract not Exists, CMLocally!"));
return JsonUtil.toJson(cr); return JsonUtil.toJson(cr);
} }
@ -1183,11 +1144,8 @@ public class ContractManager {
ContractResult cr2; ContractResult cr2;
ContractClient client = getClient(c.getContractID()); ContractClient client = getClient(c.getContractID());
if (client == null) { if (client == null) {
cr2 = cr2 = new ContractResult(Status.Error,
new ContractResult( new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocally!"));
Status.Error,
new JsonPrimitive(
c.getContractID() + " Contract not Exists, CMLocally!"));
return JsonUtil.toJson(cr2); return JsonUtil.toJson(cr2);
} }
@ -1211,9 +1169,7 @@ public class ContractManager {
} }
} }
} else { } else {
ContractResult re = ContractResult re = new ContractResult(Status.Error,
new ContractResult(
Status.Error,
new JsonPrimitive("Timeout due to insufficient requester")); new JsonPrimitive("Timeout due to insufficient requester"));
return JsonUtil.toJson(re); return JsonUtil.toJson(re);
} }
@ -1224,8 +1180,8 @@ public class ContractManager {
return executeInternal(client, c, cb); return executeInternal(client, c, cb);
} }
private void executeInternalAsync( private void executeInternalAsync(ContractClient client, ContractRequest request,
ContractClient client, ContractRequest request, ResultCallback rcb, OnHashCallback cb) { ResultCallback rcb, OnHashCallback cb) {
ContractResult cr; ContractResult cr;
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
@ -1233,8 +1189,7 @@ public class ContractManager {
client.contractStatus = ContractStatus.Executing; client.contractStatus = ContractStatus.Executing;
ResultCallback acb; ResultCallback acb;
// use to write to chian // use to write to chian
acb = acb = new ResultCallback() {
new ResultCallback() {
@Override @Override
public void onResult(String result) { public void onResult(String result) {
client.traffic += result.length(); client.traffic += result.length();
@ -1243,13 +1198,8 @@ public class ContractManager {
JsonObject finalRet = JsonUtil.parseStringAsJsonObject(result); JsonObject finalRet = JsonUtil.parseStringAsJsonObject(result);
rcb.onResult(finalRet); rcb.onResult(finalRet);
chainOpener.writeContractResultToLocalAndLedger( chainOpener.writeContractResultToLocalAndLedger(finalRet.toString(), client,
finalRet.toString(), request, cb, start, System.currentTimeMillis() - start);
client,
request,
cb,
start,
System.currentTimeMillis() - start);
if (client.contractMeta.getYjsType() == YjsType.Oracle) { if (client.contractMeta.getYjsType() == YjsType.Oracle) {
oracleCounter.inc(); oracleCounter.inc();
} else { } else {
@ -1271,8 +1221,8 @@ public class ContractManager {
client.get.asyncGet("", "executeContract", JsonUtil.toJson(request), acb); client.get.asyncGet("", "executeContract", JsonUtil.toJson(request), acb);
} }
private String executeInternal( private String executeInternal(ContractClient client, ContractRequest request,
ContractClient client, ContractRequest request, OnHashCallback ocb) { OnHashCallback ocb) {
// LOGGER.info("ContractManager executeInternal : "); // LOGGER.info("ContractManager executeInternal : ");
ContractResult cr; ContractResult cr;
@ -1288,10 +1238,11 @@ public class ContractManager {
client.traffic += result.length(); client.traffic += result.length();
if (client.getContractCopies() == 1) { if (client.getContractCopies() == 1) {
extractEventsFromContractResult(ocb, JsonUtil.parseStringAsJsonObject(result), client, request, start); extractEventsFromContractResult(ocb, JsonUtil.parseStringAsJsonObject(result), client,
request, start);
} }
chainOpener.writeContractResultToLocalAndLedger( chainOpener.writeContractResultToLocalAndLedger(result, client, request, ocb, start,
result, client, request, ocb, start, System.currentTimeMillis() - start); System.currentTimeMillis() - start);
contractCounter.inc(); contractCounter.inc();
return result; return result;
} }
@ -1301,45 +1252,29 @@ public class ContractManager {
* *
* @author Kaidong Wu * @author Kaidong Wu
*/ */
public void extractEventsFromContractResult( public void extractEventsFromContractResult(OnHashCallback ocb, JsonObject result,
OnHashCallback ocb, ContractClient client, ContractRequest request, long startTime) {
JsonObject result,
ContractClient client,
ContractRequest request,
long startTime) {
try { try {
ContractResult cr = JsonUtil.fromJson(result, ContractResult.class); ContractResult cr = JsonUtil.fromJson(result, ContractResult.class);
if (null != cr.events && !cr.events.isEmpty()) { if (null != cr.events && !cr.events.isEmpty()) {
List<REvent> msgList = cr.events; List<REvent> msgList = cr.events;
cr.events = null; cr.events = null;
chainOpener.writeContractResultToLocalAndLedger( chainOpener.writeContractResultToLocalAndLedger(result.toString(), client, request,
result.toString(),
client,
request,
(reqID, hashStr) -> { (reqID, hashStr) -> {
if (eventPersistenceEnabled) { if (eventPersistenceEnabled) {
msgList.forEach( msgList.forEach(msg -> {
msg -> {
msg.setTxHash(hashStr); msg.setTxHash(hashStr);
msg.doSignature( msg.doSignature(client.getPubkey(), client.getContractKey());
client.getPubkey(), client.getContractKey());
eventBroker.handle(msg); eventBroker.handle(msg);
}); });
} }
if (null != ocb) { if (null != ocb) {
ocb.publishHash(reqID, hashStr); ocb.publishHash(reqID, hashStr);
} }
}, }, startTime, System.currentTimeMillis() - startTime);
startTime,
System.currentTimeMillis() - startTime);
if (!eventPersistenceEnabled) { if (!eventPersistenceEnabled) {
threadPool.submit( threadPool.submit(() -> msgList.forEach(e -> {
() -> e.doSignature(client.getPubkey(), client.contractMeta.contract.getKey());
msgList.forEach(
e -> {
e.doSignature(
client.getPubkey(),
client.contractMeta.contract.getKey());
eventBroker.handle(e); eventBroker.handle(e);
})); }));
} }
@ -1368,8 +1303,8 @@ public class ContractManager {
return resultCallback.strRet; return resultCallback.strRet;
} }
public void executeContractInternal( public void executeContractInternal(ContractRequest cr, final ResultCallback rcb,
ContractRequest cr, final ResultCallback rcb, final OnHashCallback hcb) { final OnHashCallback hcb) {
LOGGER.debug(JsonUtil.toJson(cr)); LOGGER.debug(JsonUtil.toJson(cr));
ContractMeta meta = statusRecorder.getContractMeta(cr.getContractID()); ContractMeta meta = statusRecorder.getContractMeta(cr.getContractID());
MultiContractMeta multiMeta = MultiContractMeta multiMeta =
@ -1389,14 +1324,11 @@ public class ContractManager {
@Override @Override
public void onResult(JsonObject result) { public void onResult(JsonObject result) {
ContractManager.instance.extractEventsFromContractResult( ContractManager.instance.extractEventsFromContractResult(null, result, client,
null, result, client, cr, start); cr, start);
LOGGER.debug( LOGGER.debug(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") .format(new Date(System.currentTimeMillis())) + meta.contractExecutor
.format(new Date(System.currentTimeMillis())) + " result=" + result.toString() + "\n");
+ meta.contractExecutor + " result="
+ result.toString()
+ "\n");
rcb.onResult(result); rcb.onResult(result);
} }
}; };
@ -1439,17 +1371,12 @@ public class ContractManager {
return; return;
// result = masterStub.executeByOtherNode(pubKey, cr); // result = masterStub.executeByOtherNode(pubKey, cr);
} else { } else {
result = result = new ContractResult(Status.Error, new JsonPrimitive(
new ContractResult( "Contract " + cr.getContractID() + "can't be located in router"));
Status.Error,
new JsonPrimitive(
"Contract "
+ cr.getContractID()
+ "can't be located in router"));
// 告知NC重选 // 告知NC重选
/* /*
好像有点问题之前这么写是觉得找不到的话是因为master出问题了需要重选但是没考虑到这个合约确实不存在 * 好像有点问题之前这么写是觉得找不到的话是因为master出问题了需要重选但是没考虑到这个合约确实不存在
但是可能也不影响如果这个合约确实不存在那么即使NC发起了选举也不会真的进行选举 * 但是可能也不影响如果这个合约确实不存在那么即使NC发起了选举也不会真的进行选举
*/ */
// JsonObject jo = new JsonObject(); // JsonObject jo = new JsonObject();
// jo.addProperty("action", "NCStartElect"); // jo.addProperty("action", "NCStartElect");
@ -1459,11 +1386,8 @@ public class ContractManager {
// master为null发请求给master令其发启选举"); // master为null发请求给master令其发启选举");
} }
} else { } else {
result = result = new ContractResult(Status.Error,
new ContractResult( new JsonPrimitive("Contract " + cr.getContractID() + " doesn't exists!!"));
Status.Error,
new JsonPrimitive(
"Contract " + cr.getContractID() + " doesn't exists!!"));
} }
rcb.onResult(JsonUtil.parseObjectAsJsonObject(result)); rcb.onResult(JsonUtil.parseObjectAsJsonObject(result));
} }
@ -1575,7 +1499,8 @@ public class ContractManager {
boolean isNodeManager = checkNodeManager(owner); boolean isNodeManager = checkNodeManager(owner);
List<ContractInfo> ret = new ArrayList<>(); List<ContractInfo> ret = new ArrayList<>();
for (ContractMeta client : statusRecorder.getStatus().values()) { for (ContractMeta client : statusRecorder.getStatus().values()) {
if (client.contract == null) continue; if (client.contract == null)
continue;
if (!client.contract.getOwner().equals(owner) && !isNodeManager) { if (!client.contract.getOwner().equals(owner) && !isNodeManager) {
continue; continue;
} }
@ -1592,8 +1517,7 @@ public class ContractManager {
} }
void sortContractInfoList(List<ContractInfo> infoList, String firstID) { void sortContractInfoList(List<ContractInfo> infoList, String firstID) {
infoList.sort( infoList.sort((o1, o2) -> {
(o1, o2) -> {
if (o1.id.equals(firstID)) { if (o1.id.equals(firstID)) {
return -1; return -1;
} }
@ -1617,8 +1541,10 @@ public class ContractManager {
for (ContractMeta client : statusRecorder.getStatus().values()) { for (ContractMeta client : statusRecorder.getStatus().values()) {
ContractInfo contractInfo = fillContractInfo(client); ContractInfo contractInfo = fillContractInfo(client);
ContractClient contractClient = statusRecorder.getContractClient(contractInfo.id); ContractClient contractClient = statusRecorder.getContractClient(contractInfo.id);
if (contractClient != null) contractInfo.pid = contractClient.getPID(); if (contractClient != null)
else contractInfo.pid = "-1"; contractInfo.pid = contractClient.getPID();
else
contractInfo.pid = "-1";
if (!contractInfo.pid.equals("-1") && !contractInfo.pid.equals("0")) { if (!contractInfo.pid.equals("-1") && !contractInfo.pid.equals("0")) {
try { try {
assert cris != null; assert cris != null;
@ -1651,24 +1577,39 @@ public class ContractManager {
// System.out.println(line); // System.out.println(line);
if (line.contains("%Cpu(s):")) { if (line.contains("%Cpu(s):")) {
Scanner sc2 = new Scanner(new ByteArrayInputStream(line.getBytes())); Scanner sc2 = new Scanner(new ByteArrayInputStream(line.getBytes()));
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNext()) sc2.next(); sc2.next();
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNext()) sc2.next(); sc2.next();
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNext()) sc2.next(); sc2.next();
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNextFloat()) freeCPU = sc2.nextFloat() + "%"; sc2.next();
if (sc2.hasNext())
sc2.next();
if (sc2.hasNext())
sc2.next();
if (sc2.hasNext())
sc2.next();
if (sc2.hasNextFloat())
freeCPU = sc2.nextFloat() + "%";
sc2.close(); sc2.close();
} else if (line.contains("MiB Mem :")) { } else if (line.contains("MiB Mem :")) {
Scanner sc2 = new Scanner(new ByteArrayInputStream(line.getBytes())); Scanner sc2 = new Scanner(new ByteArrayInputStream(line.getBytes()));
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNext()) sc2.next(); sc2.next();
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNextFloat()) totalMEM = sc2.nextFloat(); sc2.next();
if (sc2.hasNext()) sc2.next(); if (sc2.hasNext())
if (sc2.hasNext()) sc2.next(); sc2.next();
if (sc2.hasNext()) sc2.next(); if (sc2.hasNextFloat())
totalMEM = sc2.nextFloat();
if (sc2.hasNext())
sc2.next();
if (sc2.hasNext())
sc2.next();
if (sc2.hasNext())
sc2.next();
if (sc2.hasNextFloat()) if (sc2.hasNextFloat())
freeMEM = String.format("%.1f", totalMEM - sc2.nextFloat()) + " MiB"; freeMEM = String.format("%.1f", totalMEM - sc2.nextFloat()) + " MiB";
sc2.close(); sc2.close();
@ -1712,23 +1653,15 @@ public class ContractManager {
return result; return result;
} }
/* /*
{ * { "name": "dx_substr", "parameter": { "columnIndex":5, "paras":["1","3"] } },
"name": "dx_substr", */
"parameter": /*
{ * public String resetMask(String contractName, JsonObject MaskObject) { ContractClient client =
"columnIndex":5, * getByName(contractName); System.out.println("contractName"+client.getContractName());
"paras":["1","3"] *
} * //String result = client.get.syncGet("", "changeDebugFlag", String.valueOf(isDebug));
}, * //設置clinet當中的mask client.contractMeta.isDebug = isDebug; return "resetMask"; }
*/ */
/*public String resetMask(String contractName, JsonObject MaskObject) {
ContractClient client = getByName(contractName);
System.out.println("contractName"+client.getContractName());
//String result = client.get.syncGet("", "changeDebugFlag", String.valueOf(isDebug));
//設置clinet當中的mask client.contractMeta.isDebug = isDebug;
return "resetMask";
}*/
public String dumpContract(String contractID, String path) { public String dumpContract(String contractID, String path) {
// LOGGER.info(contractID); // LOGGER.info(contractID);
@ -1770,8 +1703,10 @@ public class ContractManager {
} }
public String loadMemory(ContractClient client, String path) { public String loadMemory(ContractClient client, String path) {
if (client == null) return "no such contract client"; if (client == null)
if (path == null || path.length() == 0) return "no such memory file"; return "no such contract client";
if (path == null || path.length() == 0)
return "no such memory file";
addLocalContractLog("loadMemory", client.contractMeta); addLocalContractLog("loadMemory", client.contractMeta);
return client.get.syncGet("", "loadMemory", path); return client.get.syncGet("", "loadMemory", path);
} }
@ -1810,13 +1745,12 @@ public class ContractManager {
try { try {
ContractClient client = getClient(contractID); ContractClient client = getClient(contractID);
if (client != null) { if (client != null) {
return new ContractResult( return new ContractResult(Status.Success,
Status.Success,
new JsonPrimitive(client.get.syncGet("", "getLogSize", ""))); new JsonPrimitive(client.get.syncGet("", "getLogSize", "")));
} }
// return new ContractResult(Status.Error, "cannot find contractID: " + contractID); // return new ContractResult(Status.Error, "cannot find contractID: " + contractID);
return new ContractResult( return new ContractResult(Status.Error,
Status.Error, new JsonPrimitive("cannot find contractID: " + contractID)); new JsonPrimitive("cannot find contractID: " + contractID));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage())); return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage()));
@ -1827,13 +1761,11 @@ public class ContractManager {
try { try {
ContractClient client = getClient(contractID); ContractClient client = getClient(contractID);
if (client != null) { if (client != null) {
return new ContractResult( return new ContractResult(Status.Success, new JsonPrimitive(
Status.Success,
new JsonPrimitive(
client.get.syncGet("", "requestLog", offset + "," + count))); client.get.syncGet("", "requestLog", offset + "," + count)));
} }
return new ContractResult( return new ContractResult(Status.Error,
Status.Error, new JsonPrimitive("cannot find contractID: " + contractID)); new JsonPrimitive("cannot find contractID: " + contractID));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage())); return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage()));
@ -1844,13 +1776,11 @@ public class ContractManager {
try { try {
ContractClient client = getClient(contractID); ContractClient client = getClient(contractID);
if (client != null) { if (client != null) {
return new ContractResult( return new ContractResult(Status.Success, new JsonPrimitive(
Status.Success,
new JsonPrimitive(
client.get.syncGet("", "requestLastLog", String.valueOf(count)))); client.get.syncGet("", "requestLastLog", String.valueOf(count))));
} }
return new ContractResult( return new ContractResult(Status.Error,
Status.Error, new JsonPrimitive("cannot find contractID: " + contractID)); new JsonPrimitive("cannot find contractID: " + contractID));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage())); return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage()));
@ -1858,39 +1788,20 @@ public class ContractManager {
} }
/* /*
public void addContractInfo(String name, String owner, String traffic, String times) { * public void addContractInfo(String name, String owner, String traffic, String times) {
KeyValueDBUtil.instance.setValue( * KeyValueDBUtil.instance.setValue( CMTables.ContractInfo.toString(), name, "{\"owner\":\"" +
CMTables.ContractInfo.toString(), * owner + "\",\"traffic\":\"" + traffic + "\",\"times\":\"" + times + "\"}"); }
name,
"{\"owner\":\""
+ owner
+ "\",\"traffic\":\""
+ traffic
+ "\",\"times\":\""
+ times
+ "\"}");
}
*/ */
public void addLocalContractLog( public void addLocalContractLog(String action, String contractId, String contractName,
String action, String contractId, String contractName, String pubKey) { String pubKey) {
String sb = String sb = "{\"action\":\"" + action + "\",\"pubKey\":\"" + pubKey + "\",\"contractID\":\""
"{\"action\":\"" + contractId + "\",\"contractName\":\"" + contractName + "\",\"date\":"
+ action + System.currentTimeMillis() + "}";
+ "\",\"pubKey\":\""
+ pubKey
+ "\",\"contractID\":\""
+ contractId
+ "\",\"contractName\":\""
+ contractName
+ "\",\"date\":"
+ System.currentTimeMillis()
+ "}";
logsDB.put(contractName, sb); logsDB.put(contractName, sb);
} }
public void changePermission(String contractFileName, String pmList) { public void changePermission(String contractFileName, String pmList) {}
}
// public String getSyncType(String contractName) { // public String getSyncType(String contractName) {
// ContractClient client = getByName(contractName); // ContractClient client = getByName(contractName);
@ -1940,58 +1851,28 @@ public class ContractManager {
// return result; // return result;
// } // }
public void addLocalContractLog( public void addLocalContractLog(String action, String contractId, String contractName,
String action, String pubKey, String function, String costTime, long totalGas, long executionGas,
String contractId, long extraGas, Map<String, String> logType) {
String contractName,
String pubKey,
String function,
String costTime,
long totalGas,
long executionGas,
long extraGas,
Map<String, String> logType) {
contractCounter.inc(); contractCounter.inc();
if (logType == null || logType.isEmpty()) { if (logType == null || logType.isEmpty()) {
logsDB.put( logsDB.put(contractName,
contractName,
String.format( String.format(
"{\"action\":\"%s\",\"pubKey\":\"%s\"," "{\"action\":\"%s\",\"pubKey\":\"%s\","
+ "\"contractID\":\"%s\",\"contractName\":\"%s\"," + "\"contractID\":\"%s\",\"contractName\":\"%s\","
+ "\"function\":\"%s\",\"costTime\":\"%s\"," + "\"function\":\"%s\",\"costTime\":\"%s\","
+ "\"totalGas\":\"%d\",\"executionGas\":\"%d\"," + "\"totalGas\":\"%d\",\"executionGas\":\"%d\","
+ "\"extraGas\":\"%d\",\"date\":\"%d\"}", + "\"extraGas\":\"%d\",\"date\":\"%d\"}",
action, action, pubKey, contractId, contractName, function, costTime, totalGas,
pubKey, executionGas, extraGas, System.currentTimeMillis()));
contractId,
contractName,
function,
costTime,
totalGas,
executionGas,
extraGas,
System.currentTimeMillis()));
} else { } else {
StringBuilder str = StringBuilder str = new StringBuilder().append("{\"action\":\"").append(action)
new StringBuilder() .append("\",\"pubKey\":\"").append(pubKey).append("\",\"contractID\":\"")
.append("{\"action\":\"") .append(contractId).append("\",\"contractName\":\"").append(contractName)
.append(action) .append("\",\"function\":\"").append(function).append("\",\"costTime\":\"")
.append("\",\"pubKey\":\"") .append(costTime).append("\",\"totalGas\":\"").append(totalGas)
.append(pubKey) .append("\",\"executionGas\":\"").append(executionGas)
.append("\",\"contractID\":\"") .append("\",\"extraGas\":\"").append(extraGas);
.append(contractId)
.append("\",\"contractName\":\"")
.append(contractName)
.append("\",\"function\":\"")
.append(function)
.append("\",\"costTime\":\"")
.append(costTime)
.append("\",\"totalGas\":\"")
.append(totalGas)
.append("\",\"executionGas\":\"")
.append(executionGas)
.append("\",\"extraGas\":\"")
.append(extraGas);
for (String key : logType.keySet()) { for (String key : logType.keySet()) {
str.append("\",\"").append(key).append("\":\"").append(logType.get(key)); str.append("\",\"").append(key).append("\":\"").append(logType.get(key));
@ -2002,13 +1883,12 @@ public class ContractManager {
} }
public String getTimesOfExecution(String contractName) { public String getTimesOfExecution(String contractName) {
return KeyValueDBUtil.instance.getValue( return KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(),
CMTables.ContractInfo.toString(), contractName + "-Times"); contractName + "-Times");
} }
public String getControlFlow(Contract c) { public String getControlFlow(Contract c) {
if (null == analysisClient if (null == analysisClient || null == analysisClient.process
|| null == analysisClient.process
|| !analysisClient.process.isAlive()) { || !analysisClient.process.isAlive()) {
initAnalysisClient(); initAnalysisClient();
} }
@ -2089,12 +1969,8 @@ public class ContractManager {
String ret = client.get.syncGet("", "suicide", ""); String ret = client.get.syncGet("", "suicide", "");
JsonObject jo = JsonUtil.parseStringAsJsonObject(ret); JsonObject jo = JsonUtil.parseStringAsJsonObject(ret);
if (jo.has("cleanSub")) { if (jo.has("cleanSub")) {
REvent msg = REvent msg = new REvent(null, REvent.REventType.UNSUBSCRIBE,
new REvent( "{\"subscriber\":\"" + client.getContractName() + "\"}", "");
null,
REvent.REventType.UNSUBSCRIBE,
"{\"subscriber\":\"" + client.getContractName() + "\"}",
"");
msg.doSignature(client.getPubkey(), client.getContractKey()); msg.doSignature(client.getPubkey(), client.getContractKey());
eventBroker.handle(msg); eventBroker.handle(msg);
} }
@ -2104,8 +1980,7 @@ public class ContractManager {
} }
public String parseYpkPermissions(String ypkPath) { public String parseYpkPermissions(String ypkPath) {
if (null == analysisClient if (null == analysisClient || null == analysisClient.process
|| null == analysisClient.process
|| !analysisClient.process.isAlive()) { || !analysisClient.process.isAlive()) {
initAnalysisClient(); initAnalysisClient();
} }
@ -2113,8 +1988,7 @@ public class ContractManager {
} }
public String staticVerify(Contract c) { public String staticVerify(Contract c) {
if (null == analysisClient if (null == analysisClient || null == analysisClient.process
|| null == analysisClient.process
|| !analysisClient.process.isAlive()) { || !analysisClient.process.isAlive()) {
initAnalysisClient(); initAnalysisClient();
} }
@ -2183,7 +2057,8 @@ public class ContractManager {
this.sc = sc; this.sc = sc;
this.TAG = tag; this.TAG = tag;
psList = new ArrayList<>(); psList = new ArrayList<>();
if (printStream != null) psList.add(printStream); if (printStream != null)
psList.add(printStream);
toRemove = new HashSet<>(); toRemove = new HashSet<>();
start(); start();
} }

View File

@ -31,14 +31,7 @@ public class ContractMeta implements IDSerializable {
boolean sigRequired; boolean sigRequired;
String thisPermission; // 合约当前权限 String thisPermission; // 合约当前权限
/* /*
{ * { "name": "dx_substr", "parameter": { "columnIndex":5, "paras":["1","3"] } },
"name": "dx_substr",
"parameter":
{
"columnIndex":5,
"paras":["1","3"]
}
},
*/ */
// Map<Object,Object>MaskInfo; // Map<Object,Object>MaskInfo;
@ -116,7 +109,8 @@ public class ContractMeta implements IDSerializable {
private FunctionDesp seekFunction(String action) { private FunctionDesp seekFunction(String action) {
for (FunctionDesp desp : exportedFunctions) { for (FunctionDesp desp : exportedFunctions) {
if (desp != null && desp.functionName.equals(action)) return desp; if (desp != null && desp.functionName.equals(action))
return desp;
} }
return null; return null;
} }

View File

@ -1,10 +1,8 @@
package org.bdware.sc; package org.bdware.sc;
public enum ContractStatusEnum { public enum ContractStatusEnum {
INIT(0, "初始化"), INIT(0, "初始化"), RUNNING(1, "内存运行中"), HANGED(2, "硬盘运行中"), KILLED(3, "已停止");
RUNNING(1, "内存运行中"),
HANGED(2, "硬盘运行中"),
KILLED(3, "已停止");
private Integer code; private Integer code;
private String desc; private String desc;

View File

@ -33,8 +33,7 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
static { static {
final Object flag = new Object(); final Object flag = new Object();
// 调度一个task在delayms后开始调度每次调度完后最少等待periodms后才开始调 // 调度一个task在delayms后开始调度每次调度完后最少等待periodms后才开始调
ContractManager.scheduledThreadPool.scheduleWithFixedDelay( ContractManager.scheduledThreadPool.scheduleWithFixedDelay(() -> {
() -> {
boolean cleared = dealTimerContractProcess(); boolean cleared = dealTimerContractProcess();
if (cleared) { if (cleared) {
synchronized (flag) { synchronized (flag) {
@ -45,10 +44,7 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
} }
} }
} }
}, }, 0, 1, TimeUnit.SECONDS);
0,
1,
TimeUnit.SECONDS);
} }
// contract id to client, changes when some contract is started/stopped/resumed // contract id to client, changes when some contract is started/stopped/resumed
@ -102,7 +98,8 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
// TODO 是不是还有别的这只是在内存里的哦 // TODO 是不是还有别的这只是在内存里的哦
try { try {
for (ContractClient c : id2ContractClient.values()) { for (ContractClient c : id2ContractClient.values()) {
if (Integer.parseInt(c.getPID()) == pid) return true; if (Integer.parseInt(c.getPID()) == pid)
return true;
} }
} catch (Exception e) { } catch (Exception e) {
// e.printStackTrace(); // e.printStackTrace();
@ -174,9 +171,11 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
// TODO index name to contract // TODO index name to contract
public ContractMeta getContractMeta(String idOrNameOrDOI) { public ContractMeta getContractMeta(String idOrNameOrDOI) {
if (idOrNameOrDOI == null) return null; if (idOrNameOrDOI == null)
return null;
ContractMeta meta = getStatus().get(idOrNameOrDOI); ContractMeta meta = getStatus().get(idOrNameOrDOI);
if (meta != null) return meta; if (meta != null)
return meta;
for (ContractMeta cc : getStatus().values()) { for (ContractMeta cc : getStatus().values()) {
if (cc.status == ContractStatusEnum.RUNNING || cc.status == ContractStatusEnum.HANGED) if (cc.status == ContractStatusEnum.RUNNING || cc.status == ContractStatusEnum.HANGED)
if (idOrNameOrDOI.equals(cc.name)) { if (idOrNameOrDOI.equals(cc.name)) {
@ -184,8 +183,10 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
} }
} }
for (ContractMeta cc : getStatus().values()) { for (ContractMeta cc : getStatus().values()) {
if (cc.name == null) continue; if (cc.name == null)
if (cc.contract == null) continue; continue;
if (cc.contract == null)
continue;
if (idOrNameOrDOI.equals(cc.name)) { if (idOrNameOrDOI.equals(cc.name)) {
return cc; return cc;
} }
@ -224,9 +225,7 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
LOGGER.info("need dump when stop"); LOGGER.info("need dump when stop");
String contractName = client.getContractName(); String contractName = client.getContractName();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss");
File f = File f = new File(ContractManager.dir + "/memory/" + contractName,
new File(
ContractManager.dir + "/memory/" + contractName,
df.format(new Date())); df.format(new Date()));
client.get.syncGet("", "getMemoryDump", f.getAbsolutePath()); client.get.syncGet("", "getMemoryDump", f.getAbsolutePath());
ContractManager.instance.addLocalContractLog("dumpContract", meta); ContractManager.instance.addLocalContractLog("dumpContract", meta);
@ -313,13 +312,12 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
client.saveTimesAndTraffic(); client.saveTimesAndTraffic();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH_mm_ss"); // 设置日期格式 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH_mm_ss"); // 设置日期格式
File f = File f = new File(ContractManager.dir + "/memory/" + contractMeta.name,
new File(
ContractManager.dir + "/memory/" + contractMeta.name,
df.format(new Date())); df.format(new Date()));
File parent = f.getParentFile(); File parent = f.getParentFile();
if (!parent.exists()) { if (!parent.exists()) {
LOGGER.trace("make directory " + parent.getAbsolutePath() + ":" + parent.mkdirs()); LOGGER.trace(
"make directory " + parent.getAbsolutePath() + ":" + parent.mkdirs());
} }
ContractManager.instance.dumpContract(contract.getID(), f.getAbsolutePath()); ContractManager.instance.dumpContract(contract.getID(), f.getAbsolutePath());
ContractManager.instance.invokeContractSuicide(client); ContractManager.instance.invokeContractSuicide(client);
@ -344,17 +342,11 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
JsonUtil.fromJson(startContractResult, ContractResult.class); JsonUtil.fromJson(startContractResult, ContractResult.class);
if (contractResult.status == ContractResult.Status.Error) { if (contractResult.status == ContractResult.Status.Error) {
// 记录错误日志 // 记录错误日志
ContractManager.instance.addLocalContractLog( ContractManager.instance.addLocalContractLog("resumeContract error",
"resumeContract error", meta.contract.getID(), meta.name, meta.contract.getOwner());
meta.contract.getID(),
meta.name,
meta.contract.getOwner());
} else { } else {
ContractManager.instance.addLocalContractLog( ContractManager.instance.addLocalContractLog("resumeContract success",
"resumeContract success", meta.contract.getID(), meta.name, meta.contract.getOwner());
meta.contract.getID(),
meta.name,
meta.contract.getOwner());
// TODO 可能会重复load相同的镜像 // TODO 可能会重复load相同的镜像
// 如果是killed 只根据manifest去判断是否加载memory // 如果是killed 只根据manifest去判断是否加载memory
// 可增加一个判断如果hanged朋manifest里是加载memory这里就不再加载了 // 可增加一个判断如果hanged朋manifest里是加载memory这里就不再加载了
@ -416,26 +408,19 @@ public class ContractStatusRecorder extends StatusRecorder<ContractMeta> {
ContractManager.instance.invokeContractSuicide(client); ContractManager.instance.invokeContractSuicide(client);
return false; return false;
} }
LOGGER.debug( LOGGER.debug(String.format(
String.format(
"CP listened to port %d:\n\tID=%s\n\tName=%s\n\tType=%s\n" "CP listened to port %d:\n\tID=%s\n\tName=%s\n\tType=%s\n"
+ "\tKey=%s\n\tPubKey=%s\n\tCopies=%d\n\t%s", + "\tKey=%s\n\tPubKey=%s\n\tCopies=%d\n\t%s",
i, i, client.getContractID(), client.contractMeta.name,
client.getContractID(), client.getContractType(), client.getContractKey(), client.getPubkey(),
client.contractMeta.name, client.getContractCopies(), client.contractMeta.contract.startInfo));
client.getContractType(),
client.getContractKey(),
client.getPubkey(),
client.getContractCopies(),
client.contractMeta.contract.startInfo));
client.get.syncGet("", "setDir", ContractManager.dir); client.get.syncGet("", "setDir", ContractManager.dir);
// String str = client.getIdentifier(); // String str = client.getIdentifier();
client.get.syncGet("", "getDumpPeriod", "a"); client.get.syncGet("", "getDumpPeriod", "a");
client.get.syncGet("", "startAutoDump", "a"); client.get.syncGet("", "startAutoDump", "a");
createContract(client); createContract(client);
LOGGER.info( LOGGER.info(String.format("reconnect to port %d: contract %s", i,
String.format("reconnect to port %d: contract %s", client.contractMeta.name));
i, client.contractMeta.name));
return true; return true;
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -1,7 +1,5 @@
package org.bdware.sc; package org.bdware.sc;
import java.util.HashMap;
import java.util.Map;
// Node // Node

View File

@ -20,10 +20,8 @@ public class MultiContractRecorder extends StatusRecorder<MultiContractMeta> {
for (MultiContractMeta meta : getStatus().values()) { for (MultiContractMeta meta : getStatus().values()) {
try { try {
meta.initQueue(); meta.initQueue();
int lastExeSeq = int lastExeSeq = Integer.parseInt(KeyValueDBUtil.instance
Integer.parseInt( .getValue(CMTables.LastExeSeq.toString(), meta.getContractID()));
KeyValueDBUtil.instance.getValue(
CMTables.LastExeSeq.toString(), meta.getContractID()));
meta.setLastExeSeq(lastExeSeq); meta.setLastExeSeq(lastExeSeq);
} catch (Exception e) { } catch (Exception e) {
LOGGER.error(e); LOGGER.error(e);
@ -32,13 +30,15 @@ public class MultiContractRecorder extends StatusRecorder<MultiContractMeta> {
} }
public MultiContractMeta getMultiContractMeta(String idOrNameOrDOI) { public MultiContractMeta getMultiContractMeta(String idOrNameOrDOI) {
if (idOrNameOrDOI == null) return null; if (idOrNameOrDOI == null)
return null;
ContractMeta meta = ContractManager.instance.statusRecorder.getContractMeta(idOrNameOrDOI); ContractMeta meta = ContractManager.instance.statusRecorder.getContractMeta(idOrNameOrDOI);
return getMultiContractMeta(meta); return getMultiContractMeta(meta);
} }
public MultiContractMeta getMultiContractMeta(ContractMeta meta) { public MultiContractMeta getMultiContractMeta(ContractMeta meta) {
if (meta == null) return null; if (meta == null)
return null;
return getStatus().get(meta.id); return getStatus().get(meta.id);
} }

View File

@ -79,7 +79,8 @@ public class PBFTAlgorithm implements CommitAlgorithm {
prepareMsg = new PBFTMessage(); prepareMsg = new PBFTMessage();
prepareMsg.order = allocatedID.incrementAndGet(); prepareMsg.order = allocatedID.incrementAndGet();
prepareMsg.type = PBFTType.PrePrepare; prepareMsg.type = PBFTType.PrePrepare;
prepareMsg.content = (java.util.Arrays.hashCode(pbftMessage.content) + "").getBytes(); prepareMsg.content =
(java.util.Arrays.hashCode(pbftMessage.content) + "").getBytes();
temp = new PCInfo(); temp = new PCInfo();
temp.request = pbftMessage; temp.request = pbftMessage;
@ -108,7 +109,8 @@ public class PBFTAlgorithm implements CommitAlgorithm {
break; break;
case Prepare: case Prepare:
temp = info.get(pbftMessage.order); temp = info.get(pbftMessage.order);
LOGGER.info("receive Prepare from:" + pbftMessage.sendID + " -> " + pbftMessage.order); LOGGER.info(
"receive Prepare from:" + pbftMessage.sendID + " -> " + pbftMessage.order);
if (temp == null) { if (temp == null) {
PCInfo pcInfo = new PCInfo(); PCInfo pcInfo = new PCInfo();
pcInfo.buff.add(pbftMessage); pcInfo.buff.add(pbftMessage);
@ -155,7 +157,8 @@ public class PBFTAlgorithm implements CommitAlgorithm {
prepareMsg.order = pbftMessage.order; prepareMsg.order = pbftMessage.order;
prepareMsg.type = PBFTType.PrePrepare; prepareMsg.type = PBFTType.PrePrepare;
temp = info.get(prepareMsg.order); temp = info.get(prepareMsg.order);
prepareMsg.content = (java.util.Arrays.hashCode(temp.request.content) + "").getBytes(); prepareMsg.content =
(java.util.Arrays.hashCode(temp.request.content) + "").getBytes();
broadcast(pbftMessage); broadcast(pbftMessage);
} }
default: default:
@ -207,7 +210,8 @@ public class PBFTAlgorithm implements CommitAlgorithm {
private void matchPrePrepareFromOriginReqeust(int hash, PBFTMessage pbftMessage) { private void matchPrePrepareFromOriginReqeust(int hash, PBFTMessage pbftMessage) {
for (PCInfo pcInfo : info.values()) { for (PCInfo pcInfo : info.values()) {
for (PBFTMessage msg : pcInfo.buff) { for (PBFTMessage msg : pcInfo.buff) {
if (msg.type == PBFTType.PrePrepare && Integer.parseInt(new String(msg.content)) == hash) { if (msg.type == PBFTType.PrePrepare
&& Integer.parseInt(new String(msg.content)) == hash) {
handlePrePrepare(msg, original.get(hash).second); handlePrePrepare(msg, original.get(hash).second);
return; return;
} }
@ -220,10 +224,8 @@ public class PBFTAlgorithm implements CommitAlgorithm {
} }
private void retryLater(int delay, final Node sender, final PBFTMessage pbftMessage) { private void retryLater(int delay, final Node sender, final PBFTMessage pbftMessage) {
ContractManager.scheduledThreadPool.schedule( ContractManager.scheduledThreadPool.schedule(() -> onPBFTMessage(sender, pbftMessage),
() -> onPBFTMessage(sender, pbftMessage), delay, TimeUnit.MILLISECONDS);
delay,
TimeUnit.MILLISECONDS);
} }
private void handlePrePrepare(PBFTMessage pbftMessage, PBFTMessage req) { private void handlePrePrepare(PBFTMessage pbftMessage, PBFTMessage req) {
@ -399,8 +401,8 @@ public class PBFTAlgorithm implements CommitAlgorithm {
public String getDisplayStr() { public String getDisplayStr() {
return "pSize:" + (prepare == null ? "null" : prepare.size()) + " cSize:" return "pSize:" + (prepare == null ? "null" : prepare.size()) + " cSize:"
+ (commit == null ? "null" : commit.size()) + " isSendCommit:" + isSendCommit + " isSendReply:" + (commit == null ? "null" : commit.size()) + " isSendCommit:" + isSendCommit
+ isSendReply + " buffSize:" + buff.size(); + " isSendReply:" + isSendReply + " buffSize:" + buff.size();
} }
} }
} }

View File

@ -2,6 +2,7 @@ package org.bdware.sc.consistency.pbft;
public enum PBFTType { public enum PBFTType {
Request(0), PrePrepare(1), Prepare(2), Commit(3), Reply(4), Unknown(5), ReSend(6), AddMember(7); Request(0), PrePrepare(1), Prepare(2), Commit(3), Reply(4), Unknown(5), ReSend(6), AddMember(7);
private int type; private int type;
PBFTType(int i) { PBFTType(int i) {

View File

@ -4,8 +4,6 @@ import org.bdware.sc.bean.ContractRequest;
import org.bdware.sc.conn.Node; import org.bdware.sc.conn.Node;
import org.bdware.sc.consistency.CommitAlgorithm; import org.bdware.sc.consistency.CommitAlgorithm;
import org.bdware.sc.consistency.Committer; import org.bdware.sc.consistency.Committer;
import org.bdware.sc.consistency.pbft.PBFTMessage;
import org.bdware.sc.consistency.pbft.PBFTType;
import org.bdware.sc.units.TrustfulExecutorConnection; import org.bdware.sc.units.TrustfulExecutorConnection;
public class ViewAlgorithm implements CommitAlgorithm { public class ViewAlgorithm implements CommitAlgorithm {
@ -13,8 +11,7 @@ public class ViewAlgorithm implements CommitAlgorithm {
private Committer committer; private Committer committer;
private TrustfulExecutorConnection connection; private TrustfulExecutorConnection connection;
public ViewAlgorithm(boolean isMaster) { public ViewAlgorithm(boolean isMaster) {}
}
public void setCommitter(Committer c) { public void setCommitter(Committer c) {
committer = c; committer = c;

View File

@ -49,22 +49,16 @@ public class EventBroker {
tempTopics = recorder.recoverTempTopicsFromDb(); tempTopics = recorder.recoverTempTopicsFromDb();
// regularly check temporary topics and clean them // regularly check temporary topics and clean them
ContractManager.scheduledThreadPool.scheduleWithFixedDelay( ContractManager.scheduledThreadPool.scheduleWithFixedDelay(() -> {
() -> {
long current = System.currentTimeMillis(); long current = System.currentTimeMillis();
int oldSize = tempTopics.size(); int oldSize = tempTopics.size();
tempTopics.keySet().forEach(topic -> { tempTopics.keySet().forEach(topic -> {
if (tempTopics.get(topic) + EXPIRED_TIME > current) { if (tempTopics.get(topic) + EXPIRED_TIME > current) {
String reqID = String reqID = ContractManager.instance.nodeCenterConn.getNodeId() + "_"
ContractManager.instance.nodeCenterConn.getNodeId() + + System.currentTimeMillis();
"_" + System.currentTimeMillis(); REvent cleanEvent = new REvent(topic, UNSUBSCRIBE, null, reqID);
REvent cleanEvent = cleanEvent
new REvent( .doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair());
topic,
UNSUBSCRIBE,
null,
reqID);
cleanEvent.doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair());
handle(cleanEvent); handle(cleanEvent);
tempTopics.remove(topic); tempTopics.remove(topic);
} }
@ -72,16 +66,11 @@ public class EventBroker {
if (oldSize != tempTopics.size()) { if (oldSize != tempTopics.size()) {
recorder.saveTempTopics(tempTopics); recorder.saveTempTopics(tempTopics);
} }
}, }, 0L, EXPIRED_TIME, TimeUnit.MILLISECONDS);
0L,
EXPIRED_TIME,
TimeUnit.MILLISECONDS);
// regularly create check point in database // regularly create check point in database
ContractManager.scheduledThreadPool.scheduleAtFixedRate( ContractManager.scheduledThreadPool.scheduleAtFixedRate(
() -> recorder.createCheckPoint(topic2cIds, id2Consumers), () -> recorder.createCheckPoint(topic2cIds, id2Consumers), EXPIRED_TIME,
EXPIRED_TIME, EXPIRED_TIME, TimeUnit.MILLISECONDS);
EXPIRED_TIME,
TimeUnit.MILLISECONDS);
NodeConsumer.setCenter(center); NodeConsumer.setCenter(center);
@ -106,7 +95,8 @@ public class EventBroker {
IEventConsumer consumer = doSubscribe(event); IEventConsumer consumer = doSubscribe(event);
// save & try to sub in center // save & try to sub in center
recorder.appendEvent(event); recorder.appendEvent(event);
center.subInCenter(event.getTopic(), event.getSemantics(), event.getCenter(), consumer, event); center.subInCenter(event.getTopic(), event.getSemantics(), event.getCenter(),
consumer, event);
} }
break; break;
case UNSUBSCRIBE: case UNSUBSCRIBE:
@ -116,9 +106,10 @@ public class EventBroker {
case PUBLISH: case PUBLISH:
case PREPUB: case PREPUB:
case PRESUB: case PRESUB:
LOGGER.info(String.format("Receive %s event from topic %s", event.getSemantics(), topic)); LOGGER.info(String.format("Receive %s event from topic %s", event.getSemantics(),
LOGGER.debug(String.format("Receive %s event %s: %s", topic));
event.getSemantics(), topic, event.getContent())); LOGGER.debug(String.format("Receive %s event %s: %s", event.getSemantics(), topic,
event.getContent()));
if (event.isForward()) { if (event.isForward()) {
// send event to the event center // send event to the event center
event.setForward(center.deliverEvent(topic, event)); event.setForward(center.deliverEvent(topic, event));
@ -159,11 +150,8 @@ public class EventBroker {
* @param id2Consumers consumer registry of broker or a check point in event recorder * @param id2Consumers consumer registry of broker or a check point in event recorder
* @return if the subscribing succeeds * @return if the subscribing succeeds
*/ */
public boolean subInReg( public boolean subInReg(String topic, IEventConsumer consumer,
String topic, Map<String, Set<String>> topic2cIds, Map<String, IEventConsumer> id2Consumers) {
IEventConsumer consumer,
Map<String, Set<String>> topic2cIds,
Map<String, IEventConsumer> id2Consumers) {
if (null == consumer) { if (null == consumer) {
return false; return false;
} }
@ -177,8 +165,8 @@ public class EventBroker {
topic2cIds.get(topic).add(cId); topic2cIds.get(topic).add(cId);
switch (consumer.getType()) { switch (consumer.getType()) {
case Contract: case Contract:
LOGGER.info("contract " + ((ContractConsumer) consumer).getContract() + LOGGER.info("contract " + ((ContractConsumer) consumer).getContract()
" subscribes topic " + topic); + " subscribes topic " + topic);
break; break;
case Node: case Node:
LOGGER.info("node " + consumer.getId() + " subscribes topic " + topic); LOGGER.info("node " + consumer.getId() + " subscribes topic " + topic);
@ -199,10 +187,11 @@ public class EventBroker {
* do subscribing in registry<br/> * do subscribing in registry<br/>
* topic and consumer must not be null at the same time * topic and consumer must not be null at the same time
* <ul> * <ul>
* <li>if consumer is null and topic is not, it means the topic is a temporary topic, remove it</li> * <li>if consumer is null and topic is not, it means the topic is a temporary topic, remove
* <li>if topic is null and consumer is not, * it</li>
* it means a consumer or a contract wants to unsubscribe all topics, * <li>if topic is null and consumer is not, it means a consumer or a contract wants to
* remove all related consumers in topic registry and consumer registry</li> * unsubscribe all topics, remove all related consumers in topic registry and consumer
* registry</li>
* <li>if two of them is not null, do unsubscribing in two registries</li> * <li>if two of them is not null, do unsubscribing in two registries</li>
* </ul> * </ul>
* *
@ -212,11 +201,8 @@ public class EventBroker {
* @param id2Consumers consumer registry of broker or a check point in event recorder * @param id2Consumers consumer registry of broker or a check point in event recorder
* @return if the subscribing succeeds * @return if the subscribing succeeds
*/ */
public boolean unsubInReg( public boolean unsubInReg(String topic, IEventConsumer consumer,
String topic, Map<String, Set<String>> topic2cIds, Map<String, IEventConsumer> id2Consumers) {
IEventConsumer consumer,
Map<String, Set<String>> topic2cIds,
Map<String, IEventConsumer> id2Consumers) {
if (null == topic && null == consumer) { if (null == topic && null == consumer) {
return false; return false;
} }
@ -236,7 +222,8 @@ public class EventBroker {
// if cId belongs to a contract, find all related consumers // if cId belongs to a contract, find all related consumers
toRmIds = new ArrayList<>(); toRmIds = new ArrayList<>();
id2Consumers.forEach((k, c) -> { id2Consumers.forEach((k, c) -> {
if (c instanceof ContractConsumer && ((ContractConsumer) c).getContract().equals(cId)) { if (c instanceof ContractConsumer
&& ((ContractConsumer) c).getContract().equals(cId)) {
toRmIds.add(k); toRmIds.add(k);
} }
}); });
@ -259,7 +246,8 @@ public class EventBroker {
/** /**
* parse consumer information from content str<br/> * parse consumer information from content str<br/>
* if caller wants to select all consumers of a contract, the content str is also parsed into a node consumer * if caller wants to select all consumers of a contract, the content str is also parsed into a
* node consumer
* *
* @param content json string, {"subscriber": "[subscriber]", "handler?": "[handler]"} * @param content json string, {"subscriber": "[subscriber]", "handler?": "[handler]"}
* @return a node consumer or contract consumer, or null if exception is thrown * @return a node consumer or contract consumer, or null if exception is thrown
@ -305,19 +293,16 @@ public class EventBroker {
case AT_LEAST_ONCE: case AT_LEAST_ONCE:
case NEED_RETRY: case NEED_RETRY:
// send events to all // send events to all
topicConsumers.forEach(cId -> topicConsumers
deliverEvent(event, cEvent, nEventStr, cId, topic, true)); .forEach(cId -> deliverEvent(event, cEvent, nEventStr, cId, topic, true));
break; break;
case AT_MOST_ONCE: case AT_MOST_ONCE:
// send event to a random consumer // send event to a random consumer
// AT_MOST_ONCE, so broker don't need to do anything when delivering fails // AT_MOST_ONCE, so broker don't need to do anything when delivering fails
deliverEvent( deliverEvent(event, cEvent, nEventStr,
event, topicConsumers.toArray()[(int) (Math.random() * topicConsumers.size())]
cEvent, .toString(),
nEventStr, topic, true);
topicConsumers.toArray()[(int) (Math.random() * topicConsumers.size())].toString(),
topic,
true);
break; break;
case ONLY_ONCE: case ONLY_ONCE:
switch (event.getType()) { switch (event.getType()) {
@ -343,20 +328,14 @@ public class EventBroker {
// send PREPUB events to all consumers // send PREPUB events to all consumers
// TODO if there are no consumers to receive the ONLY_ONCE events? // TODO if there are no consumers to receive the ONLY_ONCE events?
ContractManager.threadPool.execute(() -> { ContractManager.threadPool.execute(() -> {
REvent prePubMsg = new REvent(event.getTopic(), REvent prePubMsg = new REvent(event.getTopic(), PREPUB, contentHash,
PREPUB,
contentHash,
event.getRequestID()); event.getRequestID());
prePubMsg.doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair()); prePubMsg.doSignature(
topicConsumers.forEach(cId -> ContractManager.instance.nodeCenterConn.getNodeKeyPair());
deliverEvent(prePubMsg, topicConsumers.forEach(cId -> deliverEvent(prePubMsg,
new Event(event.getTopic(), new Event(event.getTopic(), contentHash,
contentHash,
prePubMsg.getSemantics()), prePubMsg.getSemantics()),
JsonUtil.toJson(prePubMsg), JsonUtil.toJson(prePubMsg), cId, topic, false));
cId,
topic,
false));
// wait for responses from contracts (PRESUB events) // wait for responses from contracts (PRESUB events)
while (true) { while (true) {
try { try {
@ -364,20 +343,20 @@ public class EventBroker {
flag.wait(30 * 1000L); flag.wait(30 * 1000L);
} }
if (!flag.get().isEmpty()) { if (!flag.get().isEmpty()) {
REvent finalMsg = new REvent(flag.get(), REvent finalMsg = new REvent(flag.get(), PUBLISH,
PUBLISH, event.getContent(), HashUtil.sha3(contentHash
event.getContent(), + System.currentTimeMillis()));
HashUtil.sha3(
contentHash + System.currentTimeMillis()));
// if the delivering fails, retry publishing // if the delivering fails, retry publishing
finalMsg.setSemantics(NEED_RETRY); finalMsg.setSemantics(NEED_RETRY);
finalMsg.doSignature( finalMsg.doSignature(
ContractManager.instance.nodeCenterConn.getNodeKeyPair()); ContractManager.instance.nodeCenterConn
.getNodeKeyPair());
handle(finalMsg); handle(finalMsg);
break; break;
} }
} catch (InterruptedException e) { } catch (InterruptedException e) {
LOGGER.warn("ONLY_ONE event delivering is interrupted: " + e.getMessage()); LOGGER.warn("ONLY_ONE event delivering is interrupted: "
+ e.getMessage());
// e.printStackTrace(); // e.printStackTrace();
} }
} }
@ -396,19 +375,15 @@ public class EventBroker {
* publish the event to the consumer * publish the event to the consumer
* *
* @param event event message * @param event event message
* @param cEvent simple event message to the contract consumer, only topic, content and semantics * @param cEvent simple event message to the contract consumer, only topic, content and
* semantics
* @param nEventStr event message to the node * @param nEventStr event message to the node
* @param cId consumer id * @param cId consumer id
* @param topic topic of the event * @param topic topic of the event
* @param isPub if the event is published or pre-published * @param isPub if the event is published or pre-published
*/ */
private void deliverEvent( private void deliverEvent(REvent event, Event cEvent, String nEventStr, String cId,
REvent event, String topic, boolean isPub) {
Event cEvent,
String nEventStr,
String cId,
String topic,
boolean isPub) {
if (id2Consumers.containsKey(cId)) { if (id2Consumers.containsKey(cId)) {
IEventConsumer consumer = id2Consumers.get(cId); IEventConsumer consumer = id2Consumers.get(cId);
if (consumer instanceof ContractConsumer) { if (consumer instanceof ContractConsumer) {
@ -419,31 +394,24 @@ public class EventBroker {
public void onResult(String unused) { public void onResult(String unused) {
// if the delivering fails, unsubscribe the consumer // if the delivering fails, unsubscribe the consumer
ContractConsumer c = (ContractConsumer) consumer; ContractConsumer c = (ContractConsumer) consumer;
ContractClient client = ContractManager.instance.getClient(c.getContract()); ContractClient client =
String reqID = ContractManager.instance.getClient(c.getContract());
ContractManager.instance.nodeCenterConn.getNodeKeyPair().getPublicKeyStr() + String reqID = ContractManager.instance.nodeCenterConn.getNodeKeyPair()
"_" + System.currentTimeMillis(); .getPublicKeyStr() + "_" + System.currentTimeMillis();
REvent unsubEvent = REvent unsubEvent = new REvent(topic, UNSUBSCRIBE,
new REvent( "{\"subscriber\":\"" + cId + "\"}", reqID);
topic,
UNSUBSCRIBE,
"{\"subscriber\":\"" + cId + "\"}",
reqID);
unsubEvent.doSignature(client.getPubkey(), client.getContractKey()); unsubEvent.doSignature(client.getPubkey(), client.getContractKey());
handle(unsubEvent); handle(unsubEvent);
// if the event is an ONLY_ONCE event, retry publishing // if the event is an ONLY_ONCE event, retry publishing
if (NEED_RETRY.equals(event.getSemantics())) { if (NEED_RETRY.equals(event.getSemantics())) {
REvent newMsg = REvent newMsg = new REvent(topic.split("\\|")[0], PUBLISH,
new REvent( event.getContent(), event.getRequestID());
topic.split("\\|")[0],
PUBLISH,
event.getContent(),
event.getRequestID());
newMsg.setSemantics(ONLY_ONCE); newMsg.setSemantics(ONLY_ONCE);
newMsg.setHash(event.getHash()); newMsg.setHash(event.getHash());
newMsg.setTxHash(event.getTxHash()); newMsg.setTxHash(event.getTxHash());
newMsg.doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair()); newMsg.doSignature(
ContractManager.instance.nodeCenterConn.getNodeKeyPair());
handle(newMsg); handle(newMsg);
} }
} }
@ -465,8 +433,8 @@ public class EventBroker {
}); });
} else if (isPub) { } else if (isPub) {
// client consumer // client consumer
ContractManager.threadPool.execute(() -> ContractManager.threadPool
consumer.publishEvent(nEventStr, new ResultCallback() { .execute(() -> consumer.publishEvent(nEventStr, new ResultCallback() {
@Override @Override
public void onResult(String unused) { public void onResult(String unused) {
unsubInReg(null, consumer, topic2cIds, id2Consumers); unsubInReg(null, consumer, topic2cIds, id2Consumers);

View File

@ -41,15 +41,13 @@ public class EventCenter {
* @param consumer consumer * @param consumer consumer
* @param event original event * @param event original event
*/ */
public void subInCenter(String topic, REvent.REventSemantics semantics, String center, IEventConsumer consumer, REvent event) { public void subInCenter(String topic, REvent.REventSemantics semantics, String center,
IEventConsumer consumer, REvent event) {
if (null == instance.nodeCenterConn) { if (null == instance.nodeCenterConn) {
return; return;
} }
REvent msg = new REvent(topic, REvent msg = new REvent(topic, REvent.REventType.SUBSCRIBE,
REvent.REventType.SUBSCRIBE, String.format("{\"subscriber\":\"%s\"}", instance.nodeCenterConn.getNodeId()), "");
String.format("{\"subscriber\":\"%s\"}",
instance.nodeCenterConn.getNodeId()),
"");
msg.setSemantics(semantics); msg.setSemantics(semantics);
msg.doSignature(instance.nodeCenterConn.getNodeKeyPair()); msg.doSignature(instance.nodeCenterConn.getNodeKeyPair());
msg.setCenter(center); msg.setCenter(center);

View File

@ -79,9 +79,10 @@ public class EventRecorder {
String key = KeyValueRocksDBUtil.instance.getValue(dbName, LATEST_EVENT_KEY); String key = KeyValueRocksDBUtil.instance.getValue(dbName, LATEST_EVENT_KEY);
latestEvent.set(key); latestEvent.set(key);
CheckPoint cp = new CheckPoint(); CheckPoint cp = new CheckPoint();
Type topic2cIdsType = TypeToken.getParameterized(ConcurrentHashMap.class, String.class, Type topic2cIdsType = TypeToken
TypeToken.getParameterized(Set.class, String.class, .getParameterized(ConcurrentHashMap.class, String.class,
String.class).getType()).getType(); TypeToken.getParameterized(Set.class, String.class, String.class).getType())
.getType();
// retrieving transactions from database // retrieving transactions from database
while (null != key && !key.isEmpty()) { while (null != key && !key.isEmpty()) {
String json = KeyValueRocksDBUtil.instance.getValue(dbName, key); String json = KeyValueRocksDBUtil.instance.getValue(dbName, key);
@ -93,14 +94,16 @@ public class EventRecorder {
if (json.startsWith("cp")) { if (json.startsWith("cp")) {
// create check point by the transaction and stop retrieving // create check point by the transaction and stop retrieving
JsonObject data = JsonUtil.parseStringAsJsonObject(json.substring(2)); JsonObject data = JsonUtil.parseStringAsJsonObject(json.substring(2));
cp.topic2cIds = JsonUtil.fromJson(data.get("topic2cIds").toString(), topic2cIdsType); cp.topic2cIds =
JsonUtil.fromJson(data.get("topic2cIds").toString(), topic2cIdsType);
JsonObject id2Consumers = data.getAsJsonObject("id2Consumers"); JsonObject id2Consumers = data.getAsJsonObject("id2Consumers");
for (String k : id2Consumers.keySet()) { for (String k : id2Consumers.keySet()) {
JsonObject consumer = id2Consumers.getAsJsonObject(k); JsonObject consumer = id2Consumers.getAsJsonObject(k);
if (!consumer.has("type")) { if (!consumer.has("type")) {
continue; continue;
} }
ConsumerType type = ConsumerType.valueOf(consumer.get("type").getAsString()); ConsumerType type =
ConsumerType.valueOf(consumer.get("type").getAsString());
switch (type) { switch (type) {
case Contract: case Contract:
cp.id2Consumers.put(k, cp.id2Consumers.put(k,
@ -145,7 +148,8 @@ public class EventRecorder {
// if empty, return the check point // if empty, return the check point
latestEvent.setCp(true); latestEvent.setCp(true);
} else { } else {
// on the base of old check point, process following sub or unsub events to recover registry // on the base of old check point, process following sub or unsub events to recover
// registry
while (!stack.empty()) { while (!stack.empty()) {
Object record = stack.pop(); Object record = stack.pop();
if (record instanceof CheckPoint) { if (record instanceof CheckPoint) {
@ -155,15 +159,19 @@ public class EventRecorder {
IEventConsumer consumer = broker.parseConsumer(tran.content); IEventConsumer consumer = broker.parseConsumer(tran.content);
switch (tran.type) { switch (tran.type) {
case SUBSCRIBE: case SUBSCRIBE:
if (!broker.subInReg(tran.topic, consumer, cp.topic2cIds, cp.id2Consumers)) { if (!broker.subInReg(tran.topic, consumer, cp.topic2cIds,
cp.id2Consumers)) {
LOGGER.warn("record damaged! " + key); LOGGER.warn("record damaged! " + key);
LOGGER.debug("record damaged! " + key + ": " + JsonUtil.toJson(tran)); LOGGER.debug(
"record damaged! " + key + ": " + JsonUtil.toJson(tran));
} }
break; break;
case UNSUBSCRIBE: case UNSUBSCRIBE:
if (!broker.unsubInReg(tran.topic, consumer, cp.topic2cIds, cp.id2Consumers)) { if (!broker.unsubInReg(tran.topic, consumer, cp.topic2cIds,
cp.id2Consumers)) {
LOGGER.warn("record damaged! " + key); LOGGER.warn("record damaged! " + key);
LOGGER.debug("record damaged! " + key + ": " + JsonUtil.toJson(tran)); LOGGER.debug(
"record damaged! " + key + ": " + JsonUtil.toJson(tran));
} }
default: default:
break; break;

View File

@ -91,19 +91,20 @@ public class ContractConsumer implements IEventConsumer {
try { try {
ContractResult result = JsonUtil.fromJson(str, ContractResult.class); ContractResult result = JsonUtil.fromJson(str, ContractResult.class);
if (!result.status.equals(ContractResult.Status.Success)) { if (!result.status.equals(ContractResult.Status.Success)) {
if (callCount.get() == TIMEOUT_COUNT || if (callCount.get() == TIMEOUT_COUNT
(result.status == ContractResult.Status.Exception && || (result.status == ContractResult.Status.Exception
result.result.toString().contains("not exported"))) { && result.result.toString()
LOGGER.error(String.format( .contains("not exported"))) {
"receiving event error! %s.%s: %s", contract, handler, str)); LOGGER.error(String.format("receiving event error! %s.%s: %s",
contract, handler, str));
rc.onResult((String) null); rc.onResult((String) null);
} else { } else {
ret = false; ret = false;
} }
} }
} catch (Exception e) { } catch (Exception e) {
LOGGER.error(String.format( LOGGER.error(String.format("receiving event error! %s.%s: %s", contract,
"receiving event error! %s.%s: %s", contract, handler, e.getMessage())); handler, e.getMessage()));
rc.onResult((String) null); rc.onResult((String) null);
} }
callCount.incrementAndGet(); callCount.incrementAndGet();
@ -121,10 +122,7 @@ public class ContractConsumer implements IEventConsumer {
} }
} }
}, (reqID, hashStr) -> { }, (reqID, hashStr) -> {
}), }), 500L, 2500L, TimeUnit.MILLISECONDS);
500L,
2500L,
TimeUnit.MILLISECONDS);
scheduledFutures.put(getId(), future); scheduledFutures.put(getId(), future);
synchronized (flag) { synchronized (flag) {
flag.notify(); flag.notify();

View File

@ -1,7 +1,6 @@
package org.bdware.sc.event.clients; package org.bdware.sc.event.clients;
import org.bdware.sc.conn.ResultCallback; import org.bdware.sc.conn.ResultCallback;
import org.bdware.sc.event.Event;
public interface IEventConsumer { public interface IEventConsumer {
String getId(); String getId();
@ -13,8 +12,6 @@ public interface IEventConsumer {
void competeSub(Object msg, ResultCallback rc, String... options); void competeSub(Object msg, ResultCallback rc, String... options);
enum ConsumerType { enum ConsumerType {
Contract, Contract, Node, WSClient
Node,
WSClient
} }
} }

View File

@ -47,6 +47,5 @@ public class WSClientConsumer implements IEventConsumer {
} }
@Override @Override
public void competeSub(Object msg, ResultCallback rc, String... options) { public void competeSub(Object msg, ResultCallback rc, String... options) {}
}
} }

View File

@ -34,8 +34,7 @@ public class ManagerHandler extends MsgHandler {
cb.onResult(cm.getTimesOfExecution(msg.arg)); cb.onResult(cm.getTimesOfExecution(msg.arg));
} }
@Description( @Description(value = "execute Contract, {\"contractID\":\"112233\",\"arg\":\"\"}",
value = "execute Contract, {\"contractID\":\"112233\",\"arg\":\"\"}",
isAsync = true) isAsync = true)
public void executeContract(GetMessage msg, ResultCallback cb) { public void executeContract(GetMessage msg, ResultCallback cb) {
ContractRequest c; ContractRequest c;

View File

@ -4,81 +4,51 @@ package org.bdware.sc.units;
import java.io.*; import java.io.*;
/* /*
* 节点启动后记录自己的units信息和合约的一些信息 * 节点启动后记录自己的units信息和合约的一些信息 节点重新上线后NC发要求让其恢复则从本地读取自己的这些信息进行恢复
* 节点重新上线后NC发要求让其恢复则从本地读取自己的这些信息进行恢复
*/ */
public class ContractRecord implements Serializable { public class ContractRecord implements Serializable {
/* private static final long serialVersionUID = 704775241674568688L; /*
* private static final long serialVersionUID = 704775241674568688L;
public transient RecoverFlag recoverFlag = RecoverFlag.Fine; *
* public transient RecoverFlag recoverFlag = RecoverFlag.Fine;
public String contractID; *
public String contractName; * public String contractID; public String contractName; public String key; public String
public String key; * contractpubKey; public ContractType type; public int copies = 1; public int lastExeSeq = -1;
public String contractpubKey; * public boolean isPrivate = false; public String pubKeyPath; public String ypkName;
public ContractType type; *
public int copies = 1; * //public Map<String,String> members; //k-udpid,v-udpaddress
public int lastExeSeq = -1; *
public boolean isPrivate = false; * public String memory = "";
public String pubKeyPath; *
public String ypkName; * //JavaScriptEntry public String invokeID;
*
//public Map<String,String> members; //k-udpid,v-udpaddress * public ContractRecord(String id){ this.contractID = id; }
*
public String memory = ""; * public ContractRecord(String id,String contractName,String key,String
* contractpubKey,ContractType type,int copies){ this.contractID = id; this.contractName =
//JavaScriptEntry * contractName; this.key = key; this.contractpubKey = contractpubKey; this.type = type;
public String invokeID; * this.copies = copies; }
*
public ContractRecord(String id){ * public void printContent(){ System.out.println("==========ContractRecord========");
this.contractID = id; *
} * System.out.println("contractID=" + contractID == null ? "null" : contractID);
* System.out.println("contractName=" + contractName == null ? "null" : contractName);
public ContractRecord(String id,String contractName,String key,String contractpubKey,ContractType type,int copies){ * System.out.println("key=" + key == null ? "null" : key); System.out.println("contractPubKey="
this.contractID = id; * + contractpubKey == null ? "null" : contractpubKey); System.out.println("type=" + type ==
this.contractName = contractName; * null ? "null" : type); System.out.println("lastExeSeq=" + lastExeSeq == null ? "null" :
this.key = key; * lastExeSeq); System.out.println("invokeID=" + invokeID == null ? "null" : invokeID);
this.contractpubKey = contractpubKey; * System.out.println("copies=" + copies); System.out.println("isPrivate=" + isPrivate);
this.type = type; * System.out.println("pubKeyPath=" + pubKeyPath == null ? "null" : pubKeyPath);
this.copies = copies; * System.out.println("ypkName=" + ypkName == null ? "null" : ypkName); if(members != null){
} * for(String k : members.keySet()){ System.out.println("members " + k + "-" + members.get(k));
* } } System.out.println("memory=" + memory == null ? "null" : memory);
public void printContent(){ * System.out.println("==========ContractRecord print finish======="); }
System.out.println("==========ContractRecord========"); *
* public static void getContentFromFile(String path){ File file = new File(path); try{
System.out.println("contractID=" + contractID == null ? "null" : contractID); * FileInputStream os = new FileInputStream(file); ObjectInputStream oos = new
System.out.println("contractName=" + contractName == null ? "null" : contractName); * ObjectInputStream(os); ContractRecord record = (ContractRecord) oos.readObject();
System.out.println("key=" + key == null ? "null" : key); * record.printContent(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch
System.out.println("contractPubKey=" + contractpubKey == null ? "null" : contractpubKey); * (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) {
System.out.println("type=" + type == null ? "null" : type); * e.printStackTrace(); } }
System.out.println("lastExeSeq=" + lastExeSeq == null ? "null" : lastExeSeq); */
System.out.println("invokeID=" + invokeID == null ? "null" : invokeID);
System.out.println("copies=" + copies);
System.out.println("isPrivate=" + isPrivate);
System.out.println("pubKeyPath=" + pubKeyPath == null ? "null" : pubKeyPath);
System.out.println("ypkName=" + ypkName == null ? "null" : ypkName);
if(members != null){
for(String k : members.keySet()){
System.out.println("members " + k + "-" + members.get(k));
}
}
System.out.println("memory=" + memory == null ? "null" : memory);
System.out.println("==========ContractRecord print finish=======");
}
public static void getContentFromFile(String path){
File file = new File(path);
try{
FileInputStream os = new FileInputStream(file);
ObjectInputStream oos = new ObjectInputStream(os);
ContractRecord record = (ContractRecord) oos.readObject();
record.printContent();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}*/
} }

View File

@ -16,9 +16,7 @@ public class ContractUnitController {
ContractManager manager; ContractManager manager;
SequencingAlgorithmFactory algorithmFactory; SequencingAlgorithmFactory algorithmFactory;
public ContractUnitController( public ContractUnitController(TrustfulExecutorConnection connection, ContractManager manager,
TrustfulExecutorConnection connection,
ContractManager manager,
SequencingAlgorithmFactory factory) { SequencingAlgorithmFactory factory) {
this.connection = connection; this.connection = connection;
this.manager = manager; this.manager = manager;
@ -39,13 +37,8 @@ public class ContractUnitController {
unit.node2member = new HashMap<>(); unit.node2member = new HashMap<>();
units.put(req.contract.getID(), unit); units.put(req.contract.getID(), unit);
System.out.println( System.out.println("[ContractUnitController] startContract:" + result + " isMaster:"
"[ContractUnitController] startContract:" + req.isMaster + " cid:" + req.contract.getID());
+ result
+ " isMaster:"
+ req.isMaster
+ " cid:"
+ req.contract.getID());
break; break;
case AddMember: case AddMember:
LOGGER.debug("contractID:" + cumsg.getContractID()); LOGGER.debug("contractID:" + cumsg.getContractID());
@ -68,12 +61,8 @@ public class ContractUnitController {
unit.node2member = new HashMap<>(); unit.node2member = new HashMap<>();
units.put(req2.contract.getID(), unit); units.put(req2.contract.getID(), unit);
System.out.println( System.out.println("[ContractUnitController] startContract:" + " isMaster:"
"[ContractUnitController] startContract:" + req2.isMaster + " cid:" + req2.contract.getID());
+ " isMaster:"
+ req2.isMaster
+ " cid:"
+ req2.contract.getID());
break; break;
} }
} }
@ -148,16 +137,9 @@ public class ContractUnitController {
} }
public String getDisplayStr() { public String getDisplayStr() {
return "pSize:" return "pSize:" + (prepare == null ? "null" : prepare.size()) + " cSize:"
+ (prepare == null ? "null" : prepare.size()) + (commit == null ? "null" : commit.size()) + " isSendCommit:" + isSendCommit
+ " cSize:" + " isSendReply:" + isSendReply + " buffSize:" + buff.size();
+ (commit == null ? "null" : commit.size())
+ " isSendCommit:"
+ isSendCommit
+ " isSendReply:"
+ isSendReply
+ " buffSize:"
+ buff.size();
} }
} }
} }

View File

@ -61,7 +61,8 @@ public class ContractUnitMessage implements Serializable {
// } // }
public boolean verify(ContractUnitMember member) { public boolean verify(ContractUnitMember member) {
ECPublicKeyParameters param = BCECUtil.createECPublicKeyFromStrParameters(member.pubKey,SM2Util.CURVE,SM2Util.DOMAIN_PARAMS); ECPublicKeyParameters param = BCECUtil.createECPublicKeyFromStrParameters(member.pubKey,
SM2Util.CURVE, SM2Util.DOMAIN_PARAMS);
return SM2Util.verify(param, content, signature.getBytes()); return SM2Util.verify(param, content, signature.getBytes());
} }

View File

@ -5,6 +5,7 @@ import java.io.Serializable;
public enum ContractUnitType implements Serializable { public enum ContractUnitType implements Serializable {
Start(0), AddMember(1), Sequencing(2), Unknown(3); Start(0), AddMember(1), Sequencing(2), Unknown(3);
private int type; private int type;
private ContractUnitType(int i) { private ContractUnitType(int i) {

View File

@ -101,10 +101,9 @@ public class MultiContractMeta implements IDSerializable {
public void setLastExeSeq(int lastExeSeq) { public void setLastExeSeq(int lastExeSeq) {
this.lastExeSeq.set(lastExeSeq); this.lastExeSeq.set(lastExeSeq);
if (KeyValueDBUtil.instance.containsKey( if (KeyValueDBUtil.instance.containsKey(CMTables.LastExeSeq.toString(), contractID)) { // 如果现在是Stable模式就同步刷到磁盘
CMTables.LastExeSeq.toString(), contractID)) { // 如果现在是Stable模式就同步刷到磁盘 KeyValueDBUtil.instance.setValue(CMTables.LastExeSeq.toString(), contractID,
KeyValueDBUtil.instance.setValue( String.valueOf(lastExeSeq));
CMTables.LastExeSeq.toString(), contractID, String.valueOf(lastExeSeq));
} }
} }
@ -154,16 +153,19 @@ public class MultiContractMeta implements IDSerializable {
public String[] getMembers() { public String[] getMembers() {
return members; return members;
} }
public String joinMembers(String delimiter) { public String joinMembers(String delimiter) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if (members.length > 0) if (members.length > 0)
sb.append(members[0]); sb.append(members[0]);
else return ""; else
return "";
for (int i = 1; i < members.length; i++) { for (int i = 1; i < members.length; i++) {
sb.append(delimiter).append(members[i]); sb.append(delimiter).append(members[i]);
} }
return sb.toString(); return sb.toString();
} }
public void setMembers(JsonArray members) { public void setMembers(JsonArray members) {
String[] copied = new String[members.size()]; String[] copied = new String[members.size()];
for (int i = 0; i < members.size(); i++) { for (int i = 0; i < members.size(); i++) {

View File

@ -24,7 +24,8 @@ public class RespCache {
} else { } else {
waiter.wait(5000L); waiter.wait(5000L);
timeout &= waiter.get() * 2 > count; timeout &= waiter.get() * 2 > count;
if (!timeout) waiter.notifyAll(); if (!timeout)
waiter.notifyAll();
return timeout; return timeout;
} }
} }

View File

@ -25,9 +25,8 @@ public class DHTUtil {
String hash = HashUtil.sha3ToFixedLen(key, nodes[0].length() - 2); String hash = HashUtil.sha3ToFixedLen(key, nodes[0].length() - 2);
int l = 0, r = nodes.length - 1, m, int l = 0, r = nodes.length - 1, m, h2l = hash.compareTo(nodes[l].substring(2)),
h2l = hash.compareTo(nodes[l].substring(2)), r2h = nodes[r].substring(2).compareTo(hash), r2h = nodes[r].substring(2).compareTo(hash), h2m;
h2m;
BigInteger bigH = null; BigInteger bigH = null;
String selected; String selected;
do { do {
@ -42,8 +41,7 @@ public class DHTUtil {
break; break;
} }
if (l + 1 == r) { if (l + 1 == r) {
BigInteger bigL = getBigInteger(nodes[l]), BigInteger bigL = getBigInteger(nodes[l]), bigR = getBigInteger(nodes[r]);
bigR = getBigInteger(nodes[r]);
bigH = new BigInteger(hash, 16); bigH = new BigInteger(hash, 16);
if (bigR.subtract(bigH).compareTo(bigH.subtract(bigL)) > -1) { if (bigR.subtract(bigH).compareTo(bigH.subtract(bigL)) > -1) {
selected = nodes[l]; selected = nodes[l];

View File

@ -10,15 +10,11 @@ import java.util.Map;
public interface ContractExecutor { public interface ContractExecutor {
void execute(String requestID, ContractRequest req, ResultCallback rcb, OnHashCallback hcb); void execute(String requestID, ContractRequest req, ResultCallback rcb, OnHashCallback hcb);
default void onRecover(Map<String, Object> args) { default void onRecover(Map<String, Object> args) {}
}
default void onDeliverBlock(String data) { default void onDeliverBlock(String data) {}
}
default void close() { default void close() {}
}
default void onSyncMessage(Node node, byte[] data) { default void onSyncMessage(Node node, byte[] data) {}
}
} }

View File

@ -3,6 +3,5 @@ package org.bdware.server.trustedmodel;
import java.io.Serializable; import java.io.Serializable;
public enum ContractUnitStatus implements Serializable { public enum ContractUnitStatus implements Serializable {
CommonMode, CommonMode, StableMode;
StableMode;
} }

View File

@ -14,7 +14,8 @@ public class SingleNodeExecutor implements ContractExecutor {
} }
@Override @Override
public void execute(String requestID, ContractRequest req, ResultCallback rcb, OnHashCallback hcb) { public void execute(String requestID, ContractRequest req, ResultCallback rcb,
OnHashCallback hcb) {
cm.executeLocallyAsync(req, rcb, hcb); cm.executeLocallyAsync(req, rcb, hcb);
} }
} }

View File

@ -1,11 +1,7 @@
package org.bdware.sc.test; package org.bdware.sc.test;
import org.bdware.sc.ContractManager; import org.bdware.sc.ContractManager;
import org.bdware.sc.bean.Contract;
import org.junit.Test;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class ContractManagerTest { public class ContractManagerTest {
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -12,17 +12,15 @@ public class RespCacheTest {
new Thread(() -> { new Thread(() -> {
try { try {
Thread.sleep(j * 1000); Thread.sleep(j * 1000);
if (j > 2) Thread.sleep(6 * 1000); if (j > 2)
Thread.sleep(6 * 1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
boolean waitResult = cache.waitForHalf(); boolean waitResult = cache.waitForHalf();
System.out.println( System.out.println("tid:" + Thread.currentThread().getId()
"tid:" + " reach target, waitResult:" + waitResult);
+ Thread.currentThread().getId()
+ " reach target, waitResult:"
+ waitResult);
}).start(); }).start();
} }
Thread.sleep(20000); Thread.sleep(20000);
@ -37,17 +35,15 @@ public class RespCacheTest {
new Thread(() -> { new Thread(() -> {
try { try {
Thread.sleep(j * 1000); Thread.sleep(j * 1000);
if (j > 2) Thread.sleep(1900); if (j > 2)
Thread.sleep(1900);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
boolean waitResult = cache.waitForHalf(); boolean waitResult = cache.waitForHalf();
System.out.println( System.out.println("tid:" + Thread.currentThread().getId()
"tid:" + " reach target, waitResult:" + waitResult);
+ Thread.currentThread().getId()
+ " reach target, waitResult:"
+ waitResult);
}).start(); }).start();
} }
Thread.sleep(20000); Thread.sleep(20000);
@ -66,11 +62,8 @@ public class RespCacheTest {
e.printStackTrace(); e.printStackTrace();
} }
boolean waitResult = cache.waitForHalf(); boolean waitResult = cache.waitForHalf();
System.out.println( System.out.println("tid:" + Thread.currentThread().getId()
"tid:" + " reach target, waitResult:" + waitResult);
+ Thread.currentThread().getId()
+ " reach target, waitResult:"
+ waitResult);
}).start(); }).start();
} }
Thread.sleep(10000); Thread.sleep(10000);