From fc453d56fc355c4fa161b7a5a358e6592e27625f Mon Sep 17 00:00:00 2001 From: "Frank.R.Wu" Date: Thu, 15 Jun 2023 11:08:12 +0800 Subject: [PATCH] build: config spotless plugin and reformat code --- build.gradle | 3 + src/main/java/org/bdware/sc/ChainOpener.java | 24 +- .../java/org/bdware/sc/ContractClient.java | 169 +-- .../java/org/bdware/sc/ContractManager.java | 1243 ++++++++--------- src/main/java/org/bdware/sc/ContractMeta.java | 16 +- .../org/bdware/sc/ContractStatusEnum.java | 6 +- .../org/bdware/sc/ContractStatusRecorder.java | 177 ++- .../bdware/sc/MasterElectTimeRecorder.java | 16 +- .../org/bdware/sc/MultiContractRecorder.java | 12 +- .../java/org/bdware/sc/ProjectRecorder.java | 2 +- .../bdware/sc/RecoverMechTimeRecorder.java | 48 +- .../sc/consistency/CommitAlgorithm.java | 2 +- .../java/org/bdware/sc/consistency/Pair.java | 12 +- .../sc/consistency/pbft/PBFTAlgorithm.java | 42 +- .../sc/consistency/pbft/PBFTMember.java | 56 +- .../sc/consistency/pbft/PBFTMessage.java | 166 +-- .../bdware/sc/consistency/pbft/PBFTType.java | 57 +- .../sc/consistency/pbft/ViewAlgorithm.java | 7 +- .../java/org/bdware/sc/event/EventBroker.java | 216 ++- .../java/org/bdware/sc/event/EventCenter.java | 26 +- .../org/bdware/sc/event/EventRecorder.java | 32 +- .../sc/event/clients/ContractConsumer.java | 22 +- .../sc/event/clients/IEventConsumer.java | 5 +- .../bdware/sc/event/clients/NodeConsumer.java | 2 +- .../sc/event/clients/WSClientConsumer.java | 3 +- .../org/bdware/sc/handler/ManagerHandler.java | 3 +- .../org/bdware/sc/units/ContractRecord.java | 120 +- .../sc/units/ContractUnitController.java | 42 +- .../bdware/sc/units/ContractUnitMember.java | 20 +- .../bdware/sc/units/ContractUnitMessage.java | 153 +- .../sc/units/ContractUnitStartRequest.java | 60 +- .../org/bdware/sc/units/ContractUnitType.java | 41 +- .../bdware/sc/units/MultiContractMeta.java | 16 +- .../java/org/bdware/sc/units/PubKeyNode.java | 2 +- .../java/org/bdware/sc/units/RecoverFlag.java | 2 +- .../java/org/bdware/sc/units/RespCache.java | 3 +- .../sc/units/SequencingAlgorithmFactory.java | 2 +- .../sc/units/TrustfulExecutorConnection.java | 2 +- src/main/java/org/bdware/sc/util/DHTUtil.java | 10 +- .../server/trustedmodel/ContractExecutor.java | 12 +- .../trustedmodel/ContractUnitStatus.java | 3 +- .../server/trustedmodel/MultiReqSeq.java | 2 +- .../trustedmodel/SingleNodeExecutor.java | 5 +- .../bdware/sc/test/ContractManagerTest.java | 4 - .../org/bdware/sc/test/ReflectionTest.java | 6 +- .../org/bdware/sc/units/RespCacheTest.java | 27 +- 46 files changed, 1315 insertions(+), 1584 deletions(-) diff --git a/build.gradle b/build.gradle index cbd48b8..197cc1c 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,9 @@ plugins { id 'java' id 'java-library' } + +apply from: '../spotless.gradle' + repositories { mavenCentral() } diff --git a/src/main/java/org/bdware/sc/ChainOpener.java b/src/main/java/org/bdware/sc/ChainOpener.java index 5ef239f..17503bc 100644 --- a/src/main/java/org/bdware/sc/ChainOpener.java +++ b/src/main/java/org/bdware/sc/ChainOpener.java @@ -9,28 +9,14 @@ public interface ChainOpener { String register(String arg); - void writeContractResultToLocalAndLedger( - String result, - ContractClient client, - ContractRequest contractRequest, - OnHashCallback cb, long start, long l); + void writeContractResultToLocalAndLedger(String result, ContractClient client, + ContractRequest contractRequest, OnHashCallback cb, long start, long l); - void writeToChain( - OnHashCallback cb, - String from, - String to, - String data, - String requestID, + void writeToChain(OnHashCallback cb, String from, String to, String data, String requestID, String namedLedger); - void writeToChainWithContract( - OnHashCallback cb, - String from, - String to, - String data, - String requestID, - String contractID, - String namedLedger); + void writeToChainWithContract(OnHashCallback cb, String from, String to, String data, + String requestID, String contractID, String namedLedger); JsonElement getLedgerParams(); } diff --git a/src/main/java/org/bdware/sc/ContractClient.java b/src/main/java/org/bdware/sc/ContractClient.java index e7c299d..0fe9d61 100644 --- a/src/main/java/org/bdware/sc/ContractClient.java +++ b/src/main/java/org/bdware/sc/ContractClient.java @@ -42,17 +42,17 @@ public class ContractClient { long times = 0L; long traffic = 0L; long memory; - // boolean withInsnLimit; // 是否需要计算gas + // boolean withInsnLimit; // 是否需要计算gas ContractStatus contractStatus; boolean isRunning; - // public boolean changeDumpPeriod(String period) { - // System.out.println("[ContractClient] changeDumpPeriod " + period); - // String res = get.syncGet("", "changeDumpPeriod",period); - // if(res.equals("success")) - // return true; - // return false; - // } + // public boolean changeDumpPeriod(String period) { + // System.out.println("[ContractClient] changeDumpPeriod " + period); + // String res = get.syncGet("", "changeDumpPeriod",period); + // if(res.equals("success")) + // return true; + // return false; + // } long lastUpdate = 0; ContractClient(Contract c) { @@ -76,7 +76,7 @@ public class ContractClient { // current ContractManager // We only consider the. public ContractClient(String host, int startPort) { - // LOGGER.info("ContractClient 构造器 : "); + // LOGGER.info("ContractClient 构造器 : "); contractMeta = new ContractMeta(); outputTracer = new ContractPrinter(); errorTracer = new ContractPrinter(); @@ -133,26 +133,21 @@ public class ContractClient { } private void initProps() { - // LOGGER.info("initProps ---- position-----1"); + // LOGGER.info("initProps ---- position-----1"); contractMeta.name = get.syncGet("", "getContractName", ""); - // LOGGER.info("initProps ---- position-----2"); + // LOGGER.info("initProps ---- position-----2"); String strEvent = get.syncGet("", "getDeclaredEvents", ""); LOGGER.debug("event: " + strEvent); - contractMeta.declaredEvents = - JsonUtil.fromJson( - strEvent, new TypeToken>() { - }.getType()); - // LOGGER.info("initProps ---- position-----3"); - contractMeta.dependentContracts = JsonUtil.fromJson( - get.syncGet("", "getDependentContracts", ""), - new TypeToken>() { - }.getType()); - // LOGGER.info("initProps ---- position-----4"); + contractMeta.declaredEvents = JsonUtil.fromJson(strEvent, + new TypeToken>() {}.getType()); + // LOGGER.info("initProps ---- position-----3"); + contractMeta.dependentContracts = + JsonUtil.fromJson(get.syncGet("", "getDependentContracts", ""), + new TypeToken>() {}.getType()); + // LOGGER.info("initProps ---- position-----4"); contractMeta.exportedFunctions = - JsonUtil.fromJson( - get.syncGet("", "getExportedFunctions", ""), - new TypeToken>() { - }.getType()); + JsonUtil.fromJson(get.syncGet("", "getExportedFunctions", ""), + new TypeToken>() {}.getType()); contractMeta.logDetail = new HashMap<>(); for (FunctionDesp func : contractMeta.exportedFunctions) { StringBuilder str = new StringBuilder(); @@ -164,8 +159,7 @@ public class ContractClient { } if (anno.getType().equals("LogLocation")) { for (String logLoc : anno.getArgs()) { - if (logLoc.equals("\"dataware\"") - || logLoc.equals("\"bdledger\"") + if (logLoc.equals("\"dataware\"") || logLoc.equals("\"bdledger\"") || logLoc.equals("\"bdledger:\"")) { str.append("bdcontract;"); } else if (logLoc.startsWith("\"bdledger:") && logLoc.length() > 11) { @@ -178,42 +172,39 @@ public class ContractClient { } contractMeta.logDetail.put(func.functionName, str.toString()); } - // LOGGER.info("initProps ---- position-----5"); + // LOGGER.info("initProps ---- position-----5"); try { String anno = get.syncGet("", "getAnnotations", ""); contractMeta.annotations = - JsonUtil.fromJson(anno, new TypeToken>() { - }.getType()); + JsonUtil.fromJson(anno, new TypeToken>() {}.getType()); } catch (Exception e) { // supoort contract process before version 0.70 contractMeta.annotations = new ArrayList<>(); } - // LOGGER.info("initProps ---- position-----6"); + // LOGGER.info("initProps ---- position-----6"); contractMeta.sigRequired = Boolean.parseBoolean(get.syncGet("", "isSigRequired", "")); - // LOGGER.info("initProps ---- position-----7"); + // LOGGER.info("initProps ---- position-----7"); contractMeta.thisPermission = get.syncGet("", "showPermission", ""); - // LOGGER.info("initProps ---- position-----8"); + // LOGGER.info("initProps ---- position-----8"); isRunning = true; - // LOGGER.info("initProps ---- position-----9"); + // LOGGER.info("initProps ---- position-----9"); get.syncGet("", "registerMangerPort", ContractManager.cPort.getCMPort() + ""); contractMeta.contract = JsonUtil.fromJson(get.syncGet("", "getContract", ""), Contract.class); contractMeta.id = contractMeta.contract.getID(); - get.setOfflineExceptionHandler( - new SocketGet.OfflineHandler() { - @Override - public void onException(SocketGet socketGet, Exception e) { - if (e.getMessage().contains("Connection refused")) { - contractMeta.status = ContractStatusEnum.HANGED; - ContractManager.instance.statusRecorder.resumeContractProcess( - contractMeta.id); - } - } - }); + get.setOfflineExceptionHandler(new SocketGet.OfflineHandler() { + @Override + public void onException(SocketGet socketGet, Exception e) { + if (e.getMessage().contains("Connection refused")) { + contractMeta.status = ContractStatusEnum.HANGED; + ContractManager.instance.statusRecorder.resumeContractProcess(contractMeta.id); + } + } + }); loadTimesAndTraffic(); - // LOGGER.info("initProps ---- position-----10"); + // LOGGER.info("initProps ---- position-----10"); // LOGGER.debug("======= registerPort:" + ret + "-->" + ContractManager.startPort); } @@ -233,16 +224,13 @@ public class ContractClient { String osJni = ((HardwareInfo.type == OSType.linux) ? "/jni/linux" : "/jni/mac"); darg += jniPath.getAbsolutePath() + osJni; if (!new File(classpath).exists()) { - ContractResult r = - new ContractResult( - Status.Exception, new JsonPrimitive("incorrect path: yjs.jar")); + ContractResult r = new ContractResult(Status.Exception, + new JsonPrimitive("incorrect path: yjs.jar")); return JsonUtil.toJson(r); } if (!new File(jniPath, "libs").exists()) { - ContractResult r = - new ContractResult( - Status.Exception, - new JsonPrimitive("incorrect path: yjs.jar, missing libs")); + ContractResult r = new ContractResult(Status.Exception, + new JsonPrimitive("incorrect path: yjs.jar, missing libs")); return JsonUtil.toJson(r); } int startPort = ContractManager.cPort.getPortAndInc(); @@ -251,13 +239,17 @@ public class ContractClient { pbParameters.add("-Dfile.encoding=UTF-8"); pbParameters.add(darg); 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(); 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 { - 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(classpath); @@ -268,8 +260,9 @@ public class ContractClient { ProcessBuilder builder; String[] result = new String[pbParameters.size()]; pbParameters.toArray(result); - Constructor pbc = ProcessBuilder.class.getDeclaredConstructor(String[].class); - builder = pbc.newInstance(new Object[]{result}); + Constructor pbc = + ProcessBuilder.class.getDeclaredConstructor(String[].class); + builder = pbc.newInstance(new Object[] {result}); File directory = new File("./"); LOGGER.debug("[CMD] path: " + directory.getAbsolutePath()); @@ -294,10 +287,8 @@ public class ContractClient { try { // Set contractPort to max(mainPort, contractPort) int portIndex = status.indexOf("mainPort"); - int port = - Integer.parseInt( - status.substring(portIndex + 9, portIndex + 14) - .replaceAll("\\s+", "")); + int port = Integer.parseInt( + status.substring(portIndex + 9, portIndex + 14).replaceAll("\\s+", "")); if (port != startPort) { ContractManager.cPort.reSetPort(port + 1); } @@ -327,20 +318,20 @@ public class ContractClient { } get.syncGet("", "registerMangerPort", String.valueOf(ContractManager.cPort.getCMPort())); - MultiContractMeta multiContractMeta = - ContractManager.instance.multiContractRecorder.getMultiContractMeta(contractMeta.getID()); + MultiContractMeta multiContractMeta = ContractManager.instance.multiContractRecorder + .getMultiContractMeta(contractMeta.getID()); if (multiContractMeta != null && multiContractMeta.getMembers() != null) { - String setMemberResult = get.syncGet( - "", "setMembers", JsonUtil.toJson(multiContractMeta.getMembers())); + String setMemberResult = + get.syncGet("", "setMembers", JsonUtil.toJson(multiContractMeta.getMembers())); LOGGER.info("setMember:" + setMemberResult); } 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())) { - status = - get.syncGet( - "", "setContractBundle", JsonUtil.toJson(contractMeta.contract)); + status = get.syncGet("", "setContractBundle", JsonUtil.toJson(contractMeta.contract)); } else { status = get.syncGet("", "setContract", JsonUtil.toJson(contractMeta.contract)); } @@ -369,16 +360,12 @@ public class ContractClient { return; } lastUpdate = System.currentTimeMillis(); - get.asyncGet( - "", - ".UsedMemory", - "", - new ResultCallback() { - @Override - public void onResult(String str) { - memory = Long.parseLong(str); - } - }); + get.asyncGet("", ".UsedMemory", "", new ResultCallback() { + @Override + public void onResult(String str) { + memory = Long.parseLong(str); + } + }); } catch (Exception e) { // e.printStackTrace(); } @@ -457,12 +444,10 @@ public class ContractClient { } public void loadTimesAndTraffic() { - String tempTime2 = - KeyValueDBUtil.instance.getValue( - CMTables.ContractInfo.toString(), contractMeta.name + "-Times"); - String tempTraffic2 = - KeyValueDBUtil.instance.getValue( - CMTables.ContractInfo.toString(), contractMeta.name + "-Traffic"); + String tempTime2 = KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), + contractMeta.name + "-Times"); + String tempTraffic2 = KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), + contractMeta.name + "-Traffic"); if (tempTime2 != null && !tempTime2.equals("")) { times = Long.parseLong(tempTime2); } @@ -472,15 +457,15 @@ public class ContractClient { } public void saveTimesAndTraffic() { - KeyValueDBUtil.instance.setValue( - CMTables.ContractInfo.toString(), contractMeta.name + "-Times", times + ""); - KeyValueDBUtil.instance.setValue( - CMTables.ContractInfo.toString(), contractMeta.name + "-Traffic", traffic + ""); + KeyValueDBUtil.instance.setValue(CMTables.ContractInfo.toString(), + contractMeta.name + "-Times", times + ""); + KeyValueDBUtil.instance.setValue(CMTables.ContractInfo.toString(), + contractMeta.name + "-Traffic", traffic + ""); } public void setMask(JsonObject args) { - //get.asyncGet("",,,,); + // get.asyncGet("",,,,); get.asyncGet("", "setMask", args.toString(), null); } @@ -488,7 +473,7 @@ public class ContractClient { public void setProjectConfig(String args) { get.asyncGet("", "setProjectConfig", args, null); } - //public String + // public String static class ReqScript { String mode; diff --git a/src/main/java/org/bdware/sc/ContractManager.java b/src/main/java/org/bdware/sc/ContractManager.java index 3f1c9b0..66e6096 100644 --- a/src/main/java/org/bdware/sc/ContractManager.java +++ b/src/main/java/org/bdware/sc/ContractManager.java @@ -38,22 +38,13 @@ import java.util.concurrent.*; public class ContractManager { public static final Object checkAndStartLock = new Object(); - static final Counter contractCounter = - Counter.build() - .name("execute_contract_counter") - .help("contract execution status") - .register(); - static final Counter oracleCounter = - Counter.build() - .name("execute_oracle_counter") - .help("oracle execution status") - .register(); + static final Counter contractCounter = Counter.build().name("execute_contract_counter") + .help("contract execution status").register(); + static final Counter oracleCounter = Counter.build().name("execute_oracle_counter") + .help("oracle execution status").register(); - static final Counter totalCounter = - Counter.build() - .name("execute_counter") - .help("contract and oracle execution status") - .register(); + static final Counter totalCounter = Counter.build().name("execute_counter") + .help("contract and oracle execution status").register(); static final long memoryLimit = 100L * 1024L * 1024L; private static final Logger LOGGER = LogManager.getLogger(ContractManager.class); @@ -66,12 +57,7 @@ public class ContractManager { public static ContractPort cPort; public static boolean eventPersistenceEnabled = false; public static ExecutorService threadPool = - new ThreadPoolExecutor( - 8, - 15, - 60, - TimeUnit.SECONDS, - new SynchronousQueue<>()); + new ThreadPoolExecutor(8, 15, 60, TimeUnit.SECONDS, new SynchronousQueue<>()); public static ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10); @@ -83,9 +69,8 @@ public class ContractManager { KeyValueDBUtil.setupCM(); KeyValueRocksDBUtil.setupCM(); TimeDBUtil.setupCM(); - logsDB = - new MultiIndexTimeRocksDBUtil( - "./ContractManagerDB", CMTables.LocalContractLogDB.toString()); + logsDB = new MultiIndexTimeRocksDBUtil("./ContractManagerDB", + CMTables.LocalContractLogDB.toString()); } protected final EventBroker eventBroker; @@ -99,7 +84,7 @@ public class ContractManager { ServiceServer server; Map reqCache = new ConcurrentHashMap<>(); // key is requestID private ContractClient analysisClient; - // private long expiredTime; + // private long expiredTime; public ContractManager() { instance = this; @@ -119,7 +104,7 @@ public class ContractManager { } private static String convertToBytes(long traffic) { - String[] unit = new String[]{"B", "KB", "MB", "GB", "TB"}; + String[] unit = new String[] {"B", "KB", "MB", "GB", "TB"}; double d = traffic; int i; for (i = 0; i < unit.length - 1; i++) { @@ -132,79 +117,79 @@ public class ContractManager { return String.format("%.2f %s", d, unit[i]); } - // public static void updateContractHandleRecord(Contract c, ResultCallback resultCallback) - // throws Exception { + // public static void updateContractHandleRecord(Contract c, ResultCallback resultCallback) + // throws Exception { // - // DoHandleRecord contractHR = new DoHandleRecord(GlobalConfigurations.User_Handle,) - // resultCallback.onResult(contractDOI); - // } + // DoHandleRecord contractHR = new DoHandleRecord(GlobalConfigurations.User_Handle,) + // resultCallback.onResult(contractDOI); + // } - // public static void updateContractHandleRecord(Contract c, String doi, ResultCallback + // public static void updateContractHandleRecord(Contract c, String doi, ResultCallback // resultCallback) - // throws Exception { - // // Dictionary contractInfo = new Hashtable(); - // // contractInfo.put("id", c.getID()); - // // contractInfo.put("publicKey", c.getPublicKey()); + // throws Exception { + // // Dictionary contractInfo = new Hashtable(); + // // contractInfo.put("id", c.getID()); + // // contractInfo.put("publicKey", c.getPublicKey()); // - // HandleService hs = new HandleService(HandleServiceUtils.hrRegister); - // String contractDOI = - // hs.reregisterContract(doi, DOIPMainServer.repoIdentifier, c.getPublicKey()); + // HandleService hs = new HandleService(HandleServiceUtils.hrRegister); + // String contractDOI = + // hs.reregisterContract(doi, DOIPMainServer.repoIdentifier, c.getPublicKey()); // - // DigitalObject contractDO = queryContractDo(c, contractDOI); - // // DOAClient.getGlobalInstance().create(DOIPMainServer.repoIdentifier, contractDO); - // DoipClient doipClient = - // DoipClient.createByRepoUrlAndMsgFmt( - // DOIPMainServer.repoUrl, DoipMessageFormat.PACKET.getName()); + // DigitalObject contractDO = queryContractDo(c, contractDOI); + // // DOAClient.getGlobalInstance().create(DOIPMainServer.repoIdentifier, contractDO); + // DoipClient doipClient = + // DoipClient.createByRepoUrlAndMsgFmt( + // DOIPMainServer.repoUrl, DoipMessageFormat.PACKET.getName()); // - // // RepoHandleRecord repoHandleRecord = - // // DOAClient.getGlobalInstance().resolveRepo(DOIPMainServer.repoIdentifier); + // // RepoHandleRecord repoHandleRecord = + // // DOAClient.getGlobalInstance().resolveRepo(DOIPMainServer.repoIdentifier); // - // DoMessage response = doipClient.update(contractDO); - // if (response.parameters.response != DoResponse.Success) { - // doipClient.create(DOIPMainServer.repoIdentifier, contractDO); - // } - // resultCallback.onResult(contractDOI); - // } + // DoMessage response = doipClient.update(contractDO); + // if (response.parameters.response != DoResponse.Success) { + // doipClient.create(DOIPMainServer.repoIdentifier, contractDO); + // } + // resultCallback.onResult(contractDOI); + // } // - // private static DigitalObject queryContractDo(Contract c, String contractDOI) - // throws IOException { - // DigitalObject cDo = new DigitalObject(contractDOI, DoType.Contract_ypk); - // Element e = new Element("contract", "ypk"); - // e.setData( - // toByteArray( - // new ContractInstanceDO( - // c.getID(), c.getPublicKey(), + // private static DigitalObject queryContractDo(Contract c, String contractDOI) + // throws IOException { + // DigitalObject cDo = new DigitalObject(contractDOI, DoType.Contract_ypk); + // Element e = new Element("contract", "ypk"); + // e.setData( + // toByteArray( + // new ContractInstanceDO( + // c.getID(), c.getPublicKey(), // fileToByteArray(c.getScriptStr())))); - // cDo.addElements(e); - // return cDo; - // } + // cDo.addElements(e); + // return cDo; + // } // - // public static void registerMultiContractToDOA(Contract c, String doi) throws Exception { - // HandleService hs = new HandleService(HandleServiceUtils.hrRegister); - // hs.reregisterContract(doi, c.getNodeCenterRepoDOI(), c.getPublicKey()); + // public static void registerMultiContractToDOA(Contract c, String doi) throws Exception { + // HandleService hs = new HandleService(HandleServiceUtils.hrRegister); + // hs.reregisterContract(doi, c.getNodeCenterRepoDOI(), c.getPublicKey()); // - // DigitalObject contractDO = new DigitalObject(doi, DoType.Contract_ypk); - // Element e = new Element("contract", "ypk"); - // e.setData( - // toByteArray( - // new ContractInstanceDO( - // c.getID(), c.getPublicKey(), + // DigitalObject contractDO = new DigitalObject(doi, DoType.Contract_ypk); + // Element e = new Element("contract", "ypk"); + // e.setData( + // toByteArray( + // new ContractInstanceDO( + // c.getID(), c.getPublicKey(), // fileToByteArray(c.getScriptStr())))); - // contractDO.addElements(e); - // DoMessage response = - // DOAClient.getGlobalInstance().create(c.getNodeCenterRepoDOI(), contractDO); + // contractDO.addElements(e); + // DoMessage response = + // DOAClient.getGlobalInstance().create(c.getNodeCenterRepoDOI(), contractDO); // - // if (response.parameters.response != DoResponse.Success) { - // DOAClient.getGlobalInstance().update(contractDO); - // } - // /* - // DoipClient doipClient = DoipClient.createByRepoUrl(DOIPMainServer.repoUrl); - // DoMessage response = doipClient.create(contractDO); - // if (response.header.response != DoResponse.Success) { - // doipClient.update(contractDO); - // } - // */ - // } + // if (response.parameters.response != DoResponse.Success) { + // DOAClient.getGlobalInstance().update(contractDO); + // } + // /* + // DoipClient doipClient = DoipClient.createByRepoUrl(DOIPMainServer.repoUrl); + // DoMessage response = doipClient.create(contractDO); + // if (response.header.response != DoResponse.Success) { + // doipClient.update(contractDO); + // } + // */ + // } public static byte[] fileToByteArray(String filename) throws IOException { File f = new File(filename); @@ -361,12 +346,8 @@ public class ContractManager { } private static void fillContractResourceInfo( - Map> contractResourceInfo, - String pid, - String res, - String cpu, - String mem, - Scanner sc2) { + Map> contractResourceInfo, String pid, String res, + String cpu, String mem, Scanner sc2) { sc2.close(); Map tmp = new HashMap<>(); @@ -386,8 +367,8 @@ public class ContractManager { return isNodeManager; } - public static void checkPointToLedger( - OnHashCallback cb, String contractID, String data, String requestID) { + public static void checkPointToLedger(OnHashCallback cb, String contractID, String data, + String requestID) { boolean isMaster = instance.getContractIsMaster(contractID); if (!isMaster) { LOGGER.info("非合约 " + contractID + "的master,无需承担checkPoint上链任务!"); @@ -408,7 +389,8 @@ public class ContractManager { return "bundle_" + md5; } else { 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; } } catch (Exception e) { @@ -433,19 +415,21 @@ public class ContractManager { public String getContractIDByName(String name) { ContractMeta meta = statusRecorder.getContractMeta(name); - if (meta != null) return meta.id; + if (meta != null) + return meta.id; return null; } public String getContractNameByID(String id) { ContractMeta meta = statusRecorder.getContractMeta(id); - if (meta != null) return meta.name; + if (meta != null) + return meta.name; return null; } - // public void setExpiredTime(long time) { - // expiredTime = time; - // } + // public void setExpiredTime(long time) { + // expiredTime = time; + // } public void reconnectContractProcess() { RecoverMechTimeRecorder.startReconnectCP = System.currentTimeMillis(); @@ -481,8 +465,8 @@ public class ContractManager { } String result = client.get.syncGet("", "getDumpPeriod", "a"); ContractMeta meta = client.contractMeta; - addLocalContractLog( - "getDumpPeriod", meta.contract.getID(), meta.name, meta.contract.getOwner()); + addLocalContractLog("getDumpPeriod", meta.contract.getID(), meta.name, + meta.contract.getOwner()); if (!"failed".equals(result)) { return result; @@ -505,7 +489,7 @@ public class ContractManager { LOGGER.debug("do not need load when start, finished"); return; } - // String[] strs = ff.split(";"); + // String[] strs = ff.split(";"); if (!ff.contains("init")) { LOGGER.debug("do not need load when start,finished"); @@ -529,7 +513,8 @@ public class ContractManager { if (f.exists() && f.isDirectory()) { String path = null; 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) { path = subFile.getName(); } @@ -556,179 +541,179 @@ public class ContractManager { loadProjectConfig(client); ContractMeta meta = client.contractMeta; - addLocalContractLog( - "changeDumpPeriod", meta.contract.getID(), meta.name, meta.contract.getOwner()); + addLocalContractLog("changeDumpPeriod", meta.contract.getID(), meta.name, + meta.contract.getOwner()); r = new ContractResult(Status.Success, new JsonPrimitive("change dump period finished")); return JsonUtil.toJson(r); } - // public String resumeStartContractAndRedirect(Contract c, PrintStream ps, String alias) { - // long freeMemory = getFreeMemory(); - // if (freeMemory < memoryLimit) { - // ContractResult r = - // new ContractResult( - // Status.Error, new JsonPrimitive("insufficient memory:" + + // public String resumeStartContractAndRedirect(Contract c, PrintStream ps, String alias) { + // long freeMemory = getFreeMemory(); + // if (freeMemory < memoryLimit) { + // ContractResult r = + // new ContractResult( + // Status.Error, new JsonPrimitive("insufficient memory:" + // freeMemory)); - // return JsonUtil.toJson(r); - // } - // SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); - // Date date = new Date(); - // try { - // date = format.parse("2022-03-31"); - // } catch (ParseException e) { - // e.printStackTrace(); - // } - // if (System.currentTimeMillis() > date.getTime()) { - // ContractResult ret = - // new ContractResult(Status.Error, new JsonPrimitive("Licence Time + // return JsonUtil.toJson(r); + // } + // SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + // Date date = new Date(); + // try { + // date = format.parse("2022-03-31"); + // } catch (ParseException e) { + // e.printStackTrace(); + // } + // if (System.currentTimeMillis() > date.getTime()) { + // ContractResult ret = + // new ContractResult(Status.Error, new JsonPrimitive("Licence Time // Expired")); - // return JsonUtil.toJson(ret); - // } - // SM2KeyPair sm2Key = SM2Util.generateSM2KeyPair(null); - // ContractResult r; - // try { - // if (c.getScriptStr().startsWith("/")) { - // c.startInfo.isYPK = true; - // String[] str = c.getScriptStr().split("/"); - // String tmp = new File(dir + "/publicCompiled/ypkName").getAbsolutePath(); - // String[] str2 = tmp.split("/"); - // if (str.length > str2.length) { - // c.startInfo.isPrivate = true; - // c.startInfo.pubKeyPath = str[str.length - 2]; - // } - // c.startInfo.ypkName = str[str.length - 1]; - // LOGGER.info("print Contract Start Info"); - // c.startInfo.print(); - // } - // if (null == c.getKey()) { - // String key = getContractMd5(c); - // String privateKeyStr = - // KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), + // return JsonUtil.toJson(ret); + // } + // SM2KeyPair sm2Key = SM2Util.generateSM2KeyPair(null); + // ContractResult r; + // try { + // if (c.getScriptStr().startsWith("/")) { + // c.startInfo.isYPK = true; + // String[] str = c.getScriptStr().split("/"); + // String tmp = new File(dir + "/publicCompiled/ypkName").getAbsolutePath(); + // String[] str2 = tmp.split("/"); + // if (str.length > str2.length) { + // c.startInfo.isPrivate = true; + // c.startInfo.pubKeyPath = str[str.length - 2]; + // } + // c.startInfo.ypkName = str[str.length - 1]; + // LOGGER.info("print Contract Start Info"); + // c.startInfo.print(); + // } + // if (null == c.getKey()) { + // String key = getContractMd5(c); + // String privateKeyStr = + // KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), // key); - // if (privateKeyStr == null || privateKeyStr.length() == 0) { - // privateKeyStr = SM2Util.generateSM2KeyPair().toJson(); - // KeyValueDBUtil.instance.setValue( - // CMTables.ContractInfo.toString(), key, privateKeyStr); - // } - // sm2Key = SM2KeyPair.fromJson(privateKeyStr); - // c.setKey(sm2Key.getPrivateKey().toString(16)); - // c.setPublicKey(sm2Key.getPublicKeyStr()); - // } - // int contractID; - // if (null != c.getHash() && !c.getHash().equals("")) { - // contractID = Integer.parseInt(c.getHash()); - // } else { - // contractID = c.getPublicKey().hashCode(); - // } + // if (privateKeyStr == null || privateKeyStr.length() == 0) { + // privateKeyStr = SM2Util.generateSM2KeyPair().toJson(); + // KeyValueDBUtil.instance.setValue( + // CMTables.ContractInfo.toString(), key, privateKeyStr); + // } + // sm2Key = SM2KeyPair.fromJson(privateKeyStr); + // c.setKey(sm2Key.getPrivateKey().toString(16)); + // c.setPublicKey(sm2Key.getPublicKeyStr()); + // } + // int contractID; + // if (null != c.getHash() && !c.getHash().equals("")) { + // contractID = Integer.parseInt(c.getHash()); + // } else { + // contractID = c.getPublicKey().hashCode(); + // } // - // if (c.getID() == null) c.setID(contractID)); - // if (null == c.getOwner()) { - // c.setOwner(sm2Key.getPublicKeyStr()); - // } - // LOGGER.debug("contract pubKey: " + c.getPublicKey()); - // // 合约启动时读取Manifest文件设置合约DOI - // setContractDOI(c); - // setContractStateful(c); - // ContractClient client = new ContractClient(c); - // String ret; - // String conflictCheck; - // addLocalContractLog("startContract", c.getID(), client.contractName, + // if (c.getID() == null) c.setID(contractID)); + // if (null == c.getOwner()) { + // c.setOwner(sm2Key.getPublicKeyStr()); + // } + // LOGGER.debug("contract pubKey: " + c.getPublicKey()); + // // 合约启动时读取Manifest文件设置合约DOI + // setContractDOI(c); + // setContractStateful(c); + // ContractClient client = new ContractClient(c); + // String ret; + // String conflictCheck; + // addLocalContractLog("startContract", c.getID(), client.contractName, // c.getOwner()); - // switch (c.getType()) { - // case RequestOnce: - // case ResponseOnce: - // LOGGER.debug("[Start Unsync Contract]"); - // ret = client.startProcess(ps); - // conflictCheck = resumeCheckConflict(c, client, ret); - // if (null != conflictCheck) { - // return conflictCheck; - // } + // switch (c.getType()) { + // case RequestOnce: + // case ResponseOnce: + // LOGGER.debug("[Start Unsync Contract]"); + // ret = client.startProcess(ps); + // conflictCheck = resumeCheckConflict(c, client, ret); + // if (null != conflictCheck) { + // return conflictCheck; + // } // - // String tempTime2 = - // KeyValueDBUtil.instance.getValue( - // CMTables.ContractInfo.toString(), - // client.contractName + "-Times"); - // String tempTraffic2 = - // KeyValueDBUtil.instance.getValue( - // CMTables.ContractInfo.toString(), - // client.contractName + "-Traffic"); - // if (tempTime2 != null && !tempTime2.equals("")) { - // client.times = Long.parseLong(tempTime2); - // } - // if (tempTraffic2 != null && !tempTraffic2.equals("")) { - // client.traffic = Long.parseLong(tempTraffic2); - // } - // client.traffic += ret.length(); + // String tempTime2 = + // KeyValueDBUtil.instance.getValue( + // CMTables.ContractInfo.toString(), + // client.contractName + "-Times"); + // String tempTraffic2 = + // KeyValueDBUtil.instance.getValue( + // CMTables.ContractInfo.toString(), + // client.contractName + "-Traffic"); + // if (tempTime2 != null && !tempTime2.equals("")) { + // client.times = Long.parseLong(tempTime2); + // } + // if (tempTraffic2 != null && !tempTraffic2.equals("")) { + // client.traffic = Long.parseLong(tempTraffic2); + // } + // client.traffic += ret.length(); // - // client.get.syncGet("", "setDir", ContractManager.dir); - // initLoadMemory(c.getID()); - // ContractStatusRecorder.createContract(c, client); + // client.get.syncGet("", "setDir", ContractManager.dir); + // initLoadMemory(c.getID()); + // ContractStatusRecorder.createContract(c, client); // - // return ret; - // case RequestAllResponseAll: - // case RequestAllResponseFirst: - // case RequestAllResponseHalf: - // case Sole: - // ret = client.startProcess(ps); - // conflictCheck = checkConflict(c, client, ret); - // if (null != conflictCheck) { - // return conflictCheck; - // } + // return ret; + // case RequestAllResponseAll: + // case RequestAllResponseFirst: + // case RequestAllResponseHalf: + // case Sole: + // ret = client.startProcess(ps); + // conflictCheck = checkConflict(c, client, ret); + // if (null != conflictCheck) { + // return conflictCheck; + // } // - // String tempTime = - // KeyValueDBUtil.instance.getValue( - // CMTables.ContractInfo.toString(), - // client.contractName + "-Times"); - // String tempTraffic = - // KeyValueDBUtil.instance.getValue( - // CMTables.ContractInfo.toString(), - // client.contractName + "-Traffic"); - // if (tempTime != null && !tempTime.equals("")) { - // client.times = Long.parseLong(tempTime); - // } - // if (tempTraffic != null && !tempTraffic.equals("")) { - // client.traffic = Long.parseLong(tempTraffic); - // } - // client.traffic += ret.length(); + // String tempTime = + // KeyValueDBUtil.instance.getValue( + // CMTables.ContractInfo.toString(), + // client.contractName + "-Times"); + // String tempTraffic = + // KeyValueDBUtil.instance.getValue( + // CMTables.ContractInfo.toString(), + // client.contractName + "-Traffic"); + // if (tempTime != null && !tempTime.equals("")) { + // client.times = Long.parseLong(tempTime); + // } + // if (tempTraffic != null && !tempTraffic.equals("")) { + // client.traffic = Long.parseLong(tempTraffic); + // } + // client.traffic += ret.length(); // - // if (alias != null) { - // client.setIdentifier(alias); - // } - // if (c.getDoipFlag() && !c.getDOI().equals("registerFailed")) { - // client.setIdentifier(c.getDOI()); - // } - // client.get.syncGet("", "setDir", ContractManager.dir); - // initLoadMemory(c.getID()); - // ContractStatusRecorder.updateContract(c, client); - // return ret; - // default: - // return "todo"; - // } - // } catch (Exception e) { - // e.printStackTrace(); - // r = new ContractResult(Status.Error, new JsonPrimitive("exception occurs")); - // return JsonUtil.toJson(r); - // } - // } + // if (alias != null) { + // client.setIdentifier(alias); + // } + // if (c.getDoipFlag() && !c.getDOI().equals("registerFailed")) { + // client.setIdentifier(c.getDOI()); + // } + // client.get.syncGet("", "setDir", ContractManager.dir); + // initLoadMemory(c.getID()); + // ContractStatusRecorder.updateContract(c, client); + // return ret; + // default: + // return "todo"; + // } + // } catch (Exception e) { + // e.printStackTrace(); + // r = new ContractResult(Status.Error, new JsonPrimitive("exception occurs")); + // return JsonUtil.toJson(r); + // } + // } // - // private String resumeCheckConflict(Contract c, ContractClient client, String ret) { - // if (JsonUtil.fromJson(ret, ContractResult.class).status == Status.Success) { - // if (findConflictOfName(client.getContractName())) { - // ContractManager.instance.invokeContractSuicide(client); - // ContractResult r = - // new ContractResult( - // Status.Error, new JsonPrimitive("Duplicate contract name.")); - // return JsonUtil.toJson(r); - // } - // ContractStatusRecorder.updateContractClient(c.getID(), client); - // } - // return null; - // } + // private String resumeCheckConflict(Contract c, ContractClient client, String ret) { + // if (JsonUtil.fromJson(ret, ContractResult.class).status == Status.Success) { + // if (findConflictOfName(client.getContractName())) { + // ContractManager.instance.invokeContractSuicide(client); + // ContractResult r = + // new ContractResult( + // Status.Error, new JsonPrimitive("Duplicate contract name.")); + // return JsonUtil.toJson(r); + // } + // ContractStatusRecorder.updateContractClient(c.getID(), client); + // } + // return null; + // } // - // public String resumeStartContract(Contract c) { - // return resumeStartContractAndRedirect(c, System.out, null); - // } + // public String resumeStartContract(Contract c) { + // return resumeStartContractAndRedirect(c, System.out, null); + // } public long getFreeMemory() { try { @@ -744,42 +729,42 @@ public class ContractManager { return memoryLimit + 1; } - // private void hangUpKillContract(String contractID) { - // ContractClient client = ContractStatusRecorder.getContractClientById(contractID); - // if (client != null) { - // try { - // String ff = client.get.syncGet("", "getMemorySet", ""); - // LOGGER.info("[killContract] memorySet : " + ff); - // if (ff != null) { - // if (ff.contains("kill")) { - // LOGGER.info("need dump when stop"); - // String contractName = client.getContractName(); - // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss"); - // File f = new File(dir + "/memory/" + contractName, df.format(new + // private void hangUpKillContract(String contractID) { + // ContractClient client = ContractStatusRecorder.getContractClientById(contractID); + // if (client != null) { + // try { + // String ff = client.get.syncGet("", "getMemorySet", ""); + // LOGGER.info("[killContract] memorySet : " + ff); + // if (ff != null) { + // if (ff.contains("kill")) { + // LOGGER.info("need dump when stop"); + // String contractName = client.getContractName(); + // SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss"); + // File f = new File(dir + "/memory/" + contractName, df.format(new // Date())); - // dumpContract(contractName, f.getAbsolutePath()); - // } - // } - // String contractName = client.contractName; - // ContractStatusRecorder.id2ContractClient.remove(contractID); - // name2Contract.remove(contractName); - // doi2Contract.remove(client.getContractDOI()); - // String str = client.getIdentifier(); - // if (str != null && !str.equals("null")) { - // name2Contract.remove(str, client); - // } - // ContractManager.instance.invokeContractSuicide(client); - // eventBroker.unSub(contractName, null); + // dumpContract(contractName, f.getAbsolutePath()); + // } + // } + // String contractName = client.contractName; + // ContractStatusRecorder.id2ContractClient.remove(contractID); + // name2Contract.remove(contractName); + // doi2Contract.remove(client.getContractDOI()); + // String str = client.getIdentifier(); + // if (str != null && !str.equals("null")) { + // name2Contract.remove(str, client); + // } + // ContractManager.instance.invokeContractSuicide(client); + // eventBroker.unSub(contractName, null); // - // LOGGER.info( - // String.format( - // "killContract: %s id--> %s result: %s", - // client.contractName, contractID, r)); - // } catch (Exception e) { - // e.printStackTrace(); - // } - // } - // } + // LOGGER.info( + // String.format( + // "killContract: %s id--> %s result: %s", + // client.contractName, contractID, r)); + // } catch (Exception e) { + // e.printStackTrace(); + // } + // } + // } public void addLocalContractLog(String action, ContractClient client) { ContractMeta meta = client.contractMeta; @@ -855,17 +840,17 @@ public class ContractManager { client.traffic += ret.length(); // TODO @ZYX // updateContractInfo(client); - // if (BDOAHandler.cm != null) { - // BDOAHandler.cm.name2Contract = name2Contract; - // } + // if (BDOAHandler.cm != null) { + // BDOAHandler.cm.name2Contract = name2Contract; + // } client.get.syncGet("", "setDir", ContractManager.dir); - // Signature sig = sm2.sign(ret.getBytes(),sm2Key.getPrivateKey()); - // ContractResult result = JsonUtil.fromJson(ret, ContractResult.class); - // result.pubkey = sm2Key.getPublicKeyStr(); - // result.result = + // Signature sig = sm2.sign(ret.getBytes(),sm2Key.getPrivateKey()); + // ContractResult result = JsonUtil.fromJson(ret, ContractResult.class); + // result.pubkey = sm2Key.getPublicKeyStr(); + // result.result = // sm2.sign(result.result.getBytes(),sm2Key.getPrivateKey()).toString(); - // return JsonUtil.toJson(result); + // return JsonUtil.toJson(result); initLoadMemory(client); statusRecorder.createContract(client); @@ -889,11 +874,10 @@ public class ContractManager { ProjectConfig config = projectRecoder.getProjectConfig(client.getContractID()); LOGGER.debug("zz"); String str = client.contractMeta.contract.getScriptStr(); - /*if(config!=null){ - System.out.println("not NULL"); - client.setProjectConfig(JsonUtil.toJson(config)); - return; - }*/ + /* + * if(config!=null){ System.out.println("not NULL"); + * client.setProjectConfig(JsonUtil.toJson(config)); return; } + */ // TODO loadMaskConfig(config, str); loadMockConfig(config, str); @@ -912,30 +896,30 @@ public class ContractManager { // YPK config.setMockConfig(mockYPK); // client.setProjectConfig(JsonUtil.toJson(config)); - } //else { - // bubian - //} + } // else { + // bubian + // } } } } private void loadMaskConfig(ProjectConfig config, String str) { - //从ypk当中检查是否更新,若YPK中没有配置文件则不更新 - //若有且版本号更大,则更新 + // 从ypk当中检查是否更新,若YPK中没有配置文件则不更新 + // 若有且版本号更大,则更新 MaskConfig maskYPK = YJSPacker.getConfig(str, "/maskConfig.json", MaskConfig.class); if (maskYPK != null) { - //System.out.println("YPKConf" + maskYPK.config); + // System.out.println("YPKConf" + maskYPK.config); MaskConfig maskDB = config.getMaskConfig(); if (maskDB == null) { config.setMaskConfig(maskYPK); - //System.out.println("maskNull" + config.getMaskConfig().config); + // System.out.println("maskNull" + config.getMaskConfig().config); } else { int maskVersion = VersionUtil.compareVersion(maskDB.version, maskYPK.version); if (maskVersion == -1) { // YPK版本更新 config.setMaskConfig(maskYPK); - //System.out.println("mask-1" + config.getMaskConfig().config); + // System.out.println("mask-1" + config.getMaskConfig().config); // client.setProjectConfig(JsonUtil.toJson(config)); } @@ -951,8 +935,8 @@ public class ContractManager { KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), key); if (privateKeyStr == null || privateKeyStr.length() == 0) { privateKeyStr = SM2Util.generateSM2KeyPair().toJson(); - KeyValueDBUtil.instance.setValue( - CMTables.ContractInfo.toString(), key, privateKeyStr); + KeyValueDBUtil.instance.setValue(CMTables.ContractInfo.toString(), key, + privateKeyStr); } SM2KeyPair sm2Key = SM2KeyPair.fromJson(privateKeyStr); c.setKey(sm2Key.getPrivateKey().toString(16)); @@ -965,9 +949,8 @@ public class ContractManager { if (JsonUtil.fromJson(ret, ContractResult.class).status == Status.Success) { if (findConflictOfName(client.getContractName())) { invokeContractSuicide(client); - ContractResult r = - new ContractResult( - Status.Error, new JsonPrimitive("Duplicate contract name.")); + ContractResult r = new ContractResult(Status.Error, + new JsonPrimitive("Duplicate contract name.")); return JsonUtil.toJson(r); } } @@ -1023,17 +1006,12 @@ public class ContractManager { public void clearCache() { final long time = System.currentTimeMillis() - 30000L; - // LOGGER.info("try to clear cache, clear 0"); - /* reqCache.entrySet() - .removeIf( - entry -> { - RespCache cache = entry.getValue(); - if (cache == null) return true; - if (cache.count < 0) return true; - return cache.time < time; - }); - - */ + // LOGGER.info("try to clear cache, clear 0"); + /* + * reqCache.entrySet() .removeIf( entry -> { RespCache cache = entry.getValue(); if (cache + * == null) return true; if (cache.count < 0) return true; return cache.time < time; }); + * + */ } synchronized RespCache getCache(String requestID) { @@ -1045,11 +1023,8 @@ public class ContractManager { LOGGER.debug("create cache:" + requestID); RespCache resp = new RespCache(); try { - resp.count = - Integer.parseInt( - requestID - .replaceFirst("[^_]*_", "") - .replaceAll("_.*$", "")); + resp.count = Integer + .parseInt(requestID.replaceFirst("[^_]*_", "").replaceAll("_.*$", "")); } catch (Exception e) { resp.count = 2; } @@ -1071,11 +1046,8 @@ public class ContractManager { if (null == c.getContractID()) { LOGGER.info("合约Name转为ID error!"); - cr = - new ContractResult( - Status.Error, - new JsonPrimitive( - c.getContractID() + " Contract not Exists, CMLocallyAsync!")); + cr = new ContractResult(Status.Error, + new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocallyAsync!")); r.onResult(JsonUtil.toJson(cr)); return; } @@ -1084,11 +1056,8 @@ public class ContractManager { final ContractClient client = getClient(c.getContractID()); if (null == client) { - cr = - new ContractResult( - Status.Error, - new JsonPrimitive( - c.getContractID() + " Contract not Exists, CMLocallyAsync!")); + cr = new ContractResult(Status.Error, + new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocallyAsync!")); r.onResult(JsonUtil.toJson(cr)); return; } @@ -1107,28 +1076,22 @@ public class ContractManager { LOGGER.info("[Hit Cache] " + requestID); r.onResult(cache.val); } else { - executeInternalAsync( - client, - c, - new ResultCallback() { - @Override - public void onResult(String str) { - cache.time = start; - cache.val = str; - r.onResult(cache.val); - cache.notifyAllWaiter(); - } - }, - cb); + executeInternalAsync(client, c, new ResultCallback() { + @Override + public void onResult(String str) { + cache.time = start; + cache.val = str; + r.onResult(cache.val); + cache.notifyAllWaiter(); + } + }, cb); } return; } } else { - ContractResult re = - new ContractResult( - Status.Error, - new JsonPrimitive("Timeout due to insufficient requester")); + ContractResult re = new ContractResult(Status.Error, + new JsonPrimitive("Timeout due to insufficient requester")); r.onResult(JsonUtil.toJson(re)); return; } @@ -1156,26 +1119,24 @@ public class ContractManager { request.setAction("getGlobal"); request.setPublicKey(client.contractMeta.getPubkey()); 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); } public String executeLocally(ContractRequest c, OnHashCallback cb) { long start = System.currentTimeMillis(); - // LOGGER.info( - // "[ContractManager] executeLocally : ContractRequest.requestID=" - // + c.getRequestID() - // + " tid:" - // + Thread.currentThread().getId()); + // LOGGER.info( + // "[ContractManager] executeLocally : ContractRequest.requestID=" + // + c.getRequestID() + // + " tid:" + // + Thread.currentThread().getId()); String requestID = c.getRequestID(); if (c.getContractID() == null) { LOGGER.error("合约Name转为ID error!"); - ContractResult cr = - new ContractResult( - Status.Error, - new JsonPrimitive( - c.getContractID() + " Contract not Exists, CMLocally!")); + ContractResult cr = new ContractResult(Status.Error, + new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocally!")); return JsonUtil.toJson(cr); } @@ -1183,15 +1144,12 @@ public class ContractManager { ContractResult cr2; ContractClient client = getClient(c.getContractID()); if (client == null) { - cr2 = - new ContractResult( - Status.Error, - new JsonPrimitive( - c.getContractID() + " Contract not Exists, CMLocally!")); + cr2 = new ContractResult(Status.Error, + new JsonPrimitive(c.getContractID() + " Contract not Exists, CMLocally!")); return JsonUtil.toJson(cr2); } - // LOGGER.info("[ContractManager] executeLocally : requestID=" + requestID); + // LOGGER.info("[ContractManager] executeLocally : requestID=" + requestID); RespCache cache = getCache(requestID); // TODO 从LHS中获取该请求的公钥对应的运行节点的公钥列表 @@ -1211,69 +1169,61 @@ public class ContractManager { } } } else { - ContractResult re = - new ContractResult( - Status.Error, - new JsonPrimitive("Timeout due to insufficient requester")); + ContractResult re = new ContractResult(Status.Error, + new JsonPrimitive("Timeout due to insufficient requester")); return JsonUtil.toJson(re); } } - // LOGGER.info("cache is null"); + // LOGGER.info("cache is null"); clearCache(); return executeInternal(client, c, cb); } - private void executeInternalAsync( - ContractClient client, ContractRequest request, ResultCallback rcb, OnHashCallback cb) { + private void executeInternalAsync(ContractClient client, ContractRequest request, + ResultCallback rcb, OnHashCallback cb) { ContractResult cr; long start = System.currentTimeMillis(); client.times++; client.contractStatus = ContractStatus.Executing; ResultCallback acb; - //use to write to chian - acb = - new ResultCallback() { - @Override - public void onResult(String result) { - client.traffic += result.length(); - client.contractStatus = ContractStatus.Executed; + // use to write to chian + acb = new ResultCallback() { + @Override + public void onResult(String result) { + client.traffic += result.length(); + client.contractStatus = ContractStatus.Executed; - JsonObject finalRet = JsonUtil.parseStringAsJsonObject(result); + JsonObject finalRet = JsonUtil.parseStringAsJsonObject(result); - rcb.onResult(finalRet); - chainOpener.writeContractResultToLocalAndLedger( - finalRet.toString(), - client, - request, - cb, - start, - System.currentTimeMillis() - start); - if (client.contractMeta.getYjsType() == YjsType.Oracle) { - oracleCounter.inc(); - } else { - contractCounter.inc(); - } - totalCounter.inc(); + rcb.onResult(finalRet); + chainOpener.writeContractResultToLocalAndLedger(finalRet.toString(), client, + request, cb, start, System.currentTimeMillis() - start); + if (client.contractMeta.getYjsType() == YjsType.Oracle) { + oracleCounter.inc(); + } else { + contractCounter.inc(); + } + totalCounter.inc(); - } + } - }; - // if (ignoreLog) { - // rcb.onResult( + }; + // if (ignoreLog) { + // rcb.onResult( // // "{\"needSeq\":false,\"seq\":0,\"status\":\"Success!!!!\",\"result\":\"world\","+ // "\"isInsnLimit\":false,\"totalGas\":0,\"executionGas\":0,\"extraGas\":0,\"size\":0}"); - // return; - // } + // return; + // } client.get.asyncGet("", "executeContract", JsonUtil.toJson(request), acb); } - private String executeInternal( - ContractClient client, ContractRequest request, OnHashCallback ocb) { - // LOGGER.info("ContractManager executeInternal : "); + private String executeInternal(ContractClient client, ContractRequest request, + OnHashCallback ocb) { + // LOGGER.info("ContractManager executeInternal : "); ContractResult cr; long start = System.currentTimeMillis(); @@ -1288,10 +1238,11 @@ public class ContractManager { client.traffic += result.length(); if (client.getContractCopies() == 1) { - extractEventsFromContractResult(ocb, JsonUtil.parseStringAsJsonObject(result), client, request, start); + extractEventsFromContractResult(ocb, JsonUtil.parseStringAsJsonObject(result), client, + request, start); } - chainOpener.writeContractResultToLocalAndLedger( - result, client, request, ocb, start, System.currentTimeMillis() - start); + chainOpener.writeContractResultToLocalAndLedger(result, client, request, ocb, start, + System.currentTimeMillis() - start); contractCounter.inc(); return result; } @@ -1301,47 +1252,31 @@ public class ContractManager { * * @author Kaidong Wu */ - public void extractEventsFromContractResult( - OnHashCallback ocb, - JsonObject result, - ContractClient client, - ContractRequest request, - long startTime) { + public void extractEventsFromContractResult(OnHashCallback ocb, JsonObject result, + ContractClient client, ContractRequest request, long startTime) { try { ContractResult cr = JsonUtil.fromJson(result, ContractResult.class); if (null != cr.events && !cr.events.isEmpty()) { List msgList = cr.events; cr.events = null; - chainOpener.writeContractResultToLocalAndLedger( - result.toString(), - client, - request, + chainOpener.writeContractResultToLocalAndLedger(result.toString(), client, request, (reqID, hashStr) -> { if (eventPersistenceEnabled) { - msgList.forEach( - msg -> { - msg.setTxHash(hashStr); - msg.doSignature( - client.getPubkey(), client.getContractKey()); - eventBroker.handle(msg); - }); + msgList.forEach(msg -> { + msg.setTxHash(hashStr); + msg.doSignature(client.getPubkey(), client.getContractKey()); + eventBroker.handle(msg); + }); } if (null != ocb) { ocb.publishHash(reqID, hashStr); } - }, - startTime, - System.currentTimeMillis() - startTime); + }, startTime, System.currentTimeMillis() - startTime); if (!eventPersistenceEnabled) { - threadPool.submit( - () -> - msgList.forEach( - e -> { - e.doSignature( - client.getPubkey(), - client.contractMeta.contract.getKey()); - eventBroker.handle(e); - })); + threadPool.submit(() -> msgList.forEach(e -> { + e.doSignature(client.getPubkey(), client.contractMeta.contract.getKey()); + eventBroker.handle(e); + })); } } } catch (Exception ignored) { @@ -1361,15 +1296,15 @@ public class ContractManager { } public String execute(ContractRequest c, OnHashCallback cb) { - // return masterStub.executeGlobally(c, cb); + // return masterStub.executeGlobally(c, cb); StrCollector resultCallback = new StrCollector(); executeContractInternal(c, resultCallback, cb); resultCallback.waitForResult(); return resultCallback.strRet; } - public void executeContractInternal( - ContractRequest cr, final ResultCallback rcb, final OnHashCallback hcb) { + public void executeContractInternal(ContractRequest cr, final ResultCallback rcb, + final OnHashCallback hcb) { LOGGER.debug(JsonUtil.toJson(cr)); ContractMeta meta = statusRecorder.getContractMeta(cr.getContractID()); MultiContractMeta multiMeta = @@ -1389,14 +1324,11 @@ public class ContractManager { @Override public void onResult(JsonObject result) { - ContractManager.instance.extractEventsFromContractResult( - null, result, client, cr, start); - LOGGER.debug( - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") - .format(new Date(System.currentTimeMillis())) - + meta.contractExecutor + " result=" - + result.toString() - + "\n"); + ContractManager.instance.extractEventsFromContractResult(null, result, client, + cr, start); + LOGGER.debug(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") + .format(new Date(System.currentTimeMillis())) + meta.contractExecutor + + " result=" + result.toString() + "\n"); rcb.onResult(result); } }; @@ -1409,25 +1341,25 @@ public class ContractManager { if (null != nodeCenterConn && null != masterStub) { String pubKey = nodeCenterConn.routeContract(cr.getContractID()); // TODO 如果此时master正在选举中,先缓存请求,有必要吗? - // if(pubKey == null ||pubKey.equals("")){ - // logger.info("Master正在崩溃选举中,先将请求缓存!"); - // if(MasterClientRecoverMechAction.requestsToMaster == null){ - // MasterClientRecoverMechAction.requestsToMaster = new + // if(pubKey == null ||pubKey.equals("")){ + // logger.info("Master正在崩溃选举中,先将请求缓存!"); + // if(MasterClientRecoverMechAction.requestsToMaster == null){ + // MasterClientRecoverMechAction.requestsToMaster = new // ConcurrentHashMap<>(); - // } + // } // // if(!MasterClientRecoverMechAction.requestsToMaster.containsKey(c.getContractID())){ // // MasterClientRecoverMechAction.requestsToMaster.put(c.getContractID(),new // Queue<>()); - // } + // } // // MasterClientRecoverMechAction.requestsToMaster.get(c.getContractID()).add(new // RequestToMaster(c)); - // return; - // } + // return; + // } - // LOGGER.info("查看合约 " + cr.getContractID() + " 的master为 " + pubKey); + // LOGGER.info("查看合约 " + cr.getContractID() + " 的master为 " + pubKey); if (null != pubKey) { @@ -1439,31 +1371,23 @@ public class ContractManager { return; // result = masterStub.executeByOtherNode(pubKey, cr); } else { - result = - new ContractResult( - Status.Error, - new JsonPrimitive( - "Contract " - + cr.getContractID() - + "can't be located in router")); + result = new ContractResult(Status.Error, new JsonPrimitive( + "Contract " + cr.getContractID() + "can't be located in router")); // 告知NC重选 /* - 好像有点问题,之前这么写是觉得找不到的话,是因为master出问题了,需要重选,但是没考虑到这个合约确实不存在 - 但是可能也不影响,如果这个合约确实不存在,那么即使NC发起了选举也不会真的进行选举 + * 好像有点问题,之前这么写是觉得找不到的话,是因为master出问题了,需要重选,但是没考虑到这个合约确实不存在 + * 但是可能也不影响,如果这个合约确实不存在,那么即使NC发起了选举也不会真的进行选举 */ - // JsonObject jo = new JsonObject(); - // jo.addProperty("action", "NCStartElect"); - // jo.addProperty("contractID", cr.getContractID()); - // nodeCenterConn.sendMsg(JsonUtil.toJson(jo)); - // LOGGER.info("发现合约 " + cr.getContractID() + " + // JsonObject jo = new JsonObject(); + // jo.addProperty("action", "NCStartElect"); + // jo.addProperty("contractID", cr.getContractID()); + // nodeCenterConn.sendMsg(JsonUtil.toJson(jo)); + // LOGGER.info("发现合约 " + cr.getContractID() + " // master为null,发请求给master令其发启选举"); } } else { - result = - new ContractResult( - Status.Error, - new JsonPrimitive( - "Contract " + cr.getContractID() + " doesn't exists!!")); + result = new ContractResult(Status.Error, + new JsonPrimitive("Contract " + cr.getContractID() + " doesn't exists!!")); } rcb.onResult(JsonUtil.parseObjectAsJsonObject(result)); } @@ -1575,7 +1499,8 @@ public class ContractManager { boolean isNodeManager = checkNodeManager(owner); List ret = new ArrayList<>(); for (ContractMeta client : statusRecorder.getStatus().values()) { - if (client.contract == null) continue; + if (client.contract == null) + continue; if (!client.contract.getOwner().equals(owner) && !isNodeManager) { continue; } @@ -1592,23 +1517,22 @@ public class ContractManager { } void sortContractInfoList(List infoList, String firstID) { - infoList.sort( - (o1, o2) -> { - if (o1.id.equals(firstID)) { - return -1; - } - if (o2.id.equals(firstID)) { - return 1; - } - String str1 = o1.name; - String str2 = o2.name; - if (o1.name == null) - str1 = ""; - if (o2.name == null) - str2 = ""; - return str1.compareTo(str2); + infoList.sort((o1, o2) -> { + if (o1.id.equals(firstID)) { + return -1; + } + if (o2.id.equals(firstID)) { + return 1; + } + String str1 = o1.name; + String str2 = o2.name; + if (o1.name == null) + str1 = ""; + if (o2.name == null) + str2 = ""; + return str1.compareTo(str2); - }); + }); } public String getContractResourceInfo() { @@ -1617,8 +1541,10 @@ public class ContractManager { for (ContractMeta client : statusRecorder.getStatus().values()) { ContractInfo contractInfo = fillContractInfo(client); ContractClient contractClient = statusRecorder.getContractClient(contractInfo.id); - if (contractClient != null) contractInfo.pid = contractClient.getPID(); - else contractInfo.pid = "-1"; + if (contractClient != null) + contractInfo.pid = contractClient.getPID(); + else + contractInfo.pid = "-1"; if (!contractInfo.pid.equals("-1") && !contractInfo.pid.equals("0")) { try { assert cris != null; @@ -1651,24 +1577,39 @@ public class ContractManager { // System.out.println(line); if (line.contains("%Cpu(s):")) { Scanner sc2 = new Scanner(new ByteArrayInputStream(line.getBytes())); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNextFloat()) freeCPU = sc2.nextFloat() + "%"; + if (sc2.hasNext()) + sc2.next(); + if (sc2.hasNext()) + sc2.next(); + if (sc2.hasNext()) + sc2.next(); + if (sc2.hasNext()) + 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(); } else if (line.contains("MiB Mem :")) { Scanner sc2 = new Scanner(new ByteArrayInputStream(line.getBytes())); - if (sc2.hasNext()) sc2.next(); - if (sc2.hasNext()) 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.hasNext()) + sc2.next(); + if (sc2.hasNext()) + 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()) freeMEM = String.format("%.1f", totalMEM - sc2.nextFloat()) + " MiB"; sc2.close(); @@ -1712,23 +1653,15 @@ public class ContractManager { return result; } /* - { - "name": "dx_substr", - "parameter": - { - "columnIndex":5, - "paras":["1","3"] - } - }, - */ - /*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"; - }*/ + * { "name": "dx_substr", "parameter": { "columnIndex":5, "paras":["1","3"] } }, + */ + /* + * 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) { // LOGGER.info(contractID); @@ -1770,8 +1703,10 @@ public class ContractManager { } public String loadMemory(ContractClient client, String path) { - if (client == null) return "no such contract client"; - if (path == null || path.length() == 0) return "no such memory file"; + if (client == null) + return "no such contract client"; + if (path == null || path.length() == 0) + return "no such memory file"; addLocalContractLog("loadMemory", client.contractMeta); return client.get.syncGet("", "loadMemory", path); } @@ -1810,13 +1745,12 @@ public class ContractManager { try { ContractClient client = getClient(contractID); if (client != null) { - return new ContractResult( - Status.Success, + return new ContractResult(Status.Success, new JsonPrimitive(client.get.syncGet("", "getLogSize", ""))); } // return new ContractResult(Status.Error, "cannot find contractID: " + contractID); - return new ContractResult( - Status.Error, new JsonPrimitive("cannot find contractID: " + contractID)); + return new ContractResult(Status.Error, + new JsonPrimitive("cannot find contractID: " + contractID)); } catch (Exception e) { e.printStackTrace(); return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage())); @@ -1827,13 +1761,11 @@ public class ContractManager { try { ContractClient client = getClient(contractID); if (client != null) { - return new ContractResult( - Status.Success, - new JsonPrimitive( - client.get.syncGet("", "requestLog", offset + "," + count))); + return new ContractResult(Status.Success, new JsonPrimitive( + client.get.syncGet("", "requestLog", offset + "," + count))); } - return new ContractResult( - Status.Error, new JsonPrimitive("cannot find contractID: " + contractID)); + return new ContractResult(Status.Error, + new JsonPrimitive("cannot find contractID: " + contractID)); } catch (Exception e) { e.printStackTrace(); return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage())); @@ -1844,13 +1776,11 @@ public class ContractManager { try { ContractClient client = getClient(contractID); if (client != null) { - return new ContractResult( - Status.Success, - new JsonPrimitive( - client.get.syncGet("", "requestLastLog", String.valueOf(count)))); + return new ContractResult(Status.Success, new JsonPrimitive( + client.get.syncGet("", "requestLastLog", String.valueOf(count)))); } - return new ContractResult( - Status.Error, new JsonPrimitive("cannot find contractID: " + contractID)); + return new ContractResult(Status.Error, + new JsonPrimitive("cannot find contractID: " + contractID)); } catch (Exception e) { e.printStackTrace(); return new ContractResult(Status.Exception, new JsonPrimitive(e.getMessage())); @@ -1858,140 +1788,91 @@ public class ContractManager { } /* - public void addContractInfo(String name, String owner, String traffic, String times) { - KeyValueDBUtil.instance.setValue( - CMTables.ContractInfo.toString(), - name, - "{\"owner\":\"" - + owner - + "\",\"traffic\":\"" - + traffic - + "\",\"times\":\"" - + times - + "\"}"); - } - */ + * public void addContractInfo(String name, String owner, String traffic, String times) { + * KeyValueDBUtil.instance.setValue( CMTables.ContractInfo.toString(), name, "{\"owner\":\"" + + * owner + "\",\"traffic\":\"" + traffic + "\",\"times\":\"" + times + "\"}"); } + */ - public void addLocalContractLog( - String action, String contractId, String contractName, String pubKey) { - String sb = - "{\"action\":\"" - + action - + "\",\"pubKey\":\"" - + pubKey - + "\",\"contractID\":\"" - + contractId - + "\",\"contractName\":\"" - + contractName - + "\",\"date\":" - + System.currentTimeMillis() - + "}"; + public void addLocalContractLog(String action, String contractId, String contractName, + String pubKey) { + String sb = "{\"action\":\"" + action + "\",\"pubKey\":\"" + pubKey + "\",\"contractID\":\"" + + contractId + "\",\"contractName\":\"" + contractName + "\",\"date\":" + + System.currentTimeMillis() + "}"; logsDB.put(contractName, sb); } - public void changePermission(String contractFileName, String pmList) { - } + public void changePermission(String contractFileName, String pmList) {} - // public String getSyncType(String contractName) { - // ContractClient client = getByName(contractName); - // if (client == null) { - // return "No this contract process,failed"; - // } + // public String getSyncType(String contractName) { + // ContractClient client = getByName(contractName); + // if (client == null) { + // return "No this contract process,failed"; + // } // - // String result = client.get.syncGet("", "getSyncType", ""); + // String result = client.get.syncGet("", "getSyncType", ""); // - // addLocalContractLog( - // "getSyncType", - // client.contract.getID(), - // client.contractName, - // client.contract.getOwner()); - // return result; - // } + // addLocalContractLog( + // "getSyncType", + // client.contract.getID(), + // client.contractName, + // client.contract.getOwner()); + // return result; + // } - // public String changeSyncType(String contractName, String type) { - // ContractClient client = getByName(contractName); - // if (client == null) { - // return "No this contract process,failed"; - // } + // public String changeSyncType(String contractName, String type) { + // ContractClient client = getByName(contractName); + // if (client == null) { + // return "No this contract process,failed"; + // } // - // String result = client.get.syncGet("", "changeSyncType", type); + // String result = client.get.syncGet("", "changeSyncType", type); // - // addLocalContractLog( - // "changeSyncType", - // client.contract.getID(), - // client.contractName, - // client.contract.getOwner()); - // return result; - // } + // addLocalContractLog( + // "changeSyncType", + // client.contract.getID(), + // client.contractName, + // client.contract.getOwner()); + // return result; + // } - // public String recoverBySync(String contractName) { - // ContractClient client = getByName(contractName); - // if (client == null) { - // return "No this contract process,failed"; - // } + // public String recoverBySync(String contractName) { + // ContractClient client = getByName(contractName); + // if (client == null) { + // return "No this contract process,failed"; + // } // - // String result = client.get.syncGet("", "recoverBySync", ""); + // String result = client.get.syncGet("", "recoverBySync", ""); // - // addLocalContractLog( - // "recoverBySync", - // client.contract.getID(), - // client.contractName, - // client.contract.getOwner()); - // return result; - // } + // addLocalContractLog( + // "recoverBySync", + // client.contract.getID(), + // client.contractName, + // client.contract.getOwner()); + // return result; + // } - public void addLocalContractLog( - String action, - String contractId, - String contractName, - String pubKey, - String function, - String costTime, - long totalGas, - long executionGas, - long extraGas, - Map logType) { + public void addLocalContractLog(String action, String contractId, String contractName, + String pubKey, String function, String costTime, long totalGas, long executionGas, + long extraGas, Map logType) { contractCounter.inc(); if (logType == null || logType.isEmpty()) { - logsDB.put( - contractName, + logsDB.put(contractName, String.format( "{\"action\":\"%s\",\"pubKey\":\"%s\"," + "\"contractID\":\"%s\",\"contractName\":\"%s\"," + "\"function\":\"%s\",\"costTime\":\"%s\"," + "\"totalGas\":\"%d\",\"executionGas\":\"%d\"," + "\"extraGas\":\"%d\",\"date\":\"%d\"}", - action, - pubKey, - contractId, - contractName, - function, - costTime, - totalGas, - executionGas, - extraGas, - System.currentTimeMillis())); + action, pubKey, contractId, contractName, function, costTime, totalGas, + executionGas, extraGas, System.currentTimeMillis())); } else { - StringBuilder str = - new StringBuilder() - .append("{\"action\":\"") - .append(action) - .append("\",\"pubKey\":\"") - .append(pubKey) - .append("\",\"contractID\":\"") - .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); + StringBuilder str = new StringBuilder().append("{\"action\":\"").append(action) + .append("\",\"pubKey\":\"").append(pubKey).append("\",\"contractID\":\"") + .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()) { str.append("\",\"").append(key).append("\":\"").append(logType.get(key)); @@ -2002,13 +1883,12 @@ public class ContractManager { } public String getTimesOfExecution(String contractName) { - return KeyValueDBUtil.instance.getValue( - CMTables.ContractInfo.toString(), contractName + "-Times"); + return KeyValueDBUtil.instance.getValue(CMTables.ContractInfo.toString(), + contractName + "-Times"); } public String getControlFlow(Contract c) { - if (null == analysisClient - || null == analysisClient.process + if (null == analysisClient || null == analysisClient.process || !analysisClient.process.isAlive()) { initAnalysisClient(); } @@ -2089,12 +1969,8 @@ public class ContractManager { String ret = client.get.syncGet("", "suicide", ""); JsonObject jo = JsonUtil.parseStringAsJsonObject(ret); if (jo.has("cleanSub")) { - REvent msg = - new REvent( - null, - REvent.REventType.UNSUBSCRIBE, - "{\"subscriber\":\"" + client.getContractName() + "\"}", - ""); + REvent msg = new REvent(null, REvent.REventType.UNSUBSCRIBE, + "{\"subscriber\":\"" + client.getContractName() + "\"}", ""); msg.doSignature(client.getPubkey(), client.getContractKey()); eventBroker.handle(msg); } @@ -2104,8 +1980,7 @@ public class ContractManager { } public String parseYpkPermissions(String ypkPath) { - if (null == analysisClient - || null == analysisClient.process + if (null == analysisClient || null == analysisClient.process || !analysisClient.process.isAlive()) { initAnalysisClient(); } @@ -2113,8 +1988,7 @@ public class ContractManager { } public String staticVerify(Contract c) { - if (null == analysisClient - || null == analysisClient.process + if (null == analysisClient || null == analysisClient.process || !analysisClient.process.isAlive()) { initAnalysisClient(); } @@ -2183,7 +2057,8 @@ public class ContractManager { this.sc = sc; this.TAG = tag; psList = new ArrayList<>(); - if (printStream != null) psList.add(printStream); + if (printStream != null) + psList.add(printStream); toRemove = new HashSet<>(); start(); } diff --git a/src/main/java/org/bdware/sc/ContractMeta.java b/src/main/java/org/bdware/sc/ContractMeta.java index ff595c9..cf93bfc 100644 --- a/src/main/java/org/bdware/sc/ContractMeta.java +++ b/src/main/java/org/bdware/sc/ContractMeta.java @@ -31,15 +31,8 @@ public class ContractMeta implements IDSerializable { boolean sigRequired; String thisPermission; // 合约当前权限 /* - { - "name": "dx_substr", - "parameter": - { - "columnIndex":5, - "paras":["1","3"] - } - }, - */ + * { "name": "dx_substr", "parameter": { "columnIndex":5, "paras":["1","3"] } }, + */ // MapMaskInfo; public ContractMeta() { @@ -116,7 +109,8 @@ public class ContractMeta implements IDSerializable { private FunctionDesp seekFunction(String action) { for (FunctionDesp desp : exportedFunctions) { - if (desp != null && desp.functionName.equals(action)) return desp; + if (desp != null && desp.functionName.equals(action)) + return desp; } return null; } @@ -132,4 +126,4 @@ public class ContractMeta implements IDSerializable { public void setContractExecutor(ContractExecutor executor) { this.contractExecutor = executor; } -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/ContractStatusEnum.java b/src/main/java/org/bdware/sc/ContractStatusEnum.java index fc7d23a..c34c06d 100644 --- a/src/main/java/org/bdware/sc/ContractStatusEnum.java +++ b/src/main/java/org/bdware/sc/ContractStatusEnum.java @@ -1,10 +1,8 @@ package org.bdware.sc; public enum ContractStatusEnum { - INIT(0, "初始化"), - RUNNING(1, "内存运行中"), - HANGED(2, "硬盘运行中"), - KILLED(3, "已停止"); + INIT(0, "初始化"), RUNNING(1, "内存运行中"), HANGED(2, "硬盘运行中"), KILLED(3, "已停止"); + private Integer code; private String desc; diff --git a/src/main/java/org/bdware/sc/ContractStatusRecorder.java b/src/main/java/org/bdware/sc/ContractStatusRecorder.java index be1b26e..a14610e 100644 --- a/src/main/java/org/bdware/sc/ContractStatusRecorder.java +++ b/src/main/java/org/bdware/sc/ContractStatusRecorder.java @@ -27,28 +27,24 @@ public class ContractStatusRecorder extends StatusRecorder { // 对外会有一个getContractClient的过程,如果只是想用元信息的,改成getContractClientMeta // 如果是想调用的,再使用getContractClient。 - // 合约执行的状态 key:合同id value:合同状态 - // private static final String DB_NAME = CMTables.ContractInfo.toString(); + // 合约执行的状态 key:合同id value:合同状态 + // private static final String DB_NAME = CMTables.ContractInfo.toString(); static { final Object flag = new Object(); // 调度一个task,在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调 - ContractManager.scheduledThreadPool.scheduleWithFixedDelay( - () -> { - boolean cleared = dealTimerContractProcess(); - if (cleared) { - synchronized (flag) { - try { - flag.wait(14000L); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } + ContractManager.scheduledThreadPool.scheduleWithFixedDelay(() -> { + boolean cleared = dealTimerContractProcess(); + if (cleared) { + synchronized (flag) { + try { + flag.wait(14000L); + } catch (InterruptedException e) { + e.printStackTrace(); } - }, - 0, - 1, - TimeUnit.SECONDS); + } + } + }, 0, 1, TimeUnit.SECONDS); } // contract id to client, changes when some contract is started/stopped/resumed @@ -65,32 +61,32 @@ public class ContractStatusRecorder extends StatusRecorder { } public static boolean dealTimerContractProcess() { - // if (id2ContractStatus == null) { - // String value = readDataFromDB(id2ContractStatusKey); - // id2ContractStatus = GSON.fromJson(value, Map.class); - // if (id2ContractStatus == null) { - // return true; - // } - // for (Map.Entry contractStatusEnumEntry : + // if (id2ContractStatus == null) { + // String value = readDataFromDB(id2ContractStatusKey); + // id2ContractStatus = GSON.fromJson(value, Map.class); + // if (id2ContractStatus == null) { + // return true; + // } + // for (Map.Entry contractStatusEnumEntry : // id2ContractStatus.entrySet()) { - // //获取合同id - // String contractID = contractStatusEnumEntry.getKey(); - // ContractStatusEnum contractStatusEnum = + // //获取合同id + // String contractID = contractStatusEnumEntry.getKey(); + // ContractStatusEnum contractStatusEnum = // contractStatusEnumEntry.getValue(); - // //没有状态信息就停止 - // if (contractStatusEnum == null) { - // continue; - // } - // //拥有合同状态信息的,如果是已经执行结束,我们将合同挂起 - // if + // //没有状态信息就停止 + // if (contractStatusEnum == null) { + // continue; + // } + // //拥有合同状态信息的,如果是已经执行结束,我们将合同挂起 + // if // (contractStatusEnum.getCode().equals(ContractStatusEnum.STORE.getCode())) { - // resumeContractProcess(contractID); - // } else if + // resumeContractProcess(contractID); + // } else if // (contractStatusEnum.getCode().equals(ContractStatusEnum.DONE.getCode())) { - // hangUpContractProcess(contractID); - // } - // } - // } + // hangUpContractProcess(contractID); + // } + // } + // } return true; } @@ -102,10 +98,11 @@ public class ContractStatusRecorder extends StatusRecorder { // TODO 是不是还有别的?这只是在内存里的哦。 try { for (ContractClient c : id2ContractClient.values()) { - if (Integer.parseInt(c.getPID()) == pid) return true; + if (Integer.parseInt(c.getPID()) == pid) + return true; } } catch (Exception e) { - // e.printStackTrace(); + // e.printStackTrace(); } return false; } @@ -174,9 +171,11 @@ public class ContractStatusRecorder extends StatusRecorder { // TODO index name to contract public ContractMeta getContractMeta(String idOrNameOrDOI) { - if (idOrNameOrDOI == null) return null; + if (idOrNameOrDOI == null) + return null; ContractMeta meta = getStatus().get(idOrNameOrDOI); - if (meta != null) return meta; + if (meta != null) + return meta; for (ContractMeta cc : getStatus().values()) { if (cc.status == ContractStatusEnum.RUNNING || cc.status == ContractStatusEnum.HANGED) if (idOrNameOrDOI.equals(cc.name)) { @@ -184,8 +183,10 @@ public class ContractStatusRecorder extends StatusRecorder { } } for (ContractMeta cc : getStatus().values()) { - if (cc.name == null) continue; - if (cc.contract == null) continue; + if (cc.name == null) + continue; + if (cc.contract == null) + continue; if (idOrNameOrDOI.equals(cc.name)) { return cc; } @@ -224,10 +225,8 @@ public class ContractStatusRecorder extends StatusRecorder { LOGGER.info("need dump when stop"); String contractName = client.getContractName(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH:mm:ss"); - File f = - new File( - ContractManager.dir + "/memory/" + contractName, - df.format(new Date())); + File f = new File(ContractManager.dir + "/memory/" + contractName, + df.format(new Date())); client.get.syncGet("", "getMemoryDump", f.getAbsolutePath()); ContractManager.instance.addLocalContractLog("dumpContract", meta); } @@ -281,9 +280,9 @@ public class ContractStatusRecorder extends StatusRecorder { resumeContractProcess(contractID); } // 似乎这样就可以了? - // } else if (meta.status == ContractStatusEnum.RUNNING) { - // hangUpContractProcess(contractID); - // } + // } else if (meta.status == ContractStatusEnum.RUNNING) { + // hangUpContractProcess(contractID); + // } } /** @@ -291,15 +290,15 @@ public class ContractStatusRecorder extends StatusRecorder { */ public synchronized void hangUpContractProcess(String contractID) { // dump stop 这里是正常流程代码 - // ContractClient contractClient = getContractClientById(contractID); - // if (contractClient == null) { - // return; - // } - // //挂起 - // Contract contract = contractClient.contract; - // ContractManager.instance.dumpContract(contract.getID(), null); - // setContractClient(contractID, contractClient); - // ContractManager.instance.hangUpStopContract(contract.getID()); + // ContractClient contractClient = getContractClientById(contractID); + // if (contractClient == null) { + // return; + // } + // //挂起 + // Contract contract = contractClient.contract; + // ContractManager.instance.dumpContract(contract.getID(), null); + // setContractClient(contractID, contractClient); + // ContractManager.instance.hangUpStopContract(contract.getID()); // todo 临时想强制测试下效果 ContractMeta contractMeta = getContractMeta(contractID); // 挂起 @@ -313,13 +312,12 @@ public class ContractStatusRecorder extends StatusRecorder { client.saveTimesAndTraffic(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd.HH_mm_ss"); // 设置日期格式 - File f = - new File( - ContractManager.dir + "/memory/" + contractMeta.name, - df.format(new Date())); + File f = new File(ContractManager.dir + "/memory/" + contractMeta.name, + df.format(new Date())); File parent = f.getParentFile(); 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.invokeContractSuicide(client); @@ -335,7 +333,7 @@ public class ContractStatusRecorder extends StatusRecorder { // 启动合约 // 加载所需要的内存 // 该方法调用方法已经考虑了内存问题,但是内存不足的时候,重试或者等待,或者将合约压到失败中稍后重试,可以尝试设计消息重试机制 - // 如果是内存中则唤起合同信息 todo 内存不足 关闭合约追赶,补偿数据 + // 如果是内存中则唤起合同信息 todo 内存不足 关闭合约追赶,补偿数据 if (meta.status == ContractStatusEnum.HANGED || meta.status == ContractStatusEnum.KILLED) { ContractStatusEnum preStatus = meta.status; // TODO Resume里复用的是start逻辑,启动完了就成Running了哦。可能不能这么来。 @@ -344,17 +342,11 @@ public class ContractStatusRecorder extends StatusRecorder { JsonUtil.fromJson(startContractResult, ContractResult.class); if (contractResult.status == ContractResult.Status.Error) { // 记录错误日志 - ContractManager.instance.addLocalContractLog( - "resumeContract error", - meta.contract.getID(), - meta.name, - meta.contract.getOwner()); + ContractManager.instance.addLocalContractLog("resumeContract error", + meta.contract.getID(), meta.name, meta.contract.getOwner()); } else { - ContractManager.instance.addLocalContractLog( - "resumeContract success", - meta.contract.getID(), - meta.name, - meta.contract.getOwner()); + ContractManager.instance.addLocalContractLog("resumeContract success", + meta.contract.getID(), meta.name, meta.contract.getOwner()); // TODO 可能会重复load相同的镜像? // 如果是killed 只根据manifest去判断是否加载memory // 可增加一个判断,如果hanged朋manifest里是加载memory,这里就不再加载了。 @@ -367,8 +359,8 @@ public class ContractStatusRecorder extends StatusRecorder { client.contractMeta.setStatus(ContractStatusEnum.RUNNING); updateValue(client.contractMeta); // 还要判断一发,是不是已有permission的值。如果有,要setPermission一把。 - // meta.status = ContractStatusEnum.RUNNING; - // updateValue(meta); + // meta.status = ContractStatusEnum.RUNNING; + // updateValue(meta); } } } @@ -416,30 +408,23 @@ public class ContractStatusRecorder extends StatusRecorder { ContractManager.instance.invokeContractSuicide(client); return false; } - LOGGER.debug( - String.format( - "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", - i, - client.getContractID(), - client.contractMeta.name, - client.getContractType(), - client.getContractKey(), - client.getPubkey(), - client.getContractCopies(), - client.contractMeta.contract.startInfo)); + LOGGER.debug(String.format( + "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", + i, client.getContractID(), client.contractMeta.name, + client.getContractType(), client.getContractKey(), client.getPubkey(), + client.getContractCopies(), client.contractMeta.contract.startInfo)); client.get.syncGet("", "setDir", ContractManager.dir); - // String str = client.getIdentifier(); + // String str = client.getIdentifier(); client.get.syncGet("", "getDumpPeriod", "a"); client.get.syncGet("", "startAutoDump", "a"); createContract(client); - LOGGER.info( - String.format("reconnect to port %d: contract %s", - i, client.contractMeta.name)); + LOGGER.info(String.format("reconnect to port %d: contract %s", i, + client.contractMeta.name)); return true; } } catch (Exception e) { - //just ignore + // just ignore } return false; } diff --git a/src/main/java/org/bdware/sc/MasterElectTimeRecorder.java b/src/main/java/org/bdware/sc/MasterElectTimeRecorder.java index 49cb473..1e301c1 100644 --- a/src/main/java/org/bdware/sc/MasterElectTimeRecorder.java +++ b/src/main/java/org/bdware/sc/MasterElectTimeRecorder.java @@ -1,15 +1,13 @@ package org.bdware.sc; -import java.util.HashMap; -import java.util.Map; -//Node +// Node public class MasterElectTimeRecorder { - public static Long findMasterCrash; //发现master崩溃的时间 - public static Long newMasterStart; //作为新的master newMasterStart被调用时间 - public static Long setLocalMaster; //在本地标记自己为master - public static Long slaveConnectFinish; //被slave连接完成 - public static Long masterStartRecover; //开始master恢复 - public static Long masterRecoverFinish; //master恢复结束 + public static Long findMasterCrash; // 发现master崩溃的时间 + public static Long newMasterStart; // 作为新的master newMasterStart被调用时间 + public static Long setLocalMaster; // 在本地标记自己为master + public static Long slaveConnectFinish; // 被slave连接完成 + public static Long masterStartRecover; // 开始master恢复 + public static Long masterRecoverFinish; // master恢复结束 } diff --git a/src/main/java/org/bdware/sc/MultiContractRecorder.java b/src/main/java/org/bdware/sc/MultiContractRecorder.java index 8d6f779..6c6de7a 100644 --- a/src/main/java/org/bdware/sc/MultiContractRecorder.java +++ b/src/main/java/org/bdware/sc/MultiContractRecorder.java @@ -20,10 +20,8 @@ public class MultiContractRecorder extends StatusRecorder { for (MultiContractMeta meta : getStatus().values()) { try { meta.initQueue(); - int lastExeSeq = - Integer.parseInt( - KeyValueDBUtil.instance.getValue( - CMTables.LastExeSeq.toString(), meta.getContractID())); + int lastExeSeq = Integer.parseInt(KeyValueDBUtil.instance + .getValue(CMTables.LastExeSeq.toString(), meta.getContractID())); meta.setLastExeSeq(lastExeSeq); } catch (Exception e) { LOGGER.error(e); @@ -32,13 +30,15 @@ public class MultiContractRecorder extends StatusRecorder { } public MultiContractMeta getMultiContractMeta(String idOrNameOrDOI) { - if (idOrNameOrDOI == null) return null; + if (idOrNameOrDOI == null) + return null; ContractMeta meta = ContractManager.instance.statusRecorder.getContractMeta(idOrNameOrDOI); return getMultiContractMeta(meta); } public MultiContractMeta getMultiContractMeta(ContractMeta meta) { - if (meta == null) return null; + if (meta == null) + return null; return getStatus().get(meta.id); } diff --git a/src/main/java/org/bdware/sc/ProjectRecorder.java b/src/main/java/org/bdware/sc/ProjectRecorder.java index b7aa912..1acc1be 100644 --- a/src/main/java/org/bdware/sc/ProjectRecorder.java +++ b/src/main/java/org/bdware/sc/ProjectRecorder.java @@ -7,7 +7,7 @@ import org.bdware.sc.db.StatusRecorder; public class ProjectRecorder extends StatusRecorder { static final String dbName = CMTables.ProjectConfig.toString(); static final String prefix = "Project_Config_"; -// private static final Logger LOGGER = LogManager.getLogger(ProjectRecorder.class); + // private static final Logger LOGGER = LogManager.getLogger(ProjectRecorder.class); public ProjectRecorder(String dir) { super(dir, dbName, prefix); diff --git a/src/main/java/org/bdware/sc/RecoverMechTimeRecorder.java b/src/main/java/org/bdware/sc/RecoverMechTimeRecorder.java index 59849b7..cb08f15 100644 --- a/src/main/java/org/bdware/sc/RecoverMechTimeRecorder.java +++ b/src/main/java/org/bdware/sc/RecoverMechTimeRecorder.java @@ -4,41 +4,41 @@ import java.util.HashMap; import java.util.Map; public class RecoverMechTimeRecorder { - //slave记录 - public static Long startCMHttpServer; //启动 - public static Long startFinish; //启动完成,开始连接NC - public static Long connectNCFinish; //连接NC完成 + // slave记录 + public static Long startCMHttpServer; // 启动 + public static Long startFinish; // 启动完成,开始连接NC + public static Long connectNCFinish; // 连接NC完成 - public static Long startReconnectCP; //开始重连CP - public static Long reconnectCPFinish; //重连CP完成 + public static Long startReconnectCP; // 开始重连CP + public static Long reconnectCPFinish; // 重连CP完成 - public static Long startQueryMaster; //开始查看master是谁 - public static Long queryMasterFinish; //查到master是谁,开始连接master - public static Long connectMasterFinish; //连接master完成 + public static Long startQueryMaster; // 开始查看master是谁 + public static Long queryMasterFinish; // 查到master是谁,开始连接master + public static Long connectMasterFinish; // 连接master完成 - public static Long startRecover; //开始恢复,slave的askForRecover被调用 + public static Long startRecover; // 开始恢复,slave的askForRecover被调用 - public static Long startCommonRecover; //slave开始从common恢复 - public static Long startStableRecover; //slave开始从stable恢复 + public static Long startCommonRecover; // slave开始从common恢复 + public static Long startStableRecover; // slave开始从stable恢复 - public static Long stableLoadFinish; //stable恢复模式load完成 - public static Long stableRedoFinish; //stable恢复模式redo完成 + public static Long stableLoadFinish; // stable恢复模式load完成 + public static Long stableRedoFinish; // stable恢复模式redo完成 - public static Long startRedoTransFromMaster; //redo从master传来的trans + public static Long startRedoTransFromMaster; // redo从master传来的trans - //master记录,key是slave的pubKey - public static Map masterStartRecoverNode = new HashMap(); //master的askForRecover被调用 + // master记录,key是slave的pubKey + public static Map masterStartRecoverNode = new HashMap(); // master的askForRecover被调用 - public static Map startJudgeRecoverMethod = new HashMap(); //开始判断某个节点的恢复方式 - public static Map judgeRecoverMethodFinish = new HashMap(); //判断某节点恢复方式完成 + public static Map startJudgeRecoverMethod = new HashMap(); // 开始判断某个节点的恢复方式 + public static Map judgeRecoverMethodFinish = new HashMap(); // 判断某节点恢复方式完成 - public static Map startRecoverFromCommon = new HashMap(); //slave从common恢复master的nodeRestartFromCommonMode方法开始时间 - public static Map writeCEIStart = new HashMap(); //开始dumpContract等cei信息 - public static Map finishWriteCEI = new HashMap(); //将cei写入文件完成 + public static Map startRecoverFromCommon = new HashMap(); // slave从common恢复master的nodeRestartFromCommonMode方法开始时间 + public static Map writeCEIStart = new HashMap(); // 开始dumpContract等cei信息 + public static Map finishWriteCEI = new HashMap(); // 将cei写入文件完成 - public static Map startRecoverFromStable = new HashMap(); //slave从common恢复master的restartFromStableMode方法开始时间 + public static Map startRecoverFromStable = new HashMap(); // slave从common恢复master的restartFromStableMode方法开始时间 - public static Map recoverFinish = new HashMap(); + public static Map recoverFinish = new HashMap(); } diff --git a/src/main/java/org/bdware/sc/consistency/CommitAlgorithm.java b/src/main/java/org/bdware/sc/consistency/CommitAlgorithm.java index f02f95f..a5effa7 100644 --- a/src/main/java/org/bdware/sc/consistency/CommitAlgorithm.java +++ b/src/main/java/org/bdware/sc/consistency/CommitAlgorithm.java @@ -9,4 +9,4 @@ public interface CommitAlgorithm { void setCommitter(Committer c); void setConnection(TrustfulExecutorConnection c); -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/consistency/Pair.java b/src/main/java/org/bdware/sc/consistency/Pair.java index df14ed9..74fc2df 100644 --- a/src/main/java/org/bdware/sc/consistency/Pair.java +++ b/src/main/java/org/bdware/sc/consistency/Pair.java @@ -1,11 +1,11 @@ package org.bdware.sc.consistency; public class Pair { - public T1 first; - public T2 second; + public T1 first; + public T2 second; - public Pair(T1 t1, T2 t2) { - first = t1; - second = t2; - } + public Pair(T1 t1, T2 t2) { + first = t1; + second = t2; + } } diff --git a/src/main/java/org/bdware/sc/consistency/pbft/PBFTAlgorithm.java b/src/main/java/org/bdware/sc/consistency/pbft/PBFTAlgorithm.java index a798732..ef663e5 100644 --- a/src/main/java/org/bdware/sc/consistency/pbft/PBFTAlgorithm.java +++ b/src/main/java/org/bdware/sc/consistency/pbft/PBFTAlgorithm.java @@ -65,9 +65,9 @@ public class PBFTAlgorithm implements CommitAlgorithm { LOGGER.info("recv: " + pbftMessage.getDisplayStr()); switch (pbftMessage.type) { case AddMember: - // PBFTMember member = PBFTMember.parse(pbftMessage.content); - // if (member != null) - // members.put(sender, member); + // PBFTMember member = PBFTMember.parse(pbftMessage.content); + // if (member != null) + // members.put(sender, member); // case DeleteMember: // JUST ignore break; @@ -79,7 +79,8 @@ public class PBFTAlgorithm implements CommitAlgorithm { prepareMsg = new PBFTMessage(); prepareMsg.order = allocatedID.incrementAndGet(); 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.request = pbftMessage; @@ -108,7 +109,8 @@ public class PBFTAlgorithm implements CommitAlgorithm { break; case Prepare: 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) { PCInfo pcInfo = new PCInfo(); pcInfo.buff.add(pbftMessage); @@ -155,7 +157,8 @@ public class PBFTAlgorithm implements CommitAlgorithm { prepareMsg.order = pbftMessage.order; prepareMsg.type = PBFTType.PrePrepare; 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); } default: @@ -196,18 +199,19 @@ public class PBFTAlgorithm implements CommitAlgorithm { private void requestPrePrepareFromMaster(long order) { -// PBFTMessage message = new PBFTMessage(); -// message.type = PBFTType.ReSend; -// message.order = order; -// message.content = new byte[1]; -// sendToMaster(message); + // PBFTMessage message = new PBFTMessage(); + // message.type = PBFTType.ReSend; + // message.order = order; + // message.content = new byte[1]; + // sendToMaster(message); LOGGER.info("request Resend"); } private void matchPrePrepareFromOriginReqeust(int hash, PBFTMessage pbftMessage) { for (PCInfo pcInfo : info.values()) { 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); return; } @@ -220,10 +224,8 @@ public class PBFTAlgorithm implements CommitAlgorithm { } private void retryLater(int delay, final Node sender, final PBFTMessage pbftMessage) { - ContractManager.scheduledThreadPool.schedule( - () -> onPBFTMessage(sender, pbftMessage), - delay, - TimeUnit.MILLISECONDS); + ContractManager.scheduledThreadPool.schedule(() -> onPBFTMessage(sender, pbftMessage), + delay, TimeUnit.MILLISECONDS); } private void handlePrePrepare(PBFTMessage pbftMessage, PBFTMessage req) { @@ -372,8 +374,8 @@ public class PBFTAlgorithm implements CommitAlgorithm { if (!isPrePrepareReceived) { return false; } -// System.out.println("---: updatePrepare, size:" + prepare.size() + " -->" -// + (center.members.size() / 3 * 2 + 1) + " --senderID:" + message.sendID); + // System.out.println("---: updatePrepare, size:" + prepare.size() + " -->" + // + (center.members.size() / 3 * 2 + 1) + " --senderID:" + message.sendID); if (prepare.size() > center.members.size() / 3 * 2) { isSendCommit = true; @@ -399,8 +401,8 @@ public class PBFTAlgorithm implements CommitAlgorithm { public String getDisplayStr() { return "pSize:" + (prepare == null ? "null" : prepare.size()) + " cSize:" - + (commit == null ? "null" : commit.size()) + " isSendCommit:" + isSendCommit + " isSendReply:" - + isSendReply + " buffSize:" + buff.size(); + + (commit == null ? "null" : commit.size()) + " isSendCommit:" + isSendCommit + + " isSendReply:" + isSendReply + " buffSize:" + buff.size(); } } } diff --git a/src/main/java/org/bdware/sc/consistency/pbft/PBFTMember.java b/src/main/java/org/bdware/sc/consistency/pbft/PBFTMember.java index 56bc77d..84953ec 100644 --- a/src/main/java/org/bdware/sc/consistency/pbft/PBFTMember.java +++ b/src/main/java/org/bdware/sc/consistency/pbft/PBFTMember.java @@ -9,35 +9,35 @@ import java.io.Serializable; public class PBFTMember implements Serializable { - private static final long serialVersionUID = -3058672609865345062L; - public boolean isMaster; + private static final long serialVersionUID = -3058672609865345062L; + public boolean isMaster; - public boolean isMaster() { - return isMaster; - } + public boolean isMaster() { + return isMaster; + } - public static PBFTMember parse(byte[] content) { - try { - ByteArrayInputStream input = new ByteArrayInputStream(content); - ObjectInputStream objectInputStream = new ObjectInputStream(input); - PBFTMember ret = (PBFTMember) objectInputStream.readObject(); - return ret; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + public static PBFTMember parse(byte[] content) { + try { + ByteArrayInputStream input = new ByteArrayInputStream(content); + ObjectInputStream objectInputStream = new ObjectInputStream(input); + PBFTMember ret = (PBFTMember) objectInputStream.readObject(); + return ret; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } - public byte[] toByteArray() { - ObjectOutputStream out; - try { - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - out = new ObjectOutputStream(bo); - out.writeObject(this); - return bo.toByteArray(); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } + public byte[] toByteArray() { + ObjectOutputStream out; + try { + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + out = new ObjectOutputStream(bo); + out.writeObject(this); + return bo.toByteArray(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/org/bdware/sc/consistency/pbft/PBFTMessage.java b/src/main/java/org/bdware/sc/consistency/pbft/PBFTMessage.java index 731b186..8509725 100644 --- a/src/main/java/org/bdware/sc/consistency/pbft/PBFTMessage.java +++ b/src/main/java/org/bdware/sc/consistency/pbft/PBFTMessage.java @@ -7,97 +7,97 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; public class PBFTMessage { - PBFTType type; - int sendID; - long order; - byte[] content; - String stamp;// time-stamp or other string, given by client, to identify the content - String signature; + PBFTType type; + int sendID; + long order; + byte[] content; + String stamp;// time-stamp or other string, given by client, to identify the content + String signature; - public int getBytesHash() { - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - bo.write(type.toInt()); - ByteUtil.writeLong(bo, sendID); - ByteUtil.writeLong(bo, order); - try { - bo.write(content); - } catch (IOException e) { - e.printStackTrace(); - } - byte[] ret = bo.toByteArray(); - int hashCode = ret.hashCode(); - return hashCode; - } + public int getBytesHash() { + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + bo.write(type.toInt()); + ByteUtil.writeLong(bo, sendID); + ByteUtil.writeLong(bo, order); + try { + bo.write(content); + } catch (IOException e) { + e.printStackTrace(); + } + byte[] ret = bo.toByteArray(); + int hashCode = ret.hashCode(); + return hashCode; + } - public byte[] getBytes() { - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - try { - bo.write(type.toInt()); - ByteUtil.writeInt(bo, sendID); - ByteUtil.writeLong(bo, order); - if (signature != null) { - byte[] signature = this.signature.getBytes(); - ByteUtil.writeInt(bo, signature.length); - bo.write(signature); - } else - ByteUtil.writeInt(bo, 0); + public byte[] getBytes() { + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + try { + bo.write(type.toInt()); + ByteUtil.writeInt(bo, sendID); + ByteUtil.writeLong(bo, order); + if (signature != null) { + byte[] signature = this.signature.getBytes(); + ByteUtil.writeInt(bo, signature.length); + bo.write(signature); + } else + ByteUtil.writeInt(bo, 0); - bo.write(content); - } catch (IOException e) { - e.printStackTrace(); - } - return bo.toByteArray(); - } + bo.write(content); + } catch (IOException e) { + e.printStackTrace(); + } + return bo.toByteArray(); + } - public static PBFTMessage parse(byte[] b) { - PBFTMessage msg = new PBFTMessage(); - ByteArrayInputStream bi = new ByteArrayInputStream(b); - msg.type = PBFTType.fromByte(bi.read()); - msg.sendID = ByteUtil.readInt(bi); - msg.order = ByteUtil.readLong(bi); - int sigLen = ByteUtil.readInt(bi); - if (sigLen > 0) - msg.signature = new String(ByteUtil.readBytes(bi, sigLen)); - else - msg.signature = null; - msg.content = ByteUtil.readBytes(bi, b.length - 1 - 4 - 8 - 4 - sigLen); - return msg; - } + public static PBFTMessage parse(byte[] b) { + PBFTMessage msg = new PBFTMessage(); + ByteArrayInputStream bi = new ByteArrayInputStream(b); + msg.type = PBFTType.fromByte(bi.read()); + msg.sendID = ByteUtil.readInt(bi); + msg.order = ByteUtil.readLong(bi); + int sigLen = ByteUtil.readInt(bi); + if (sigLen > 0) + msg.signature = new String(ByteUtil.readBytes(bi, sigLen)); + else + msg.signature = null; + msg.content = ByteUtil.readBytes(bi, b.length - 1 - 4 - 8 - 4 - sigLen); + return msg; + } - private static String IDA = "PBFTMsg"; + private static String IDA = "PBFTMsg"; -// public void sign(SM2KeyPair pair) { -// sendID = Arrays.hashCode(pair.getPublicKey().getEncoded(false)); -// signature = sm02.sign(content, IDA, pair).toString(); -// } -// -// public boolean verify(PBFTMember member) { -// return sm02.verify(content, Signature.loadFromString(signature), IDA, -// SM2KeyPair.publicKeyStr2ECPoint(member.pubKey)); -// } + // public void sign(SM2KeyPair pair) { + // sendID = Arrays.hashCode(pair.getPublicKey().getEncoded(false)); + // signature = sm02.sign(content, IDA, pair).toString(); + // } + // + // public boolean verify(PBFTMember member) { + // return sm02.verify(content, Signature.loadFromString(signature), IDA, + // SM2KeyPair.publicKeyStr2ECPoint(member.pubKey)); + // } - public void setType(PBFTType type) { - this.type = type; - } + public void setType(PBFTType type) { + this.type = type; + } - public void setContent(byte[] content) { - this.content = content; - } + public void setContent(byte[] content) { + this.content = content; + } - public String getDisplayStr() { - StringBuilder sb = new StringBuilder(); - sb.append(sendID); - sb.append("_"); - sb.append(order); - sb.append("_TYPE_").append(type); - sb.append(" --> sig:"); - sb.append(signature); - sb.append(" content:"); - sb.append(new String(content)); - return sb.toString(); - } + public String getDisplayStr() { + StringBuilder sb = new StringBuilder(); + sb.append(sendID); + sb.append("_"); + sb.append(order); + sb.append("_TYPE_").append(type); + sb.append(" --> sig:"); + sb.append(signature); + sb.append(" content:"); + sb.append(new String(content)); + return sb.toString(); + } - public void setOrder(long order) { - this.order = order; - } + public void setOrder(long order) { + this.order = order; + } } diff --git a/src/main/java/org/bdware/sc/consistency/pbft/PBFTType.java b/src/main/java/org/bdware/sc/consistency/pbft/PBFTType.java index f4f1999..bff44b8 100644 --- a/src/main/java/org/bdware/sc/consistency/pbft/PBFTType.java +++ b/src/main/java/org/bdware/sc/consistency/pbft/PBFTType.java @@ -1,35 +1,36 @@ package org.bdware.sc.consistency.pbft; public enum PBFTType { - Request(0), PrePrepare(1), Prepare(2), Commit(3), Reply(4), Unknown(5), ReSend(6), AddMember(7); - private int type; + Request(0), PrePrepare(1), Prepare(2), Commit(3), Reply(4), Unknown(5), ReSend(6), AddMember(7); - PBFTType(int i) { - type = i; - } + private int type; - public static PBFTType fromByte(int i) { - switch (i) { - case 0: - return Request; - case 1: - return PrePrepare; - case 2: - return Prepare; - case 3: - return Commit; - case 4: - return Reply; - case 6: - return ReSend; - case 7: - return AddMember; - default: - return Unknown; - } - } + PBFTType(int i) { + type = i; + } - public int toInt() { - return type; - } + public static PBFTType fromByte(int i) { + switch (i) { + case 0: + return Request; + case 1: + return PrePrepare; + case 2: + return Prepare; + case 3: + return Commit; + case 4: + return Reply; + case 6: + return ReSend; + case 7: + return AddMember; + default: + return Unknown; + } + } + + public int toInt() { + return type; + } } diff --git a/src/main/java/org/bdware/sc/consistency/pbft/ViewAlgorithm.java b/src/main/java/org/bdware/sc/consistency/pbft/ViewAlgorithm.java index d946cc9..9c8dc44 100644 --- a/src/main/java/org/bdware/sc/consistency/pbft/ViewAlgorithm.java +++ b/src/main/java/org/bdware/sc/consistency/pbft/ViewAlgorithm.java @@ -4,8 +4,6 @@ import org.bdware.sc.bean.ContractRequest; import org.bdware.sc.conn.Node; import org.bdware.sc.consistency.CommitAlgorithm; 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; public class ViewAlgorithm implements CommitAlgorithm { @@ -13,8 +11,7 @@ public class ViewAlgorithm implements CommitAlgorithm { private Committer committer; private TrustfulExecutorConnection connection; - public ViewAlgorithm(boolean isMaster) { - } + public ViewAlgorithm(boolean isMaster) {} public void setCommitter(Committer c) { committer = c; @@ -32,4 +29,4 @@ public class ViewAlgorithm implements CommitAlgorithm { committer.onCommit(cr); } } -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/event/EventBroker.java b/src/main/java/org/bdware/sc/event/EventBroker.java index d40f699..3271ba9 100644 --- a/src/main/java/org/bdware/sc/event/EventBroker.java +++ b/src/main/java/org/bdware/sc/event/EventBroker.java @@ -34,7 +34,7 @@ public class EventBroker { private final Map id2Consumers; private final Map threadFlags; private final Map tempTopics; - // private final Map> client2Events; + // private final Map> client2Events; public EventBroker() { center = new EventCenter(); @@ -49,43 +49,32 @@ public class EventBroker { tempTopics = recorder.recoverTempTopicsFromDb(); // regularly check temporary topics and clean them - ContractManager.scheduledThreadPool.scheduleWithFixedDelay( - () -> { - long current = System.currentTimeMillis(); - int oldSize = tempTopics.size(); - tempTopics.keySet().forEach(topic -> { - if (tempTopics.get(topic) + EXPIRED_TIME > current) { - String reqID = - ContractManager.instance.nodeCenterConn.getNodeId() + - "_" + System.currentTimeMillis(); - REvent cleanEvent = - new REvent( - topic, - UNSUBSCRIBE, - null, - reqID); - cleanEvent.doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair()); - handle(cleanEvent); - tempTopics.remove(topic); - } - }); - if (oldSize != tempTopics.size()) { - recorder.saveTempTopics(tempTopics); - } - }, - 0L, - EXPIRED_TIME, - TimeUnit.MILLISECONDS); + ContractManager.scheduledThreadPool.scheduleWithFixedDelay(() -> { + long current = System.currentTimeMillis(); + int oldSize = tempTopics.size(); + tempTopics.keySet().forEach(topic -> { + if (tempTopics.get(topic) + EXPIRED_TIME > current) { + String reqID = ContractManager.instance.nodeCenterConn.getNodeId() + "_" + + System.currentTimeMillis(); + REvent cleanEvent = new REvent(topic, UNSUBSCRIBE, null, reqID); + cleanEvent + .doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair()); + handle(cleanEvent); + tempTopics.remove(topic); + } + }); + if (oldSize != tempTopics.size()) { + recorder.saveTempTopics(tempTopics); + } + }, 0L, EXPIRED_TIME, TimeUnit.MILLISECONDS); // regularly create check point in database ContractManager.scheduledThreadPool.scheduleAtFixedRate( - () -> recorder.createCheckPoint(topic2cIds, id2Consumers), - EXPIRED_TIME, - EXPIRED_TIME, - TimeUnit.MILLISECONDS); + () -> recorder.createCheckPoint(topic2cIds, id2Consumers), EXPIRED_TIME, + EXPIRED_TIME, TimeUnit.MILLISECONDS); NodeConsumer.setCenter(center); -// client2Events = new HashMap<>(); + // client2Events = new HashMap<>(); LOGGER.info("Event Broker starts!"); } @@ -106,7 +95,8 @@ public class EventBroker { IEventConsumer consumer = doSubscribe(event); // save & try to sub in center recorder.appendEvent(event); - center.subInCenter(event.getTopic(), event.getSemantics(), event.getCenter(), consumer, event); + center.subInCenter(event.getTopic(), event.getSemantics(), event.getCenter(), + consumer, event); } break; case UNSUBSCRIBE: @@ -116,9 +106,10 @@ public class EventBroker { case PUBLISH: case PREPUB: case PRESUB: - LOGGER.info(String.format("Receive %s event from topic %s", event.getSemantics(), topic)); - LOGGER.debug(String.format("Receive %s event %s: %s", - event.getSemantics(), topic, event.getContent())); + LOGGER.info(String.format("Receive %s event from topic %s", event.getSemantics(), + topic)); + LOGGER.debug(String.format("Receive %s event %s: %s", event.getSemantics(), topic, + event.getContent())); if (event.isForward()) { // send event to the event center event.setForward(center.deliverEvent(topic, event)); @@ -153,17 +144,14 @@ public class EventBroker { /** * do subscribing in registry * - * @param topic event topic - * @param consumer the consumer - * @param topic2cIds topic registry of broker or a check point in event recorder + * @param topic event topic + * @param consumer the consumer + * @param topic2cIds topic 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 */ - public boolean subInReg( - String topic, - IEventConsumer consumer, - Map> topic2cIds, - Map id2Consumers) { + public boolean subInReg(String topic, IEventConsumer consumer, + Map> topic2cIds, Map id2Consumers) { if (null == consumer) { return false; } @@ -177,8 +165,8 @@ public class EventBroker { topic2cIds.get(topic).add(cId); switch (consumer.getType()) { case Contract: - LOGGER.info("contract " + ((ContractConsumer) consumer).getContract() + - " subscribes topic " + topic); + LOGGER.info("contract " + ((ContractConsumer) consumer).getContract() + + " subscribes topic " + topic); break; case Node: LOGGER.info("node " + consumer.getId() + " subscribes topic " + topic); @@ -199,24 +187,22 @@ public class EventBroker { * do subscribing in registry
* topic and consumer must not be null at the same time *
    - *
  • if consumer is null and topic is not, it means the topic is a temporary topic, remove it
  • - *
  • if topic is null and consumer is not, - * it means a consumer or a contract wants to unsubscribe all topics, - * remove all related consumers in topic registry and consumer registry
  • - *
  • if two of them is not null, do unsubscribing in two registries
  • + *
  • if consumer is null and topic is not, it means the topic is a temporary topic, remove + * it
  • + *
  • if topic is null and consumer is not, it means a consumer or a contract wants to + * unsubscribe all topics, remove all related consumers in topic registry and consumer + * registry
  • + *
  • if two of them is not null, do unsubscribing in two registries
  • *
* - * @param topic event topic - * @param consumer the consumer, just id is required - * @param topic2cIds topic registry of broker or a check point in event recorder + * @param topic event topic + * @param consumer the consumer, just id is required + * @param topic2cIds topic 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 */ - public boolean unsubInReg( - String topic, - IEventConsumer consumer, - Map> topic2cIds, - Map id2Consumers) { + public boolean unsubInReg(String topic, IEventConsumer consumer, + Map> topic2cIds, Map id2Consumers) { if (null == topic && null == consumer) { return false; } @@ -236,7 +222,8 @@ public class EventBroker { // if cId belongs to a contract, find all related consumers toRmIds = new ArrayList<>(); 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); } }); @@ -259,7 +246,8 @@ public class EventBroker { /** * parse consumer information from content str
- * 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]"} * @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 NEED_RETRY: // send events to all - topicConsumers.forEach(cId -> - deliverEvent(event, cEvent, nEventStr, cId, topic, true)); + topicConsumers + .forEach(cId -> deliverEvent(event, cEvent, nEventStr, cId, topic, true)); break; case AT_MOST_ONCE: // send event to a random consumer // AT_MOST_ONCE, so broker don't need to do anything when delivering fails - deliverEvent( - event, - cEvent, - nEventStr, - topicConsumers.toArray()[(int) (Math.random() * topicConsumers.size())].toString(), - topic, - true); + deliverEvent(event, cEvent, nEventStr, + topicConsumers.toArray()[(int) (Math.random() * topicConsumers.size())] + .toString(), + topic, true); break; case ONLY_ONCE: switch (event.getType()) { @@ -343,20 +328,14 @@ public class EventBroker { // send PREPUB events to all consumers // TODO if there are no consumers to receive the ONLY_ONCE events? ContractManager.threadPool.execute(() -> { - REvent prePubMsg = new REvent(event.getTopic(), - PREPUB, - contentHash, + REvent prePubMsg = new REvent(event.getTopic(), PREPUB, contentHash, event.getRequestID()); - prePubMsg.doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair()); - topicConsumers.forEach(cId -> - deliverEvent(prePubMsg, - new Event(event.getTopic(), - contentHash, - prePubMsg.getSemantics()), - JsonUtil.toJson(prePubMsg), - cId, - topic, - false)); + prePubMsg.doSignature( + ContractManager.instance.nodeCenterConn.getNodeKeyPair()); + topicConsumers.forEach(cId -> deliverEvent(prePubMsg, + new Event(event.getTopic(), contentHash, + prePubMsg.getSemantics()), + JsonUtil.toJson(prePubMsg), cId, topic, false)); // wait for responses from contracts (PRESUB events) while (true) { try { @@ -364,21 +343,21 @@ public class EventBroker { flag.wait(30 * 1000L); } if (!flag.get().isEmpty()) { - REvent finalMsg = new REvent(flag.get(), - PUBLISH, - event.getContent(), - HashUtil.sha3( - contentHash + System.currentTimeMillis())); + REvent finalMsg = new REvent(flag.get(), PUBLISH, + event.getContent(), HashUtil.sha3(contentHash + + System.currentTimeMillis())); // if the delivering fails, retry publishing finalMsg.setSemantics(NEED_RETRY); finalMsg.doSignature( - ContractManager.instance.nodeCenterConn.getNodeKeyPair()); + ContractManager.instance.nodeCenterConn + .getNodeKeyPair()); handle(finalMsg); break; } } catch (InterruptedException e) { - LOGGER.warn("ONLY_ONE event delivering is interrupted: " + e.getMessage()); -// e.printStackTrace(); + LOGGER.warn("ONLY_ONE event delivering is interrupted: " + + e.getMessage()); + // e.printStackTrace(); } } }); @@ -395,20 +374,16 @@ public class EventBroker { /** * publish the event to the consumer * - * @param event event message - * @param cEvent simple event message to the contract consumer, only topic, content and semantics + * @param event event message + * @param cEvent simple event message to the contract consumer, only topic, content and + * semantics * @param nEventStr event message to the node - * @param cId consumer id - * @param topic topic of the event - * @param isPub if the event is published or pre-published + * @param cId consumer id + * @param topic topic of the event + * @param isPub if the event is published or pre-published */ - private void deliverEvent( - REvent event, - Event cEvent, - String nEventStr, - String cId, - String topic, - boolean isPub) { + private void deliverEvent(REvent event, Event cEvent, String nEventStr, String cId, + String topic, boolean isPub) { if (id2Consumers.containsKey(cId)) { IEventConsumer consumer = id2Consumers.get(cId); if (consumer instanceof ContractConsumer) { @@ -419,31 +394,24 @@ public class EventBroker { public void onResult(String unused) { // if the delivering fails, unsubscribe the consumer ContractConsumer c = (ContractConsumer) consumer; - ContractClient client = ContractManager.instance.getClient(c.getContract()); - String reqID = - ContractManager.instance.nodeCenterConn.getNodeKeyPair().getPublicKeyStr() + - "_" + System.currentTimeMillis(); - REvent unsubEvent = - new REvent( - topic, - UNSUBSCRIBE, - "{\"subscriber\":\"" + cId + "\"}", - reqID); + ContractClient client = + ContractManager.instance.getClient(c.getContract()); + String reqID = ContractManager.instance.nodeCenterConn.getNodeKeyPair() + .getPublicKeyStr() + "_" + System.currentTimeMillis(); + REvent unsubEvent = new REvent(topic, UNSUBSCRIBE, + "{\"subscriber\":\"" + cId + "\"}", reqID); unsubEvent.doSignature(client.getPubkey(), client.getContractKey()); handle(unsubEvent); // if the event is an ONLY_ONCE event, retry publishing if (NEED_RETRY.equals(event.getSemantics())) { - REvent newMsg = - new REvent( - topic.split("\\|")[0], - PUBLISH, - event.getContent(), - event.getRequestID()); + REvent newMsg = new REvent(topic.split("\\|")[0], PUBLISH, + event.getContent(), event.getRequestID()); newMsg.setSemantics(ONLY_ONCE); newMsg.setHash(event.getHash()); newMsg.setTxHash(event.getTxHash()); - newMsg.doSignature(ContractManager.instance.nodeCenterConn.getNodeKeyPair()); + newMsg.doSignature( + ContractManager.instance.nodeCenterConn.getNodeKeyPair()); handle(newMsg); } } @@ -465,8 +433,8 @@ public class EventBroker { }); } else if (isPub) { // client consumer - ContractManager.threadPool.execute(() -> - consumer.publishEvent(nEventStr, new ResultCallback() { + ContractManager.threadPool + .execute(() -> consumer.publishEvent(nEventStr, new ResultCallback() { @Override public void onResult(String unused) { unsubInReg(null, consumer, topic2cIds, id2Consumers); @@ -501,4 +469,4 @@ public class EventBroker { this.flag = flag; } } -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/event/EventCenter.java b/src/main/java/org/bdware/sc/event/EventCenter.java index dcb8bd9..b286ccb 100644 --- a/src/main/java/org/bdware/sc/event/EventCenter.java +++ b/src/main/java/org/bdware/sc/event/EventCenter.java @@ -12,13 +12,13 @@ import static org.bdware.sc.ContractManager.instance; * @author Kaidong Wu */ public class EventCenter { -// private static final Logger LOGGER = LogManager.getLogger(EventCenter.class); + // private static final Logger LOGGER = LogManager.getLogger(EventCenter.class); /** * get the nearest node to the topic in the hash function range * * @param topic the topic - * @param k the number of centers + * @param k the number of centers * @return id of the node */ public String[] getCenterByTopic(String topic, int k) { @@ -35,21 +35,19 @@ public class EventCenter { /** * subscribe a topic in center * - * @param topic event topic + * @param topic event topic * @param semantics event semantics, used to mark PRESUB events - * @param center id of event center if the subscribing has been handled - * @param consumer consumer - * @param event original event + * @param center id of event center if the subscribing has been handled + * @param consumer consumer + * @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) { return; } - REvent msg = new REvent(topic, - REvent.REventType.SUBSCRIBE, - String.format("{\"subscriber\":\"%s\"}", - instance.nodeCenterConn.getNodeId()), - ""); + REvent msg = new REvent(topic, REvent.REventType.SUBSCRIBE, + String.format("{\"subscriber\":\"%s\"}", instance.nodeCenterConn.getNodeId()), ""); msg.setSemantics(semantics); msg.doSignature(instance.nodeCenterConn.getNodeKeyPair()); msg.setCenter(center); @@ -96,11 +94,11 @@ public class EventCenter { * publish an event to another node; used by NodeConsumer * * @param target id of the target node - * @param eStr event string + * @param eStr event string */ public void publishEvent(String target, String eStr) { if (null != instance.masterStub) { instance.masterStub.deliverEvent(target, eStr); } } -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/event/EventRecorder.java b/src/main/java/org/bdware/sc/event/EventRecorder.java index a03c93b..87dbe73 100644 --- a/src/main/java/org/bdware/sc/event/EventRecorder.java +++ b/src/main/java/org/bdware/sc/event/EventRecorder.java @@ -53,7 +53,7 @@ public class EventRecorder { } public void createCheckPoint(Map> topic2cIds, - Map id2Consumers) { + Map id2Consumers) { CheckPoint cp = new CheckPoint(topic2cIds, id2Consumers); synchronized (latestEvent) { if (!latestEvent.isCp()) { @@ -79,9 +79,10 @@ public class EventRecorder { String key = KeyValueRocksDBUtil.instance.getValue(dbName, LATEST_EVENT_KEY); latestEvent.set(key); CheckPoint cp = new CheckPoint(); - Type topic2cIdsType = TypeToken.getParameterized(ConcurrentHashMap.class, String.class, - TypeToken.getParameterized(Set.class, String.class, - String.class).getType()).getType(); + Type topic2cIdsType = TypeToken + .getParameterized(ConcurrentHashMap.class, String.class, + TypeToken.getParameterized(Set.class, String.class, String.class).getType()) + .getType(); // retrieving transactions from database while (null != key && !key.isEmpty()) { String json = KeyValueRocksDBUtil.instance.getValue(dbName, key); @@ -93,14 +94,16 @@ public class EventRecorder { if (json.startsWith("cp")) { // create check point by the transaction and stop retrieving 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"); for (String k : id2Consumers.keySet()) { JsonObject consumer = id2Consumers.getAsJsonObject(k); if (!consumer.has("type")) { continue; } - ConsumerType type = ConsumerType.valueOf(consumer.get("type").getAsString()); + ConsumerType type = + ConsumerType.valueOf(consumer.get("type").getAsString()); switch (type) { case Contract: cp.id2Consumers.put(k, @@ -145,7 +148,8 @@ public class EventRecorder { // if empty, return the check point latestEvent.setCp(true); } 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()) { Object record = stack.pop(); if (record instanceof CheckPoint) { @@ -155,15 +159,19 @@ public class EventRecorder { IEventConsumer consumer = broker.parseConsumer(tran.content); switch (tran.type) { 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.debug("record damaged! " + key + ": " + JsonUtil.toJson(tran)); + LOGGER.debug( + "record damaged! " + key + ": " + JsonUtil.toJson(tran)); } break; 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.debug("record damaged! " + key + ": " + JsonUtil.toJson(tran)); + LOGGER.debug( + "record damaged! " + key + ": " + JsonUtil.toJson(tran)); } default: break; @@ -225,7 +233,7 @@ public class EventRecorder { } public CheckPoint(Map> topic2cIds, - Map id2Consumers) { + Map id2Consumers) { this.topic2cIds = topic2cIds; this.id2Consumers = id2Consumers; } diff --git a/src/main/java/org/bdware/sc/event/clients/ContractConsumer.java b/src/main/java/org/bdware/sc/event/clients/ContractConsumer.java index 9940350..f877e1d 100644 --- a/src/main/java/org/bdware/sc/event/clients/ContractConsumer.java +++ b/src/main/java/org/bdware/sc/event/clients/ContractConsumer.java @@ -81,7 +81,7 @@ public class ContractConsumer implements IEventConsumer { return; } AtomicInteger callCount = new AtomicInteger(0); - LOGGER.info("ContractConsumer!"+new Gson().toJson(cr)); + LOGGER.info("ContractConsumer!" + new Gson().toJson(cr)); // TODO sending requests at a high frequency maybe cause that some requests are ignored ScheduledFuture future = ContractManager.scheduledThreadPool.scheduleAtFixedRate( () -> ContractManager.instance.executeContractInternal(cr, new ResultCallback() { @@ -91,19 +91,20 @@ public class ContractConsumer implements IEventConsumer { try { ContractResult result = JsonUtil.fromJson(str, ContractResult.class); if (!result.status.equals(ContractResult.Status.Success)) { - if (callCount.get() == TIMEOUT_COUNT || - (result.status == ContractResult.Status.Exception && - result.result.toString().contains("not exported"))) { - LOGGER.error(String.format( - "receiving event error! %s.%s: %s", contract, handler, str)); + if (callCount.get() == TIMEOUT_COUNT + || (result.status == ContractResult.Status.Exception + && result.result.toString() + .contains("not exported"))) { + LOGGER.error(String.format("receiving event error! %s.%s: %s", + contract, handler, str)); rc.onResult((String) null); } else { ret = false; } } } catch (Exception e) { - LOGGER.error(String.format( - "receiving event error! %s.%s: %s", contract, handler, e.getMessage())); + LOGGER.error(String.format("receiving event error! %s.%s: %s", contract, + handler, e.getMessage())); rc.onResult((String) null); } callCount.incrementAndGet(); @@ -121,10 +122,7 @@ public class ContractConsumer implements IEventConsumer { } } }, (reqID, hashStr) -> { - }), - 500L, - 2500L, - TimeUnit.MILLISECONDS); + }), 500L, 2500L, TimeUnit.MILLISECONDS); scheduledFutures.put(getId(), future); synchronized (flag) { flag.notify(); diff --git a/src/main/java/org/bdware/sc/event/clients/IEventConsumer.java b/src/main/java/org/bdware/sc/event/clients/IEventConsumer.java index ac48fdf..3d92848 100644 --- a/src/main/java/org/bdware/sc/event/clients/IEventConsumer.java +++ b/src/main/java/org/bdware/sc/event/clients/IEventConsumer.java @@ -1,7 +1,6 @@ package org.bdware.sc.event.clients; import org.bdware.sc.conn.ResultCallback; -import org.bdware.sc.event.Event; public interface IEventConsumer { String getId(); @@ -13,8 +12,6 @@ public interface IEventConsumer { void competeSub(Object msg, ResultCallback rc, String... options); enum ConsumerType { - Contract, - Node, - WSClient + Contract, Node, WSClient } } diff --git a/src/main/java/org/bdware/sc/event/clients/NodeConsumer.java b/src/main/java/org/bdware/sc/event/clients/NodeConsumer.java index 0fdeabb..7196437 100644 --- a/src/main/java/org/bdware/sc/event/clients/NodeConsumer.java +++ b/src/main/java/org/bdware/sc/event/clients/NodeConsumer.java @@ -43,4 +43,4 @@ public class NodeConsumer implements IEventConsumer { public void competeSub(Object msg, ResultCallback rc, String... options) { publishEvent(msg, rc, options); } -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/event/clients/WSClientConsumer.java b/src/main/java/org/bdware/sc/event/clients/WSClientConsumer.java index ed7cede..646b62d 100644 --- a/src/main/java/org/bdware/sc/event/clients/WSClientConsumer.java +++ b/src/main/java/org/bdware/sc/event/clients/WSClientConsumer.java @@ -47,6 +47,5 @@ public class WSClientConsumer implements IEventConsumer { } @Override - public void competeSub(Object msg, ResultCallback rc, String... options) { - } + public void competeSub(Object msg, ResultCallback rc, String... options) {} } diff --git a/src/main/java/org/bdware/sc/handler/ManagerHandler.java b/src/main/java/org/bdware/sc/handler/ManagerHandler.java index 28bb005..109aea1 100644 --- a/src/main/java/org/bdware/sc/handler/ManagerHandler.java +++ b/src/main/java/org/bdware/sc/handler/ManagerHandler.java @@ -34,8 +34,7 @@ public class ManagerHandler extends MsgHandler { cb.onResult(cm.getTimesOfExecution(msg.arg)); } - @Description( - value = "execute Contract, {\"contractID\":\"112233\",\"arg\":\"\"}", + @Description(value = "execute Contract, {\"contractID\":\"112233\",\"arg\":\"\"}", isAsync = true) public void executeContract(GetMessage msg, ResultCallback cb) { ContractRequest c; diff --git a/src/main/java/org/bdware/sc/units/ContractRecord.java b/src/main/java/org/bdware/sc/units/ContractRecord.java index d9621e6..ef66308 100644 --- a/src/main/java/org/bdware/sc/units/ContractRecord.java +++ b/src/main/java/org/bdware/sc/units/ContractRecord.java @@ -4,81 +4,51 @@ package org.bdware.sc.units; import java.io.*; /* - * 节点启动后记录自己的units信息和合约的一些信息 - * 节点重新上线后,NC发要求让其恢复,则从本地读取自己的这些信息进行恢复 + * 节点启动后记录自己的units信息和合约的一些信息 节点重新上线后,NC发要求让其恢复,则从本地读取自己的这些信息进行恢复 */ public class ContractRecord implements Serializable { -/* private static final long serialVersionUID = 704775241674568688L; - - public transient RecoverFlag recoverFlag = RecoverFlag.Fine; - - public String contractID; - public String contractName; - public String key; - public String contractpubKey; - public ContractType type; - public int copies = 1; - public int lastExeSeq = -1; - public boolean isPrivate = false; - public String pubKeyPath; - public String ypkName; - - //public Map members; //k-udpid,v-udpaddress - - public String memory = ""; - - //JavaScriptEntry - public String invokeID; - - public ContractRecord(String id){ - this.contractID = id; - } - - public ContractRecord(String id,String contractName,String key,String contractpubKey,ContractType type,int copies){ - this.contractID = id; - this.contractName = contractName; - this.key = key; - this.contractpubKey = contractpubKey; - this.type = type; - this.copies = copies; - } - - public void printContent(){ - System.out.println("==========ContractRecord========"); - - System.out.println("contractID=" + contractID == null ? "null" : contractID); - System.out.println("contractName=" + contractName == null ? "null" : contractName); - System.out.println("key=" + key == null ? "null" : key); - System.out.println("contractPubKey=" + contractpubKey == null ? "null" : contractpubKey); - System.out.println("type=" + type == null ? "null" : type); - 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(); - } - }*/ + /* + * private static final long serialVersionUID = 704775241674568688L; + * + * public transient RecoverFlag recoverFlag = RecoverFlag.Fine; + * + * public String contractID; public String contractName; public String key; public String + * contractpubKey; public ContractType type; public int copies = 1; public int lastExeSeq = -1; + * public boolean isPrivate = false; public String pubKeyPath; public String ypkName; + * + * //public Map members; //k-udpid,v-udpaddress + * + * public String memory = ""; + * + * //JavaScriptEntry public String invokeID; + * + * public ContractRecord(String id){ this.contractID = id; } + * + * public ContractRecord(String id,String contractName,String key,String + * contractpubKey,ContractType type,int copies){ this.contractID = id; this.contractName = + * contractName; this.key = key; this.contractpubKey = contractpubKey; this.type = type; + * this.copies = copies; } + * + * public void printContent(){ System.out.println("==========ContractRecord========"); + * + * System.out.println("contractID=" + contractID == null ? "null" : contractID); + * System.out.println("contractName=" + contractName == null ? "null" : contractName); + * System.out.println("key=" + key == null ? "null" : key); System.out.println("contractPubKey=" + * + contractpubKey == null ? "null" : contractpubKey); System.out.println("type=" + type == + * null ? "null" : type); 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(); } } + */ } diff --git a/src/main/java/org/bdware/sc/units/ContractUnitController.java b/src/main/java/org/bdware/sc/units/ContractUnitController.java index d4d68e8..fcb3ffd 100644 --- a/src/main/java/org/bdware/sc/units/ContractUnitController.java +++ b/src/main/java/org/bdware/sc/units/ContractUnitController.java @@ -12,13 +12,11 @@ import java.util.*; public class ContractUnitController { private static final Logger LOGGER = LogManager.getLogger(ContractUnitController.class); private final TrustfulExecutorConnection connection; - private final Map units; //这个节点上<合约id,合约集群>,其中每个ContractUnit中存储了对应合约id的其他节点udp信息 + private final Map units; // 这个节点上<合约id,合约集群>,其中每个ContractUnit中存储了对应合约id的其他节点udp信息 ContractManager manager; SequencingAlgorithmFactory algorithmFactory; - public ContractUnitController( - TrustfulExecutorConnection connection, - ContractManager manager, + public ContractUnitController(TrustfulExecutorConnection connection, ContractManager manager, SequencingAlgorithmFactory factory) { this.connection = connection; this.manager = manager; @@ -39,18 +37,13 @@ public class ContractUnitController { unit.node2member = new HashMap<>(); units.put(req.contract.getID(), unit); - System.out.println( - "[ContractUnitController] startContract:" - + result - + " isMaster:" - + req.isMaster - + " cid:" - + req.contract.getID()); + System.out.println("[ContractUnitController] startContract:" + result + " isMaster:" + + req.isMaster + " cid:" + req.contract.getID()); break; case AddMember: LOGGER.debug("contractID:" + cumsg.getContractID()); unit = units.get(cumsg.getContractID()); - unit.addMember(node, cumsg); //启动通过在UDPTrustExecutor中遍历memebers,使得这个合约集群中每个节点都有其他节点的UDP信息,便于之后护发UDP消息 + unit.addMember(node, cumsg); // 启动通过在UDPTrustExecutor中遍历memebers,使得这个合约集群中每个节点都有其他节点的UDP信息,便于之后护发UDP消息 break; case Sequencing: unit = units.get(cumsg.getContractID()); @@ -59,7 +52,7 @@ public class ContractUnitController { break; case Unknown: default: - //recover start + // recover start ContractUnitStartRequest req2 = ContractUnitStartRequest.parse(cumsg.content); unit = new ContractUnit(); unit.connection = connection; @@ -68,12 +61,8 @@ public class ContractUnitController { unit.node2member = new HashMap<>(); units.put(req2.contract.getID(), unit); - System.out.println( - "[ContractUnitController] startContract:" - + " isMaster:" - + req2.isMaster - + " cid:" - + req2.contract.getID()); + System.out.println("[ContractUnitController] startContract:" + " isMaster:" + + req2.isMaster + " cid:" + req2.contract.getID()); break; } } @@ -84,7 +73,7 @@ public class ContractUnitController { public static class ContractUnit implements TrustfulExecutorConnection, Serializable { public String contractID; - public Map node2member; //存储和自己在一个合约集群的其他节点信息 + public Map node2member; // 存储和自己在一个合约集群的其他节点信息 private transient CommitAlgorithm commitAlgorithm; private transient TrustfulExecutorConnection connection; @@ -148,16 +137,9 @@ public class ContractUnitController { } public String getDisplayStr() { - return "pSize:" - + (prepare == null ? "null" : prepare.size()) - + " cSize:" - + (commit == null ? "null" : commit.size()) - + " isSendCommit:" - + isSendCommit - + " isSendReply:" - + isSendReply - + " buffSize:" - + buff.size(); + return "pSize:" + (prepare == null ? "null" : prepare.size()) + " cSize:" + + (commit == null ? "null" : commit.size()) + " isSendCommit:" + isSendCommit + + " isSendReply:" + isSendReply + " buffSize:" + buff.size(); } } } diff --git a/src/main/java/org/bdware/sc/units/ContractUnitMember.java b/src/main/java/org/bdware/sc/units/ContractUnitMember.java index 6e449af..d2de738 100644 --- a/src/main/java/org/bdware/sc/units/ContractUnitMember.java +++ b/src/main/java/org/bdware/sc/units/ContractUnitMember.java @@ -4,15 +4,15 @@ import org.bdware.sc.conn.Node; public class ContractUnitMember extends Node { - private static final long serialVersionUID = 8175664649689078937L; - public Node node; - public String pubKey; + private static final long serialVersionUID = 8175664649689078937L; + public Node node; + public String pubKey; - public ContractUnitMember(Node node) { - this.node = node; - } + public ContractUnitMember(Node node) { + this.node = node; + } - public Node getNode() { - return node; - } -} \ No newline at end of file + public Node getNode() { + return node; + } +} diff --git a/src/main/java/org/bdware/sc/units/ContractUnitMessage.java b/src/main/java/org/bdware/sc/units/ContractUnitMessage.java index 23da53d..93bddae 100644 --- a/src/main/java/org/bdware/sc/units/ContractUnitMessage.java +++ b/src/main/java/org/bdware/sc/units/ContractUnitMessage.java @@ -12,98 +12,99 @@ import org.zz.gmhelper.SM2Util; public class ContractUnitMessage implements Serializable { - private static final long serialVersionUID = 584934384202845750L; - ContractUnitType type; - private String contractID; - String requestID; - String signature; - byte[] content; + private static final long serialVersionUID = 584934384202845750L; + ContractUnitType type; + private String contractID; + String requestID; + String signature; + byte[] content; - public ContractUnitMessage(String requestID, String contractID, byte[] sender) { - this.requestID = requestID; - this.setContractID(contractID); - } + public ContractUnitMessage(String requestID, String contractID, byte[] sender) { + this.requestID = requestID; + this.setContractID(contractID); + } - public ContractUnitMessage() { - // TODO Auto-generated constructor stub - } + public ContractUnitMessage() { + // TODO Auto-generated constructor stub + } - public static ContractUnitMessage parse(byte[] b) { - try { - ByteArrayInputStream bi = new ByteArrayInputStream(b); - ObjectInputStream input = new ObjectInputStream(bi); - ContractUnitMessage ret = (ContractUnitMessage) input.readObject(); - return ret; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + public static ContractUnitMessage parse(byte[] b) { + try { + ByteArrayInputStream bi = new ByteArrayInputStream(b); + ObjectInputStream input = new ObjectInputStream(bi); + ContractUnitMessage ret = (ContractUnitMessage) input.readObject(); + return ret; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } - public byte[] toByteArray() { - try { - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - ObjectOutputStream output = new ObjectOutputStream(bo); - output.writeObject(this); - return bo.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + public byte[] toByteArray() { + try { + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + ObjectOutputStream output = new ObjectOutputStream(bo); + output.writeObject(this); + return bo.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } - private static String IDA = "PBFTMsg"; + private static String IDA = "PBFTMsg"; -// public void sign(NodeInfo info) { -// sender = info.getNodeID(); -// signature = sm02.sign(content, IDA, info.privKey).toString(); -// } + // public void sign(NodeInfo info) { + // sender = info.getNodeID(); + // signature = sm02.sign(content, IDA, info.privKey).toString(); + // } - public boolean verify(ContractUnitMember member) { - ECPublicKeyParameters param = BCECUtil.createECPublicKeyFromStrParameters(member.pubKey,SM2Util.CURVE,SM2Util.DOMAIN_PARAMS); + public boolean verify(ContractUnitMember member) { + 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()); + } - public void setType(ContractUnitType type) { - this.type = type; - } + public void setType(ContractUnitType type) { + this.type = type; + } - public ContractUnitType getType() { - return type; - } + public ContractUnitType getType() { + return type; + } - public byte[] getContent() { - return content; - } + public byte[] getContent() { + return content; + } - public void setContent(byte[] content) { - this.content = content; - } + public void setContent(byte[] content) { + this.content = content; + } - public String getContractID() { - return contractID; - } + public String getContractID() { + return contractID; + } - public String getRequestID() { - return requestID; - } + public String getRequestID() { + return requestID; + } - public String getDisplayStr() { - StringBuilder sb = new StringBuilder(); - sb.append(requestID); - sb.append("_TYPE_").append(type); - sb.append("_"); - sb.append(getContractID()); - sb.append("_"); - sb.append(" content:"); - sb.append(new String(content)); - return sb.toString(); - } + public String getDisplayStr() { + StringBuilder sb = new StringBuilder(); + sb.append(requestID); + sb.append("_TYPE_").append(type); + sb.append("_"); + sb.append(getContractID()); + sb.append("_"); + sb.append(" content:"); + sb.append(new String(content)); + return sb.toString(); + } - public void setContractID(String contractID) { - this.contractID = contractID; - } + public void setContractID(String contractID) { + this.contractID = contractID; + } } diff --git a/src/main/java/org/bdware/sc/units/ContractUnitStartRequest.java b/src/main/java/org/bdware/sc/units/ContractUnitStartRequest.java index 08582b5..57bc8a4 100644 --- a/src/main/java/org/bdware/sc/units/ContractUnitStartRequest.java +++ b/src/main/java/org/bdware/sc/units/ContractUnitStartRequest.java @@ -10,37 +10,37 @@ import org.bdware.sc.bean.Contract; import org.bdware.sc.conn.Node; public class ContractUnitStartRequest implements Serializable { - /** - * - */ - private static final long serialVersionUID = -1540780483790689627L; - public Contract contract; - public boolean isMaster; - public Node[] members; - - public static ContractUnitStartRequest parse(byte[] content) { - try { - ByteArrayInputStream input = new ByteArrayInputStream(content); - ObjectInputStream objInput; - objInput = new ObjectInputStream(input); - return (ContractUnitStartRequest) objInput.readObject(); + /** + * + */ + private static final long serialVersionUID = -1540780483790689627L; + public Contract contract; + public boolean isMaster; + public Node[] members; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + public static ContractUnitStartRequest parse(byte[] content) { + try { + ByteArrayInputStream input = new ByteArrayInputStream(content); + ObjectInputStream objInput; + objInput = new ObjectInputStream(input); + return (ContractUnitStartRequest) objInput.readObject(); - public byte[] toByteArray() { - try { - ByteArrayOutputStream bo = new ByteArrayOutputStream(); - ObjectOutputStream objOutput = new ObjectOutputStream(bo); - objOutput.writeObject(this); - return bo.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public byte[] toByteArray() { + try { + ByteArrayOutputStream bo = new ByteArrayOutputStream(); + ObjectOutputStream objOutput = new ObjectOutputStream(bo); + objOutput.writeObject(this); + return bo.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/org/bdware/sc/units/ContractUnitType.java b/src/main/java/org/bdware/sc/units/ContractUnitType.java index 019ad00..c52b764 100644 --- a/src/main/java/org/bdware/sc/units/ContractUnitType.java +++ b/src/main/java/org/bdware/sc/units/ContractUnitType.java @@ -4,27 +4,28 @@ import java.io.Serializable; public enum ContractUnitType implements Serializable { - Start(0), AddMember(1), Sequencing(2), Unknown(3); - private int type; + Start(0), AddMember(1), Sequencing(2), Unknown(3); - private ContractUnitType(int i) { - type = i; - } + private int type; - public static ContractUnitType fromByte(int i) { - switch (i) { - case 0: - return Start; - case 1: - return AddMember; - case 2: - return Sequencing; - default: - return Unknown; - } - } + private ContractUnitType(int i) { + type = i; + } - public int toInt() { - return type; - } + public static ContractUnitType fromByte(int i) { + switch (i) { + case 0: + return Start; + case 1: + return AddMember; + case 2: + return Sequencing; + default: + return Unknown; + } + } + + public int toInt() { + return type; + } } diff --git a/src/main/java/org/bdware/sc/units/MultiContractMeta.java b/src/main/java/org/bdware/sc/units/MultiContractMeta.java index 06d5401..4405950 100644 --- a/src/main/java/org/bdware/sc/units/MultiContractMeta.java +++ b/src/main/java/org/bdware/sc/units/MultiContractMeta.java @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger; public class MultiContractMeta implements IDSerializable { private static final Logger LOGGER = LogManager.getLogger(MultiContractMeta.class); private final AtomicInteger lastExeSeq; // last executed request seq - public volatile int curExeSeq = -1; // 当前正在执行请求序号 for multipoint contract requests + public volatile int curExeSeq = -1; // 当前正在执行请求序号 for multipoint contract requests public String memory; public String key; // privateKey public String publicKey; @@ -101,10 +101,9 @@ public class MultiContractMeta implements IDSerializable { public void setLastExeSeq(int lastExeSeq) { this.lastExeSeq.set(lastExeSeq); - if (KeyValueDBUtil.instance.containsKey( - CMTables.LastExeSeq.toString(), contractID)) { // 如果现在是Stable模式就同步刷到磁盘 - KeyValueDBUtil.instance.setValue( - CMTables.LastExeSeq.toString(), contractID, String.valueOf(lastExeSeq)); + if (KeyValueDBUtil.instance.containsKey(CMTables.LastExeSeq.toString(), contractID)) { // 如果现在是Stable模式就同步刷到磁盘 + KeyValueDBUtil.instance.setValue(CMTables.LastExeSeq.toString(), contractID, + String.valueOf(lastExeSeq)); } } @@ -154,16 +153,19 @@ public class MultiContractMeta implements IDSerializable { public String[] getMembers() { return members; } - public String joinMembers(String delimiter){ + + public String joinMembers(String delimiter) { StringBuilder sb = new StringBuilder(); if (members.length > 0) sb.append(members[0]); - else return ""; + else + return ""; for (int i = 1; i < members.length; i++) { sb.append(delimiter).append(members[i]); } return sb.toString(); } + public void setMembers(JsonArray members) { String[] copied = new String[members.size()]; for (int i = 0; i < members.size(); i++) { diff --git a/src/main/java/org/bdware/sc/units/PubKeyNode.java b/src/main/java/org/bdware/sc/units/PubKeyNode.java index 471f0c8..b16d9a0 100644 --- a/src/main/java/org/bdware/sc/units/PubKeyNode.java +++ b/src/main/java/org/bdware/sc/units/PubKeyNode.java @@ -3,5 +3,5 @@ package org.bdware.sc.units; import org.bdware.sc.conn.Node; public class PubKeyNode extends Node { - public String pubkey; + public String pubkey; } diff --git a/src/main/java/org/bdware/sc/units/RecoverFlag.java b/src/main/java/org/bdware/sc/units/RecoverFlag.java index 53ae11b..3ea4095 100644 --- a/src/main/java/org/bdware/sc/units/RecoverFlag.java +++ b/src/main/java/org/bdware/sc/units/RecoverFlag.java @@ -1,5 +1,5 @@ package org.bdware.sc.units; public enum RecoverFlag { - Fine,ToRecover,Recovering; + Fine, ToRecover, Recovering; } diff --git a/src/main/java/org/bdware/sc/units/RespCache.java b/src/main/java/org/bdware/sc/units/RespCache.java index 5c5acad..8b68394 100644 --- a/src/main/java/org/bdware/sc/units/RespCache.java +++ b/src/main/java/org/bdware/sc/units/RespCache.java @@ -24,7 +24,8 @@ public class RespCache { } else { waiter.wait(5000L); timeout &= waiter.get() * 2 > count; - if (!timeout) waiter.notifyAll(); + if (!timeout) + waiter.notifyAll(); return timeout; } } diff --git a/src/main/java/org/bdware/sc/units/SequencingAlgorithmFactory.java b/src/main/java/org/bdware/sc/units/SequencingAlgorithmFactory.java index c88b9aa..996df24 100644 --- a/src/main/java/org/bdware/sc/units/SequencingAlgorithmFactory.java +++ b/src/main/java/org/bdware/sc/units/SequencingAlgorithmFactory.java @@ -4,5 +4,5 @@ import org.bdware.sc.consistency.CommitAlgorithm; import org.bdware.sc.units.ContractUnitController.ContractUnit; public interface SequencingAlgorithmFactory { - public CommitAlgorithm create(ContractUnitStartRequest req, ContractUnit unit); + public CommitAlgorithm create(ContractUnitStartRequest req, ContractUnit unit); } diff --git a/src/main/java/org/bdware/sc/units/TrustfulExecutorConnection.java b/src/main/java/org/bdware/sc/units/TrustfulExecutorConnection.java index 13660fa..8090efa 100644 --- a/src/main/java/org/bdware/sc/units/TrustfulExecutorConnection.java +++ b/src/main/java/org/bdware/sc/units/TrustfulExecutorConnection.java @@ -13,4 +13,4 @@ public interface TrustfulExecutorConnection { } List getNodes(); -} \ No newline at end of file +} diff --git a/src/main/java/org/bdware/sc/util/DHTUtil.java b/src/main/java/org/bdware/sc/util/DHTUtil.java index 8b68cbd..3279fcb 100644 --- a/src/main/java/org/bdware/sc/util/DHTUtil.java +++ b/src/main/java/org/bdware/sc/util/DHTUtil.java @@ -25,9 +25,8 @@ public class DHTUtil { String hash = HashUtil.sha3ToFixedLen(key, nodes[0].length() - 2); - int l = 0, r = nodes.length - 1, m, - h2l = hash.compareTo(nodes[l].substring(2)), r2h = nodes[r].substring(2).compareTo(hash), - h2m; + int l = 0, r = nodes.length - 1, m, h2l = hash.compareTo(nodes[l].substring(2)), + r2h = nodes[r].substring(2).compareTo(hash), h2m; BigInteger bigH = null; String selected; do { @@ -42,8 +41,7 @@ public class DHTUtil { break; } if (l + 1 == r) { - BigInteger bigL = getBigInteger(nodes[l]), - bigR = getBigInteger(nodes[r]); + BigInteger bigL = getBigInteger(nodes[l]), bigR = getBigInteger(nodes[r]); bigH = new BigInteger(hash, 16); if (bigR.subtract(bigH).compareTo(bigH.subtract(bigL)) > -1) { selected = nodes[l]; @@ -65,7 +63,7 @@ public class DHTUtil { } } while (true); if (k == 1) { - return new String[]{selected}; + return new String[] {selected}; } List ret = new ArrayList<>(); ret.add(selected); diff --git a/src/main/java/org/bdware/server/trustedmodel/ContractExecutor.java b/src/main/java/org/bdware/server/trustedmodel/ContractExecutor.java index a2f969e..a8d362a 100644 --- a/src/main/java/org/bdware/server/trustedmodel/ContractExecutor.java +++ b/src/main/java/org/bdware/server/trustedmodel/ContractExecutor.java @@ -10,15 +10,11 @@ import java.util.Map; public interface ContractExecutor { void execute(String requestID, ContractRequest req, ResultCallback rcb, OnHashCallback hcb); - default void onRecover(Map args) { - } + default void onRecover(Map 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) {} } diff --git a/src/main/java/org/bdware/server/trustedmodel/ContractUnitStatus.java b/src/main/java/org/bdware/server/trustedmodel/ContractUnitStatus.java index 26d5aa2..aaa1fa6 100644 --- a/src/main/java/org/bdware/server/trustedmodel/ContractUnitStatus.java +++ b/src/main/java/org/bdware/server/trustedmodel/ContractUnitStatus.java @@ -3,6 +3,5 @@ package org.bdware.server.trustedmodel; import java.io.Serializable; public enum ContractUnitStatus implements Serializable { - CommonMode, - StableMode; + CommonMode, StableMode; } diff --git a/src/main/java/org/bdware/server/trustedmodel/MultiReqSeq.java b/src/main/java/org/bdware/server/trustedmodel/MultiReqSeq.java index 9a08e59..bbb2ca8 100644 --- a/src/main/java/org/bdware/server/trustedmodel/MultiReqSeq.java +++ b/src/main/java/org/bdware/server/trustedmodel/MultiReqSeq.java @@ -4,7 +4,7 @@ public class MultiReqSeq { public final int seq; public final long startTime; - public MultiReqSeq(int s){ + public MultiReqSeq(int s) { seq = s; startTime = System.currentTimeMillis(); } diff --git a/src/main/java/org/bdware/server/trustedmodel/SingleNodeExecutor.java b/src/main/java/org/bdware/server/trustedmodel/SingleNodeExecutor.java index 1cf0096..c90744d 100644 --- a/src/main/java/org/bdware/server/trustedmodel/SingleNodeExecutor.java +++ b/src/main/java/org/bdware/server/trustedmodel/SingleNodeExecutor.java @@ -14,7 +14,8 @@ public class SingleNodeExecutor implements ContractExecutor { } @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); } -} \ No newline at end of file +} diff --git a/src/test/java/org/bdware/sc/test/ContractManagerTest.java b/src/test/java/org/bdware/sc/test/ContractManagerTest.java index 0ec9ce6..836c30a 100644 --- a/src/test/java/org/bdware/sc/test/ContractManagerTest.java +++ b/src/test/java/org/bdware/sc/test/ContractManagerTest.java @@ -1,11 +1,7 @@ package org.bdware.sc.test; 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 static void main(String[] args) { diff --git a/src/test/java/org/bdware/sc/test/ReflectionTest.java b/src/test/java/org/bdware/sc/test/ReflectionTest.java index 923fadc..da186f7 100644 --- a/src/test/java/org/bdware/sc/test/ReflectionTest.java +++ b/src/test/java/org/bdware/sc/test/ReflectionTest.java @@ -13,8 +13,8 @@ public class ReflectionTest { @org.junit.Test public void go() throws Exception { - Method m = Test.class.getDeclaredMethod("go",String[].class); - String[] abc = new String[]{"ab", "cd"}; - m.invoke(null, new Object[]{abc}); + Method m = Test.class.getDeclaredMethod("go", String[].class); + String[] abc = new String[] {"ab", "cd"}; + m.invoke(null, new Object[] {abc}); } } diff --git a/src/test/java/org/bdware/sc/units/RespCacheTest.java b/src/test/java/org/bdware/sc/units/RespCacheTest.java index 4e2efc1..c66f7ef 100644 --- a/src/test/java/org/bdware/sc/units/RespCacheTest.java +++ b/src/test/java/org/bdware/sc/units/RespCacheTest.java @@ -12,17 +12,15 @@ public class RespCacheTest { new Thread(() -> { try { Thread.sleep(j * 1000); - if (j > 2) Thread.sleep(6 * 1000); + if (j > 2) + Thread.sleep(6 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } boolean waitResult = cache.waitForHalf(); - System.out.println( - "tid:" - + Thread.currentThread().getId() - + " reach target, waitResult:" - + waitResult); + System.out.println("tid:" + Thread.currentThread().getId() + + " reach target, waitResult:" + waitResult); }).start(); } Thread.sleep(20000); @@ -37,17 +35,15 @@ public class RespCacheTest { new Thread(() -> { try { Thread.sleep(j * 1000); - if (j > 2) Thread.sleep(1900); + if (j > 2) + Thread.sleep(1900); } catch (InterruptedException e) { e.printStackTrace(); } boolean waitResult = cache.waitForHalf(); - System.out.println( - "tid:" - + Thread.currentThread().getId() - + " reach target, waitResult:" - + waitResult); + System.out.println("tid:" + Thread.currentThread().getId() + + " reach target, waitResult:" + waitResult); }).start(); } Thread.sleep(20000); @@ -66,11 +62,8 @@ public class RespCacheTest { e.printStackTrace(); } boolean waitResult = cache.waitForHalf(); - System.out.println( - "tid:" - + Thread.currentThread().getId() - + " reach target, waitResult:" - + waitResult); + System.out.println("tid:" + Thread.currentThread().getId() + + " reach target, waitResult:" + waitResult); }).start(); } Thread.sleep(10000);