github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/test/tools/PTE/pte-execRequest.js (about) 1 /** 2 * Copyright 2016 IBM All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * usage: 19 * node pte-execRequest.js pid Nid uiFile tStart 20 * - action: deploy, invoke, query 21 * - recurrence: integer number 22 */ 23 // This is an end-to-end test that focuses on exercising all parts of the fabric APIs 24 // in a happy-path scenario 25 'use strict'; 26 27 var log4js = require('log4js'); 28 var logger = log4js.getLogger('E2E'); 29 logger.setLevel('ERROR'); 30 31 var path = require('path'); 32 33 var hfc = require('fabric-client'); 34 hfc.setLogger(logger); 35 36 var fs = require('fs'); 37 var grpc = require('grpc'); 38 var util = require('util'); 39 var testUtil = require('./pte-util.js'); 40 var utils = require('fabric-client/lib/utils.js'); 41 var Peer = require('fabric-client/lib/Peer.js'); 42 var Orderer = require('fabric-client/lib/Orderer.js'); 43 var EventHub = require('fabric-client/lib/EventHub.js'); 44 var FabricCAServices = require('fabric-ca-client/lib/FabricCAClientImpl'); 45 var FabricCAClient = FabricCAServices.FabricCAClient; 46 var User = require('fabric-client/lib/User.js'); 47 var Client = require('fabric-client/lib/Client.js'); 48 var _commonProto = grpc.load(path.join(__dirname, 'node_modules/fabric-client/lib/protos/common/common.proto')).common; 49 50 const crypto = require('crypto'); 51 52 utils.setConfigSetting('crypto-keysize', 256); 53 54 55 // local vars 56 var tmp; 57 var tCurr; 58 var tEnd; 59 var tLocal; 60 var i = 0; 61 var inv_m = 0; // counter of invoke move 62 var inv_q = 0; // counter of invoke query 63 var evtTimeout = 0; // counter of event timeout 64 var IDone=0; 65 var QDone=0; 66 var recHist; 67 var buff; 68 var ofile; 69 var invokeCheck; 70 var chaincode_id; 71 var chaincode_ver; 72 var chain_id; 73 var tx_id = null; 74 var nonce = null; 75 var the_user = null; 76 var eventHubs=[]; 77 var targets = []; 78 var eventPromises = []; 79 80 //testUtil.setupChaincodeDeploy(); 81 82 // need to override the default key size 384 to match the member service backend 83 // otherwise the client will not be able to decrypt the enrollment challenge 84 utils.setConfigSetting('crypto-keysize', 256); 85 86 // need to override the default hash algorithm (SHA3) to SHA2 (aka SHA256 when combined 87 // with the key size 256 above), in order to match what the peer and COP use 88 utils.setConfigSetting('crypto-hash-algo', 'SHA2'); 89 90 //input args 91 var pid = parseInt(process.argv[2]); 92 var Nid = parseInt(process.argv[3]); 93 var uiFile = process.argv[4]; 94 var tStart = parseInt(process.argv[5]); 95 var org=process.argv[6]; 96 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] input parameters: uiFile=%s, tStart=%d', Nid, pid, channelName, org, uiFile, tStart); 97 var uiContent = JSON.parse(fs.readFileSync(uiFile)); 98 var TLS=uiContent.TLS; 99 var channelOpt=uiContent.channelOpt; 100 var channelOrgName = []; 101 var channelName = channelOpt.name; 102 for (i=0; i<channelOpt.orgName.length; i++) { 103 channelOrgName.push(channelOpt.orgName[i]); 104 } 105 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] TLS: %s', Nid, pid, channelName, org, TLS.toUpperCase()); 106 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] channelOrgName.length: %d, channelOrgName: %s', Nid, pid, channelName, org, channelOrgName.length, channelOrgName); 107 108 var client = new hfc(); 109 var chain = client.newChain(channelName); 110 111 invokeCheck = uiContent.invokeCheck; 112 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] invokeCheck: ', Nid, pid, channelName, org, invokeCheck); 113 114 var channelID = uiContent.channelID; 115 chaincode_id = uiContent.chaincodeID+channelID; 116 chaincode_ver = uiContent.chaincodeVer; 117 chain_id = uiContent.chainID+channelID; 118 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] chaincode_id: %s, chain_id: %s', Nid, pid, channelName, org, chaincode_id, chain_id); 119 120 //set log level 121 var logLevel; 122 if (typeof( uiContent.logLevel ) == 'undefined') { 123 logLevel='ERROR'; 124 } else { 125 logLevel=uiContent.logLevel; 126 } 127 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] logLevel: %s', Nid, pid, channelName, org, logLevel); 128 logger.setLevel(logLevel); 129 130 var svcFile = uiContent.SCFile[0].ServiceCredentials; 131 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] svcFile: %s, org: %s', Nid, pid, channelName, org, svcFile, org); 132 hfc.addConfigFile(path.join(__dirname, svcFile)); 133 var ORGS = hfc.getConfigSetting('test-network'); 134 var orgName = ORGS[org].orgName; 135 136 var users = hfc.getConfigSetting('users'); 137 138 //user parameters 139 var transMode = uiContent.transMode; 140 var transType = uiContent.transType; 141 var invokeType = uiContent.invokeType; 142 var nRequest = parseInt(uiContent.nRequest); 143 var nProc = parseInt(uiContent.nProc); 144 var nOrg = parseInt(uiContent.nOrg); 145 var nPeerPerOrg = parseInt(uiContent.nPeerPerOrg); 146 var nPeer = nOrg * nPeerPerOrg; 147 148 var nOrderer = parseInt(uiContent.nOrderer); 149 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] nOrderer: %d, nPeer: %d, transMode: %s, transType: %s, invokeType: %s, nRequest: %d', Nid, pid, channelName, org, nOrderer, nPeer, transMode, transType, invokeType, nRequest); 150 151 var runDur=0; 152 if ( nRequest == 0 ) { 153 runDur = parseInt(uiContent.runDur); 154 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] nOrderer: %d, nPeer: %d, transMode: %s, transType: %s, invokeType: %s, runDur: %d', Nid, pid, channelName, org, nOrderer, nPeer, transMode, transType, invokeType, runDur); 155 // convert runDur from second to ms 156 runDur = 1000*runDur; 157 } 158 159 160 var ccType = uiContent.ccType; 161 var keyStart=0; 162 var payLoadMin=0; 163 var payLoadMax=0; 164 var arg0=0; 165 166 if ( ccType == 'ccchecker') { 167 keyStart = parseInt(uiContent.ccOpt.keyStart); 168 payLoadMin = parseInt(uiContent.ccOpt.payLoadMin)/2; 169 payLoadMax = parseInt(uiContent.ccOpt.payLoadMax)/2; 170 arg0 = keyStart; 171 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] ccchecker chaincode setting: keyStart=%d payLoadMin=%d payLoadMax=%d', 172 Nid, pid, channelName, org, keyStart, parseInt(uiContent.ccOpt.payLoadMin), parseInt(uiContent.ccOpt.payLoadMax)); 173 } 174 console.log('[Nid:id:chan:org=%d:%d:%s:%s pte-execRequest] ccType: %s, keyStart: %d', Nid, pid, channelName, org, ccType, keyStart); 175 //construct invoke request 176 var testInvokeArgs = []; 177 for (i=0; i<uiContent.invoke.move.args.length; i++) { 178 testInvokeArgs.push(uiContent.invoke.move.args[i]); 179 } 180 181 var request_invoke; 182 function getMoveRequest() { 183 if ( ccType == 'ccchecker') { 184 arg0 ++; 185 testInvokeArgs[1] = 'key_'+channelName+'_'+org+'_'+Nid+'_'+pid+'_'+arg0; 186 // random payload 187 var r = Math.floor(Math.random() * (payLoadMax - payLoadMin)) + payLoadMin; 188 189 var buf = crypto.randomBytes(r); 190 testInvokeArgs[2] = buf.toString('hex'); 191 } 192 //console.log('d:id:chan:org=%d:%d:%s:%s getMoveRequest] testInvokeArgs[1]', Nid, pid, channelName, org, testInvokeArgs[1]); 193 194 nonce = utils.getNonce(); 195 tx_id = hfc.buildTransactionID(nonce, the_user); 196 utils.setConfigSetting('E2E_TX_ID', tx_id); 197 logger.info('setConfigSetting("E2E_TX_ID") = %s', tx_id); 198 199 request_invoke = { 200 chaincodeId : chaincode_id, 201 chaincodeVersion : chaincode_ver, 202 chainId: channelName, 203 fcn: uiContent.invoke.move.fcn, 204 args: testInvokeArgs, 205 txId: tx_id, 206 nonce: nonce 207 }; 208 209 210 if ( inv_m == nRequest ) { 211 if (invokeCheck.toUpperCase() == 'TRUE') { 212 console.log('request_invoke: ', request_invoke); 213 } 214 } 215 216 } 217 218 //construct query request 219 var testQueryArgs = []; 220 for (i=0; i<uiContent.invoke.query.args.length; i++) { 221 testQueryArgs.push(uiContent.invoke.query.args[i]); 222 } 223 224 var request_query; 225 function getQueryRequest() { 226 if ( ccType == 'ccchecker') { 227 arg0 ++; 228 testQueryArgs[1] = 'key_'+channelName+'_'+org+'_'+Nid+'_'+pid+'_'+arg0; 229 } 230 //console.log('d:id:chan:org=%d:%d:%s:%s getQueryRequest] testQueryArgs[1]', Nid, pid, channelName, org, testQueryArgs[1]); 231 232 nonce = utils.getNonce(); 233 tx_id = hfc.buildTransactionID(nonce, the_user); 234 request_query = { 235 chaincodeId : chaincode_id, 236 chaincodeVersion : chaincode_ver, 237 chainId: channelName, 238 txId: tx_id, 239 nonce: nonce, 240 fcn: uiContent.invoke.query.fcn, 241 args: testQueryArgs 242 }; 243 244 //console.log('request_query: ', request_query); 245 } 246 247 248 function assignThreadPeer(chain, client) { 249 console.log('[Nid:id:chan=%d:%d:%s assignThreadPeer] chain name: %s', Nid, pid, channelName, chain.getName()); 250 var peerIdx=0; 251 var peerTmp; 252 var eh; 253 for (let key1 in ORGS) { 254 if (ORGS.hasOwnProperty(key1)) { 255 for (let key in ORGS[key1]) { 256 if (key.indexOf('peer1') === 0) { 257 if (peerIdx == pid % nPeer) { 258 if (TLS.toUpperCase() == 'ENABLED') { 259 let data = fs.readFileSync(ORGS[key1][key]['tls_cacerts']); 260 peerTmp = client.newPeer( 261 ORGS[key1][key].requests, 262 { 263 pem: Buffer.from(data).toString(), 264 'ssl-target-name-override': ORGS[key1][key]['server-hostname'] 265 } 266 ); 267 targets.push(peerTmp); 268 chain.addPeer(peerTmp); 269 } else { 270 peerTmp = client.newPeer( ORGS[key1][key].requests); 271 targets.push(peerTmp); 272 chain.addPeer(peerTmp); 273 } 274 275 eh=new EventHub(client); 276 if (TLS.toUpperCase() == 'ENABLED') { 277 eh.setPeerAddr( 278 ORGS[key1][key].events, 279 { 280 pem: Buffer.from(data).toString(), 281 'ssl-target-name-override': ORGS[key1][key]['server-hostname'] 282 } 283 ); 284 } else { 285 eh.setPeerAddr(ORGS[key1][key].events); 286 } 287 eh.connect(); 288 eventHubs.push(eh); 289 console.log('[Nid:id:chan=%d:%d:%s assignThreadPeer] requests: %s, events: %s ', Nid, pid, channelName, ORGS[key1][key].requests, ORGS[key1][key].events); 290 } 291 peerIdx++; 292 } 293 } 294 } 295 } 296 //console.log('[Nid:id:chan=%d:%d:%s assignThreadPeer] add peer: ', Nid, pid, channelName, chain.getPeers()); 297 } 298 299 function assignThreadOrgPeer(chain, client, org) { 300 console.log('[Nid:id:chan:org=%d:%d:%s:%s assignThreadOrgPeer] chain name: %s', Nid, pid, channelName, org, chain.getName()); 301 var peerIdx=0; 302 var peerTmp; 303 var eh; 304 for (let key in ORGS[org]) { 305 if (ORGS[org].hasOwnProperty(key)) { 306 if (key.indexOf('peer') === 0) { 307 if (peerIdx == pid % nPeerPerOrg) { 308 if (TLS.toUpperCase() == 'ENABLED') { 309 let data = fs.readFileSync(ORGS[org][key]['tls_cacerts']); 310 peerTmp = client.newPeer( 311 ORGS[org][key].requests, 312 { 313 pem: Buffer.from(data).toString(), 314 'ssl-target-name-override': ORGS[org][key]['server-hostname'] 315 } 316 ); 317 targets.push(peerTmp); 318 chain.addPeer(peerTmp); 319 } else { 320 peerTmp = client.newPeer( ORGS[org][key].requests); 321 //targets.push(peerTmp); 322 chain.addPeer(peerTmp); 323 } 324 325 eh=new EventHub(client); 326 if (TLS.toUpperCase() == 'ENABLED') { 327 eh.setPeerAddr( 328 ORGS[org][key].events, 329 { 330 pem: Buffer.from(data).toString(), 331 'ssl-target-name-override': ORGS[org][key]['server-hostname'] 332 } 333 ); 334 } else { 335 eh.setPeerAddr(ORGS[org][key].events); 336 } 337 eh.connect(); 338 eventHubs.push(eh); 339 } 340 peerIdx++; 341 } 342 } 343 } 344 //console.log('[Nid:id:chan:org=%d:%d:%s:%s assignThreadOrgPeer] add peer: ', Nid, pid, channelName, org, chain.getPeers()); 345 } 346 347 348 function channelAddPeer(chain, client, org) { 349 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeer] chain name: ', Nid, pid, channelName, org, chain.getName()); 350 var peerTmp; 351 var eh; 352 for (let key in ORGS[org]) { 353 if (ORGS[org].hasOwnProperty(key)) { 354 if (key.indexOf('peer') === 0) { 355 if (TLS.toUpperCase() == 'ENABLED') { 356 let data = fs.readFileSync(ORGS[org][key]['tls_cacerts']); 357 peerTmp = client.newPeer( 358 ORGS[org][key].requests, 359 { 360 pem: Buffer.from(data).toString(), 361 'ssl-target-name-override': ORGS[org][key]['server-hostname'] 362 } 363 ); 364 targets.push(peerTmp); 365 chain.addPeer(peerTmp); 366 } else { 367 peerTmp = client.newPeer( ORGS[org][key].requests); 368 targets.push(peerTmp); 369 chain.addPeer(peerTmp); 370 } 371 } 372 } 373 } 374 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeer] add peer: ', Nid, pid, channelName, org, chain.getPeers()); 375 } 376 377 378 function channelAddPeerEvent(chain, client, org) { 379 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] chain name: ', Nid, pid, channelName, org, chain.getName()); 380 var eh; 381 var peerTmp; 382 for (let key in ORGS[org]) { 383 console.log('key: ', key); 384 if (ORGS[org].hasOwnProperty(key)) { 385 if (key.indexOf('peer') === 0) { 386 if (TLS.toUpperCase() == 'ENABLED') { 387 let data = fs.readFileSync(ORGS[org][key]['tls_cacerts']); 388 peerTmp = client.newPeer( 389 ORGS[org][key].requests, 390 { 391 pem: Buffer.from(data).toString(), 392 'ssl-target-name-override': ORGS[key]['server-hostname'] 393 } 394 ); 395 } else { 396 peerTmp = client.newPeer( ORGS[org][key].requests); 397 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] peer: ', Nid, pid, channelName, org, ORGS[org][key].requests); 398 } 399 targets.push(peerTmp); 400 chain.addPeer(peerTmp); 401 402 eh=new EventHub(client); 403 if (TLS.toUpperCase() == 'ENABLED') { 404 eh.setPeerAddr( 405 ORGS[org][key].events, 406 { 407 pem: Buffer.from(data).toString(), 408 'ssl-target-name-override': ORGS[org][key]['server-hostname'] 409 } 410 ); 411 } else { 412 eh.setPeerAddr(ORGS[org][key].events); 413 } 414 eh.connect(); 415 eventHubs.push(eh); 416 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] requests: %s, events: %s ', Nid, pid, channelName, org, ORGS[org][key].requests, ORGS[org][key].events); 417 } 418 } 419 //console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] add peer: ', Nid, pid, channelName, org, chain.getPeers()); 420 //console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddPeerEvent] event: ', Nid, pid, channelName, org, eventHubs); 421 } 422 } 423 424 function channelAddOrderer(chain, client, org) { 425 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddOrderer] chain name: ', Nid, pid, channelName, org, chain.getName()); 426 if (TLS.toUpperCase() == 'ENABLED') { 427 var caRootsPath = ORGS.orderer.tls_cacerts; 428 let data = fs.readFileSync(caRootsPath); 429 let caroots = Buffer.from(data).toString(); 430 431 chain.addOrderer( 432 new Orderer( 433 ORGS.orderer.url, 434 { 435 'pem': caroots, 436 'ssl-target-name-override': ORGS.orderer['server-hostname'] 437 } 438 ) 439 ); 440 } else { 441 chain.addOrderer( new Orderer(ORGS.orderer.url)); 442 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddOrderer] orderer url: ', Nid, pid, channelName, org, ORGS.orderer.url); 443 } 444 //console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddOrderer] orderer in the chain: ', Nid, pid, channelName, org, chain.getOrderers()); 445 } 446 447 function channelAddAnchorPeer(chain, client, org) { 448 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddAnchorPeer] chain name: %s', Nid, pid, channelName, org, chain.getName()); 449 var peerTmp; 450 var eh; 451 var data; 452 for (let key in ORGS) { 453 if (ORGS.hasOwnProperty(key) && typeof ORGS[key].peer1 !== 'undefined') { 454 if ( key == org ) { 455 if (TLS.toUpperCase() == 'ENABLED') { 456 data = fs.readFileSync(ORGS[key].peer1['tls_cacerts']); 457 peerTmp = client.newPeer( 458 ORGS[key].peer1.requests, 459 { 460 pem: Buffer.from(data).toString(), 461 'ssl-target-name-override': ORGS[key].peer1['server-hostname'] 462 } 463 ); 464 targets.push(peerTmp); 465 chain.addPeer(peerTmp); 466 } else { 467 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddAnchorPeer] key: %s, peer1: %s', Nid, pid, channelName, org, key, ORGS[org].peer1.requests); 468 peerTmp = client.newPeer( ORGS[key].peer1.requests); 469 targets.push(peerTmp); 470 chain.addPeer(peerTmp); 471 } 472 } 473 474 if ( (invokeType.toUpperCase() == 'MOVE') && ( key == org ) ) { 475 eh=new EventHub(client); 476 if (TLS.toUpperCase() == 'ENABLED') { 477 eh.setPeerAddr( 478 ORGS[key].peer1.events, 479 { 480 pem: Buffer.from(data).toString(), 481 'ssl-target-name-override': ORGS[key].peer1['server-hostname'] 482 } 483 ); 484 } else { 485 eh.setPeerAddr(ORGS[key].peer1.events); 486 } 487 eh.connect(); 488 eventHubs.push(eh); 489 console.log('[Nid:id:chan:org=%d:%d:%s:%s channelAddAnchorPeer] requests: %s, events: %s ', Nid, pid, channelName, org, ORGS[key].peer1.requests, ORGS[key].peer1.events); 490 } 491 } 492 } 493 console.log('[[Nid:id=%d:%d] channelAddAnchorPeer] get peer: ', Nid, pid, chain.getPeers()); 494 //console.log('[[Nid:id=%d:%d] channelAddAnchorPeer] event: ', Nid, pid, eventHubs); 495 } 496 497 /* 498 * transactions begin .... 499 */ 500 execTransMode(); 501 502 function execTransMode() { 503 504 // init vars 505 inv_m = 0; 506 inv_q = 0; 507 508 //var caRootsPath = ORGS.orderer.tls_cacerts; 509 //let data = fs.readFileSync(caRootsPath); 510 //let caroots = Buffer.from(data).toString(); 511 var username = ORGS[org].username; 512 var secret = ORGS[org].secret; 513 console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] user= %s, secret=%s', Nid, pid, channelName, org, username, secret); 514 515 516 517 //enroll user 518 hfc.newDefaultKeyValueStore({ 519 path: testUtil.storePathForOrg(orgName) 520 }).then( 521 function (store) { 522 client.setStateStore(store); 523 524 client._userContext = null; 525 testUtil.getSubmitter(username, secret, client, true, org, svcFile) 526 .then( 527 function(admin) { 528 529 console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] Successfully loaded user \'admin\'', Nid, pid, channelName, org); 530 the_user = admin; 531 532 channelAddOrderer(chain, client, org) 533 534 channelAddAnchorPeer(chain, client, org); 535 //assignThreadOrgPeer(chain, client, org); 536 537 tCurr = new Date().getTime(); 538 var tSynchUp=tStart-tCurr; 539 if ( tSynchUp < 10000 ) { 540 tSynchUp=10000; 541 } 542 console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] execTransMode: tCurr= %d, tStart= %d, time to wait=%d', Nid, pid, channelName, org, tCurr, tStart, tSynchUp); 543 // execute transactions 544 chain.initialize() 545 .then((success) => { 546 setTimeout(function() { 547 if (transMode.toUpperCase() == 'SIMPLE') { 548 execModeSimple(); 549 } else if (transMode.toUpperCase() == 'CONSTANT') { 550 execModeConstant(); 551 } else if (transMode.toUpperCase() == 'MIX') { 552 execModeMix(); 553 } else if (transMode.toUpperCase() == 'BURST') { 554 execModeBurst(); 555 } else if (transMode.toUpperCase() == 'LATENCY') { 556 execModeLatency(); 557 } else if (transMode.toUpperCase() == 'PROPOSAL') { 558 execModeProposal(); 559 } else { 560 // invalid transaction request 561 console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s execTransMode] Transaction %j and/or mode %s invalid", Nid, pid, channelName, org, transType, transMode)); 562 process.exit(1); 563 } 564 }, tSynchUp); 565 }); 566 }, 567 function(err) { 568 console.log('[Nid:id:chan:org=%d:%d:%s:%s execTransMode] Failed to wait due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 569 return; 570 } 571 ); 572 }); 573 } 574 575 function isExecDone(trType){ 576 tCurr = new Date().getTime(); 577 if ( trType.toUpperCase() == 'MOVE' ) { 578 if ( nRequest > 0 ) { 579 if ( (inv_m % (nRequest/10)) == 0 ) { 580 console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d", 581 Nid, pid, channelName, org, trType, inv_m, tCurr-tLocal)); 582 } 583 584 if ( inv_m >= nRequest ) { 585 IDone = 1; 586 } 587 } else { 588 if ( (inv_m % 1000) == 0 ) { 589 console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d", 590 Nid, pid, channelName, org, trType, inv_m, tCurr-tLocal)); 591 } 592 593 if ( tCurr > tEnd ) { 594 IDone = 1; 595 } 596 } 597 } else if ( trType.toUpperCase() == 'QUERY' ) { 598 if ( nRequest > 0 ) { 599 if ( (inv_q % (nRequest/10)) == 0 ) { 600 console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d", 601 Nid, pid, channelName, org, trType, inv_q, tCurr-tLocal)); 602 } 603 604 if ( inv_q >= nRequest ) { 605 QDone = 1; 606 } 607 } else { 608 if ( (inv_q % 1000) == 0 ) { 609 console.log(util.format("[Nid:id:chan:org=%d:%d:%s:%s isExecDone] invokes(%s) sent: number=%d, elapsed time= %d", 610 Nid, pid, channelName, org, trType, inv_q, tCurr-tLocal)); 611 } 612 613 if ( tCurr > tEnd ) { 614 QDone = 1; 615 } 616 } 617 } 618 619 620 } 621 622 623 var txRequest; 624 function getTxRequest(results) { 625 txRequest = { 626 proposalResponses: results[0], 627 proposal: results[1], 628 header: results[2] 629 }; 630 } 631 632 var evtRcv=0; 633 function eventRegister(tx, cb) { 634 var txId = tx.toString(); 635 636 var deployId = tx_id.toString(); 637 var eventPromises = []; 638 eventHubs.forEach((eh) => { 639 let txPromise = new Promise((resolve, reject) => { 640 let handle = setTimeout(reject, 600000); 641 642 eh.registerTxEvent(deployId.toString(), (tx, code) => { 643 clearTimeout(handle); 644 eh.unregisterTxEvent(deployId); 645 evtRcv++; 646 647 if (code !== 'VALID') { 648 console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister] The invoke transaction was invalid, code = ', Nid, pid, channelName, org, code); 649 reject(); 650 } else { 651 if ( ( IDone == 1 ) && ( inv_m == evtRcv ) ) { 652 tCurr = new Date().getTime(); 653 console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister] completed Rcvd(sent)=%d(%d) %s(%s) in %d ms, timestamp: start %d end %d, #event timeout: %d', Nid, pid, channelName, org, evtRcv, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr, evtTimeout); 654 if (invokeCheck.toUpperCase() == 'TRUE') { 655 arg0 = keyStart + inv_m - 1; 656 inv_q = inv_m - 1; 657 invoke_query_simple(0); 658 } 659 evtDisconnect(); 660 resolve(); 661 } 662 } 663 }); 664 }).catch((err) => { 665 evtTimeout++; 666 //console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister] number of events timeout=%d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, evtTimeout, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 667 }); 668 669 eventPromises.push(txPromise); 670 }); 671 //var sendPromise = chain.sendTransaction(txRequest); 672 cb(eventPromises); 673 //cb(txRequest); 674 /* 675 return Promise.all([sendPromise].concat(eventPromises)) 676 .then((results) => { 677 console.log(' event promise all complete and testing complete'); 678 return results[0]; // the first returned value is from the 'sendPromise' which is from the 'sendTransaction()' call 679 }).catch((err) => { 680 console.log('Failed to send transaction and get notifications within the timeout period.'); 681 evtDisconnect(); 682 throw new Error('Failed to send transaction and get notifications within the timeout period.'); 683 }); 684 */ 685 } 686 687 function eventRegister_latency(tx, cb) { 688 var txId = tx.toString(); 689 690 var deployId = tx_id.toString(); 691 var eventPromises = []; 692 eventHubs.forEach((eh) => { 693 let txPromise = new Promise((resolve, reject) => { 694 let handle = setTimeout(reject, 600000); 695 evtRcv++; 696 697 eh.registerTxEvent(deployId.toString(), (tx, code) => { 698 clearTimeout(handle); 699 eh.unregisterTxEvent(deployId); 700 701 if (code !== 'VALID') { 702 console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister_latency] The invoke transaction was invalid, code = ', Nid, pid, channelName, org, code); 703 reject(); 704 } else { 705 if ( ( IDone == 1 ) && ( inv_m == evtRcv ) ) { 706 tCurr = new Date().getTime(); 707 console.log('[Nid:id:chan:org=%d:%d:%s:%s eventRegister_latency] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 708 if (invokeCheck.toUpperCase() == 'TRUE') { 709 arg0 = keyStart + inv_m - 1; 710 inv_q = inv_m - 1; 711 invoke_query_simple(0); 712 } 713 evtDisconnect(); 714 resolve(); 715 } else if ( IDone != 1 ) { 716 invoke_move_latency(); 717 } 718 } 719 }); 720 }); 721 722 eventPromises.push(txPromise); 723 }); 724 //var sendPromise = chain.sendTransaction(txRequest); 725 cb(eventPromises); 726 727 /* 728 return Promise.all([sendPromise].concat(eventPromises)) 729 .then((results) => { 730 console.log(' event promise all complete and testing complete'); 731 return results[0]; // the first returned value is from the 'sendPromise' which is from the 'sendTransaction()' call 732 }).catch((err) => { 733 console.log('Failed to send transaction and get notifications within the timeout period.'); 734 evtDisconnect(); 735 throw new Error('Failed to send transaction and get notifications within the timeout period.'); 736 }); 737 */ 738 739 } 740 741 742 // invoke_move_latency 743 function invoke_move_latency() { 744 if ( IDone == 1 ) { 745 return; 746 } 747 748 inv_m++; 749 750 getMoveRequest(); 751 752 chain.sendTransactionProposal(request_invoke) 753 .then( 754 function(results) { 755 var proposalResponses = results[0]; 756 757 getTxRequest(results); 758 eventRegister_latency(request_invoke.txId, function(sendPromise) { 759 760 var sendPromise = chain.sendTransaction(txRequest); 761 return Promise.all([sendPromise].concat(eventPromises)) 762 .then((results) => { 763 764 isExecDone('Move'); 765 return results[0]; 766 767 }).catch((err) => { 768 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_latency] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 769 evtDisconnect(); 770 return; 771 }) 772 }, 773 function(err) { 774 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_latency] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 775 evtDisconnect(); 776 }) 777 778 }); 779 780 } 781 782 783 function execModeLatency() { 784 785 // send proposal to endorser 786 if ( transType.toUpperCase() == 'INVOKE' ) { 787 tLocal = new Date().getTime(); 788 if ( runDur > 0 ) { 789 tEnd = tLocal + runDur; 790 } 791 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeLatency] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal); 792 if ( invokeType.toUpperCase() == 'MOVE' ) { 793 var freq = 20000; 794 if ( ccType == 'ccchecker' ) { 795 freq = 0; 796 } 797 invoke_move_latency(); 798 } else if ( invokeType.toUpperCase() == 'QUERY' ) { 799 invoke_query_simple(0); 800 } 801 } else { 802 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeLatency] invalid transType= %s', Nid, pid, channelName, org, transType); 803 evtDisconnect(); 804 } 805 } 806 807 // invoke_move_simple 808 function invoke_move_simple(freq) { 809 inv_m++; 810 811 getMoveRequest(); 812 813 chain.sendTransactionProposal(request_invoke) 814 .then( 815 function(results) { 816 var proposalResponses = results[0]; 817 818 getTxRequest(results); 819 eventRegister(request_invoke.txId, function(sendPromise) { 820 821 var sendPromise = chain.sendTransaction(txRequest); 822 return Promise.all([sendPromise].concat(eventPromises)) 823 .then((results) => { 824 //tCurr = new Date().getTime(); 825 //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 826 827 isExecDone('Move'); 828 if ( IDone != 1 ) { 829 setTimeout(function(){ 830 invoke_move_simple(freq); 831 },freq); 832 } else { 833 tCurr = new Date().getTime(); 834 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_simple] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 835 // return; 836 } 837 return results[0]; 838 839 }).catch((err) => { 840 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_simple] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 841 evtDisconnect(); 842 return; 843 }) 844 }, 845 function(err) { 846 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_simple] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 847 evtDisconnect(); 848 }) 849 850 }); 851 } 852 853 854 855 856 // invoke_query_simple 857 function invoke_query_simple(freq) { 858 inv_q++; 859 860 getQueryRequest(); 861 chain.queryByChaincode(request_query) 862 .then( 863 function(response_payloads) { 864 isExecDone('Query'); 865 if ( QDone != 1 ) { 866 setTimeout(function(){ 867 invoke_query_simple(freq); 868 },freq); 869 } else { 870 tCurr = new Date().getTime(); 871 if (response_payloads) { 872 console.log('response_payloads length:', response_payloads.length); 873 for(let j = 0; j < response_payloads.length; j++) { 874 //console.log('[Nid:id=%d:%d key:%d] invoke_query_simple query result:', Nid, pid, inv_q, response_payloads[j].toString('utf8')); 875 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8')); 876 } 877 } else { 878 console.log('response_payloads is null'); 879 } 880 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_q, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 881 process.exit(); 882 } 883 }, 884 function(err) { 885 console.log('[[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 886 process.exit(); 887 return; 888 }) 889 .catch( 890 function(err) { 891 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_simple] %s failed: ', Nid, pid, channelName, org, transType, err.stack ? err.stack : err); 892 process.exit(); 893 } 894 ); 895 896 } 897 898 function execModeSimple() { 899 900 // send proposal to endorser 901 if ( transType.toUpperCase() == 'INVOKE' ) { 902 tLocal = new Date().getTime(); 903 if ( runDur > 0 ) { 904 tEnd = tLocal + runDur; 905 } 906 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeSimple] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal); 907 if ( invokeType.toUpperCase() == 'MOVE' ) { 908 var freq = 20000; 909 if ( ccType == 'ccchecker' ) { 910 freq = 0; 911 } 912 invoke_move_simple(freq); 913 } else if ( invokeType.toUpperCase() == 'QUERY' ) { 914 invoke_query_simple(0); 915 } 916 } else { 917 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeSimple] invalid transType= %s', Nid, pid, channelName, org, transType); 918 evtDisconnect(); 919 } 920 } 921 922 var devFreq; 923 function getRandomNum(min0, max0) { 924 return Math.floor(Math.random() * (max0-min0)) + min0; 925 } 926 // invoke_move_const 927 function invoke_move_const(freq) { 928 inv_m++; 929 930 var t1 = new Date().getTime(); 931 getMoveRequest(); 932 933 chain.sendTransactionProposal(request_invoke) 934 .then( 935 function(results) { 936 var proposalResponses = results[0]; 937 938 getTxRequest(results); 939 eventRegister(request_invoke.txId, function(sendPromise) { 940 941 var sendPromise = chain.sendTransaction(txRequest); 942 return Promise.all([sendPromise].concat(eventPromises)) 943 .then((results) => { 944 //tCurr = new Date().getTime(); 945 //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 946 947 // hist output 948 if ( recHist == 'HIST' ) { 949 tCurr = new Date().getTime(); 950 buff = Nid +':'+ pid + ':' + channelName +':' + org + ' ' + transType[0] + ':' + inv_m + ' time:'+ tCurr + '\n'; 951 fs.appendFile(ofile, buff, function(err) { 952 if (err) { 953 return console.log(err); 954 } 955 }) 956 } 957 958 isExecDone('Move'); 959 if ( IDone != 1 ) { 960 var freq_n=freq; 961 if ( devFreq > 0 ) { 962 freq_n=getRandomNum(freq-devFreq, freq+devFreq); 963 } 964 tCurr = new Date().getTime(); 965 t1 = tCurr - t1; 966 setTimeout(function(){ 967 invoke_move_const(freq); 968 },freq_n-t1); 969 } else { 970 tCurr = new Date().getTime(); 971 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_const] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 972 return; 973 } 974 //return results[0]; 975 976 }).catch((err) => { 977 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_const] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 978 evtDisconnect(); 979 return; 980 }) 981 }, 982 function(err) { 983 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_const] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 984 evtDisconnect(); 985 }) 986 987 }); 988 } 989 990 991 // invoke_query_const 992 function invoke_query_const(freq) { 993 inv_q++; 994 995 getQueryRequest(); 996 chain.queryByChaincode(request_query) 997 .then( 998 function(response_payloads) { 999 // output 1000 if ( recHist == 'HIST' ) { 1001 tCurr = new Date().getTime(); 1002 buff = Nid +':'+ pid + ':' + channelName +':' + org + ' ' + transType[0] + ':' + inv_m + ' time:'+ tCurr + '\n'; 1003 fs.appendFile(ofile, buff, function(err) { 1004 if (err) { 1005 return console.log(err); 1006 } 1007 }) 1008 } 1009 isExecDone('Query'); 1010 if ( QDone != 1 ) { 1011 var freq_n=getRandomNum(freq-devFreq, freq+devFreq); 1012 setTimeout(function(){ 1013 invoke_query_const(freq); 1014 },freq_n); 1015 } else { 1016 tCurr = new Date().getTime(); 1017 for(let j = 0; j < response_payloads.length; j++) { 1018 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8')); 1019 } 1020 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_q, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1021 process.exit(); 1022 } 1023 }, 1024 function(err) { 1025 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1026 process.exit(); 1027 }) 1028 .catch( 1029 function(err) { 1030 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_const] %s failed: ', Nid, pid, channelName, org, transType, err.stack ? err.stack : err); 1031 process.exit(); 1032 } 1033 ); 1034 1035 } 1036 function execModeConstant() { 1037 1038 // send proposal to endorser 1039 if ( transType.toUpperCase() == 'INVOKE' ) { 1040 if (uiContent.constantOpt.recHist) { 1041 recHist = uiContent.constantOpt.recHist.toUpperCase(); 1042 } 1043 console.log('recHist: ', recHist); 1044 1045 tLocal = new Date().getTime(); 1046 if ( runDur > 0 ) { 1047 tEnd = tLocal + runDur; 1048 } 1049 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal); 1050 var freq = parseInt(uiContent.constantOpt.constFreq); 1051 ofile = 'ConstantResults'+Nid+'.txt'; 1052 1053 if (typeof( uiContent.constantOpt.devFreq ) == 'undefined') { 1054 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] devFreq undefined, set to 0', Nid, pid, channelName, org); 1055 devFreq=0; 1056 } else { 1057 devFreq = parseInt(uiContent.constantOpt.devFreq); 1058 } 1059 1060 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] Constant Freq: %d ms, variance Freq: %d ms', Nid, pid, channelName, org, freq, devFreq); 1061 1062 if ( invokeType.toUpperCase() == 'MOVE' ) { 1063 if ( ccType == 'general' ) { 1064 if ( freq < 20000 ) { 1065 freq = 20000; 1066 } 1067 } 1068 invoke_move_const(freq); 1069 } else if ( invokeType.toUpperCase() == 'QUERY' ) { 1070 invoke_query_const(freq); 1071 } 1072 } else { 1073 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeConstant] invalid transType= %s', Nid, pid, channelName, org, transType); 1074 evtDisconnect(); 1075 } 1076 } 1077 1078 // mix mode 1079 function invoke_move_mix(freq) { 1080 inv_m++; 1081 1082 getMoveRequest(); 1083 1084 chain.sendTransactionProposal(request_invoke) 1085 .then( 1086 function(results) { 1087 var proposalResponses = results[0]; 1088 1089 getTxRequest(results); 1090 eventRegister(request_invoke.txId, function(sendPromise) { 1091 1092 var sendPromise = chain.sendTransaction(txRequest); 1093 return Promise.all([sendPromise].concat(eventPromises)) 1094 .then((results) => { 1095 //tCurr = new Date().getTime(); 1096 //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1097 1098 if ( IDone != 1 ) { 1099 setTimeout(function(){ 1100 arg0--; 1101 invoke_query_mix(freq); 1102 },freq); 1103 } else { 1104 tCurr = new Date().getTime(); 1105 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_mix] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1106 // return; 1107 } 1108 return results[0]; 1109 1110 }).catch((err) => { 1111 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_mix] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1112 evtDisconnect(); 1113 return; 1114 }) 1115 }, 1116 function(err) { 1117 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_mix] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1118 evtDisconnect(); 1119 }) 1120 1121 }); 1122 } 1123 1124 // invoke_query_mix 1125 function invoke_query_mix(freq) { 1126 inv_q++; 1127 1128 getQueryRequest(); 1129 chain.queryByChaincode(request_query) 1130 .then( 1131 function(response_payloads) { 1132 isExecDone('Move'); 1133 if ( IDone != 1 ) { 1134 invoke_move_mix(freq); 1135 } else { 1136 for(let j = 0; j < response_payloads.length; j++) { 1137 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8')); 1138 } 1139 tCurr = new Date().getTime(); 1140 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] completed %d Invoke(move) and %d invoke(query) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, inv_q, tCurr-tLocal, tLocal, tCurr); 1141 return; 1142 } 1143 }, 1144 function(err) { 1145 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1146 evtDisconnect(); 1147 return; 1148 }) 1149 .catch( 1150 function(err) { 1151 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_mix] %s failed: ', Nid, pid, channelName, org, transType, err.stack ? err.stack : err); 1152 evtDisconnect(); 1153 } 1154 ); 1155 1156 } 1157 function execModeMix() { 1158 1159 // send proposal to endorser 1160 if ( transType.toUpperCase() == 'INVOKE' ) { 1161 // no need to check since a query is issued after every invoke 1162 invokeCheck = 'FALSE'; 1163 tLocal = new Date().getTime(); 1164 if ( runDur > 0 ) { 1165 tEnd = tLocal + runDur; 1166 } 1167 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeMix] tStart %d, tEnd %d, tLocal %d', Nid, pid, channelName, org, tStart, tEnd, tLocal); 1168 var freq = parseInt(uiContent.mixOpt.mixFreq); 1169 if ( ccType == 'general' ) { 1170 if ( freq < 20000 ) { 1171 freq = 20000; 1172 } 1173 } 1174 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeMix] Mix Freq: %d ms', Nid, pid, channelName, org, freq); 1175 invoke_move_mix(freq); 1176 } else { 1177 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeMix] invalid transType= %s', Nid, pid, channelName, org, transType); 1178 evtDisconnect(); 1179 } 1180 } 1181 1182 1183 // invoke_move_latency 1184 function invoke_move_proposal() { 1185 1186 inv_m++; 1187 1188 getMoveRequest(); 1189 1190 chain.sendTransactionProposal(request_invoke) 1191 .then( 1192 function(results) { 1193 var proposalResponses = results[0]; 1194 1195 isExecDone('Move'); 1196 if ( IDone == 1 ) { 1197 tCurr = new Date().getTime(); 1198 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_proposal] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1199 evtDisconnect(); 1200 return; 1201 } else { 1202 invoke_move_proposal(); 1203 return results[0]; 1204 } 1205 1206 1207 }, 1208 function(err) { 1209 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_proposal] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1210 evtDisconnect(); 1211 }); 1212 1213 1214 } 1215 1216 1217 function execModeProposal() { 1218 1219 // send proposal to endorser 1220 if ( transType.toUpperCase() == 'INVOKE' ) { 1221 tLocal = new Date().getTime(); 1222 if ( runDur > 0 ) { 1223 tEnd = tLocal + runDur; 1224 } 1225 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeProposal] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal); 1226 if ( invokeType.toUpperCase() == 'MOVE' ) { 1227 var freq = 20000; 1228 if ( ccType == 'ccchecker' ) { 1229 freq = 0; 1230 } 1231 invoke_move_latency(); 1232 invoke_move_proposal(); 1233 } else if ( invokeType.toUpperCase() == 'QUERY' ) { 1234 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeProposal] invalid invokeType= %s', Nid, pid, channelName, org, invokeType); 1235 evtDisconnect(); 1236 } 1237 } else { 1238 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeProposal] invalid transType= %s', Nid, pid, channelName, org, transType); 1239 evtDisconnect(); 1240 } 1241 } 1242 1243 // Burst mode vars 1244 var burstFreq0; 1245 var burstDur0; 1246 var burstFreq1; 1247 var burstDur1; 1248 var tDur=[]; 1249 var tFreq=[]; 1250 var tUpd0; 1251 var tUpd1; 1252 var bFreq; 1253 1254 function getBurstFreq() { 1255 1256 tCurr = new Date().getTime(); 1257 //console.log('[Nid:id:chan:org=%d:%d:%s:%s, getBurstFreq] tCurr= %d', Nid, pid, channelName, org, tCurr); 1258 1259 // set up burst traffic duration and frequency 1260 if ( tCurr < tUpd0 ) { 1261 bFreq = tFreq[0]; 1262 } else if ( tCurr < tUpd1 ) { 1263 bFreq = tFreq[1]; 1264 } else { 1265 tUpd0 = tCurr + tDur[0]; 1266 tUpd1 = tUpd0 + tDur[1]; 1267 bFreq = tFreq[0]; 1268 } 1269 1270 } 1271 1272 // invoke_move_burst 1273 function invoke_move_burst() { 1274 inv_m++; 1275 // set up burst traffic duration and frequency 1276 getBurstFreq(); 1277 //console.log('invoke_move_burst: inv_m: %d, bFreq: %d', inv_m, bFreq); 1278 1279 getMoveRequest(); 1280 1281 chain.sendTransactionProposal(request_invoke) 1282 .then( 1283 function(results) { 1284 var proposalResponses = results[0]; 1285 1286 getTxRequest(results); 1287 eventRegister(request_invoke.txId, function(sendPromise) { 1288 1289 var sendPromise = chain.sendTransaction(txRequest); 1290 return Promise.all([sendPromise].concat(eventPromises)) 1291 .then((results) => { 1292 //tCurr = new Date().getTime(); 1293 //console.log('[Nid:id=%d:%d] event promise all complete and testing completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1294 1295 isExecDone('Move'); 1296 if ( IDone != 1 ) { 1297 setTimeout(function(){ 1298 invoke_move_burst(); 1299 },bFreq); 1300 } else { 1301 tCurr = new Date().getTime(); 1302 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_burst] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_m, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1303 return; 1304 } 1305 //return results[0]; 1306 1307 }).catch((err) => { 1308 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_burst] Failed to send transaction due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1309 evtDisconnect(); 1310 return; 1311 }) 1312 }, 1313 function(err) { 1314 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_move_burst] Failed to send transaction proposal due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1315 evtDisconnect(); 1316 }) 1317 1318 }); 1319 } 1320 1321 1322 // invoke_query_burst 1323 function invoke_query_burst() { 1324 inv_q++; 1325 1326 // set up burst traffic duration and frequency 1327 getBurstFreq(); 1328 1329 getQueryRequest(); 1330 chain.queryByChaincode(request_query) 1331 .then( 1332 function(response_payloads) { 1333 isExecDone('Query'); 1334 if ( QDone != 1 ) { 1335 setTimeout(function(){ 1336 invoke_query_burst(); 1337 },bFreq); 1338 } else { 1339 tCurr = new Date().getTime(); 1340 for(let j = 0; j < response_payloads.length; j++) { 1341 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] query result:', Nid, pid, channelName, org, response_payloads[j].toString('utf8')); 1342 } 1343 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] completed %d %s(%s) in %d ms, timestamp: start %d end %d', Nid, pid, channelName, org, inv_q, transType, invokeType, tCurr-tLocal, tLocal, tCurr); 1344 //return; 1345 } 1346 }, 1347 function(err) { 1348 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] Failed to send query due to error: ', Nid, pid, channelName, org, err.stack ? err.stack : err); 1349 evtDisconnect(); 1350 return; 1351 }) 1352 .catch( 1353 function(err) { 1354 console.log('[Nid:id:chan:org=%d:%d:%s:%s invoke_query_burst] %s failed: ', Nid, pid, channelName, org, transType, err.stack ? err.stack : err); 1355 evtDisconnect(); 1356 } 1357 ); 1358 1359 } 1360 function execModeBurst() { 1361 1362 // init TcertBatchSize 1363 burstFreq0 = parseInt(uiContent.burstOpt.burstFreq0); 1364 burstDur0 = parseInt(uiContent.burstOpt.burstDur0); 1365 burstFreq1 = parseInt(uiContent.burstOpt.burstFreq1); 1366 burstDur1 = parseInt(uiContent.burstOpt.burstDur1); 1367 tFreq = [burstFreq0, burstFreq1]; 1368 tDur = [burstDur0, burstDur1]; 1369 1370 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] Burst setting: tDur =',Nid, pid, channelName, org, tDur); 1371 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] Burst setting: tFreq=',Nid, pid, channelName, org, tFreq); 1372 1373 // get time 1374 tLocal = new Date().getTime(); 1375 1376 tUpd0 = tLocal+tDur[0]; 1377 tUpd1 = tLocal+tDur[1]; 1378 bFreq = tFreq[0]; 1379 1380 // send proposal to endorser 1381 if ( transType.toUpperCase() == 'INVOKE' ) { 1382 tLocal = new Date().getTime(); 1383 if ( runDur > 0 ) { 1384 tEnd = tLocal + runDur; 1385 } 1386 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] tStart %d, tLocal %d', Nid, pid, channelName, org, tStart, tLocal); 1387 if ( invokeType.toUpperCase() == 'MOVE' ) { 1388 invoke_move_burst(); 1389 } else if ( invokeType.toUpperCase() == 'QUERY' ) { 1390 invoke_query_burst(); 1391 } 1392 } else { 1393 console.log('[Nid:id:chan:org=%d:%d:%s:%s execModeBurst] invalid transType= %s', Nid, pid, channelName, org, transType); 1394 evtDisconnect(); 1395 } 1396 } 1397 1398 function sleep(ms) { 1399 return new Promise(resolve => setTimeout(resolve, ms)); 1400 } 1401 1402 function evtDisconnect() { 1403 for ( i=0; i<eventHubs.length; i++) { 1404 if (eventHubs[i] && eventHubs[i].isconnected()) { 1405 logger.info('Disconnecting the event hub: %d', i); 1406 eventHubs[i].disconnect(); 1407 } 1408 } 1409 } 1410