diff --git a/tools/jmeter/build.gradle b/tools/jmeter/build.gradle
index b9426d0b4b..f92ea2e2df 100644
--- a/tools/jmeter/build.gradle
+++ b/tools/jmeter/build.gradle
@@ -107,6 +107,8 @@ run {
args+= Eval.me(jmeterHosts)
}
+ args += [ "-XserverRmiMappings", sourceSets.main.resources.getSrcDirs().first().getPath() + "/../data/server-rmi.config"]
+
args+= [ "-XjmeterProperties", sourceSets.main.resources.getSrcDirs().first().getPath()+"/jmeter.properties",
"--",
"-d", sourceSets.main.resources.getSrcDirs().first().getPath() ]
@@ -140,7 +142,6 @@ task buildJMeterJAR(type: FatCapsule) {
from(processResources) {
include "log4j2.xml"
include "*.properties"
- include "server-rmi.config"
include "bin/*.properties"
}
diff --git a/tools/jmeter/src/main/resources/Bridge IssueAndPay.jmx b/tools/jmeter/src/main/data/Bridge IssueAndPay.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/Bridge IssueAndPay.jmx
rename to tools/jmeter/src/main/data/Bridge IssueAndPay.jmx
diff --git a/tools/jmeter/src/main/resources/Example Flow Request.jmx b/tools/jmeter/src/main/data/Example Flow Request.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/Example Flow Request.jmx
rename to tools/jmeter/src/main/data/Example Flow Request.jmx
diff --git a/tools/jmeter/src/main/resources/IssueAndPay Request.jmx b/tools/jmeter/src/main/data/IssueAndPay Request.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/IssueAndPay Request.jmx
rename to tools/jmeter/src/main/data/IssueAndPay Request.jmx
diff --git a/tools/jmeter/src/main/resources/LocalBatchNotarise Request.jmx b/tools/jmeter/src/main/data/LocalBatchNotarise Request.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/LocalBatchNotarise Request.jmx
rename to tools/jmeter/src/main/data/LocalBatchNotarise Request.jmx
diff --git a/tools/jmeter/src/main/resources/LocalIssueAndPay Request.jmx b/tools/jmeter/src/main/data/LocalIssueAndPay Request.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/LocalIssueAndPay Request.jmx
rename to tools/jmeter/src/main/data/LocalIssueAndPay Request.jmx
diff --git a/tools/jmeter/src/main/data/Sample Testplans/Example Flow Request.jmx b/tools/jmeter/src/main/data/Sample Testplans/Example Flow Request.jmx
new file mode 100644
index 0000000000..ad90aa2a6d
--- /dev/null
+++ b/tools/jmeter/src/main/data/Sample Testplans/Example Flow Request.jmx
@@ -0,0 +1,195 @@
+
+
+
+
+ A very simple test plan that connects to a node via RPC and self issues
+ cash
+
+ false
+ false
+
+
+
+
+
+
+
+ continue
+
+ false
+ 1000
+
+ 3
+
+ 1509455820000
+ 1509455820000
+ false
+
+
+ The thread group controls how often the requests are run. Expand it on the
+ left hand side to see the sampler configuration.
+
+
+
+
+ This is configured to invoke the CashIssueSampler - the RPC details and
+ the notary name for the test set-up need to be entered for it to work.
+
+
+
+
+ label
+ ${__samplerName}
+ =
+
+
+ host
+ Hostname of RPC target here
+ =
+
+
+ port
+ RPC port here
+ =
+
+
+ username
+ RPC user name here
+ =
+
+
+ password
+ RPC password Here
+ =
+
+
+ notaryName
+ X500 name of the notary here
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+ true
+
+
+
+
diff --git a/tools/jmeter/src/main/data/Sample Testplans/NightlyBenchmarkSample.jmx b/tools/jmeter/src/main/data/Sample Testplans/NightlyBenchmarkSample.jmx
new file mode 100644
index 0000000000..6b13ee26e6
--- /dev/null
+++ b/tools/jmeter/src/main/data/Sample Testplans/NightlyBenchmarkSample.jmx
@@ -0,0 +1,2404 @@
+
+
+
+
+ This is a sample what is run for Corda performance testing at R3
+
+ false
+ true
+
+
+
+
+
+
+
+
+
+ host
+ Hostname of RPC target here
+ =
+ Hostname of the target node that JMeter should connect to via
+ RPC (the node under test)
+
+
+
+ port
+ 10003
+ =
+ Configured RPC port of the target node
+
+
+ username
+ RPC user name here
+ =
+ User name as configured in the RPC credentials of the target
+ node
+
+
+
+ password
+ RPC password here
+ =
+ Password as configured in the RPC credentials of the target
+ node
+
+
+
+ notaryName
+ X500 name of the notary here
+ =
+ The Corda X500 name of the notary to be used for these tests.
+
+
+
+ otherPartyName
+ X500 name of reveiving node here
+ =
+ The Corda X500 name of the node receiving funds in the payment
+ tests
+
+
+
+ duration
+ 300
+ =
+ Runtime of the test in seconds - in our performance set-up,
+ each test step runs for 5 minutes.
+
+
+
+ pause
+ 30
+ =
+ Time to pause between two runs to let the system flush out in
+ seconds.
+
+
+
+ remoteAgentCount
+ 5
+ =
+ Number of remote JMeter agent connecting to the target node.
+ This is used for correct labelling of tests.
+
+
+
+ firewallHost
+ Hostname of RPC target for firewall tests here
+ =
+ Hostname of the target node for tests using Corda
+ Float/Firewall
+
+
+
+ This plans uses variables to avoid repeating configuration values -
+ enter the details of your test network set-up here, all the rest of the plan should just work.
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 200
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+ Run empty flows to baseline RPC/serialisation overhead
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+
+ com.r3.corda.jmeter.EmptyFlowSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 1
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 5
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 10
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 20
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 60
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 80
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 100
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 200
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+
+ com.r3.corda.jmeter.CashIssueSampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 1
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 2
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 5
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 10
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 20
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 30
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 1
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${firewallHost}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 5
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${firewallHost}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 10
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${firewallHost}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 20
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${firewallHost}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 30
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${firewallHost}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${firewallHost}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 1
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 5
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 20
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 40
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 80
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 160
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 320
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ continue
+
+ false
+ -1
+
+ 40
+
+ 1509455820000
+ 1509455820000
+ true
+ ${duration}
+ ${pause}
+
+
+
+
+
+
+ label
+
+ ${__samplerName}-${__groovy(ctx.getThreadGroup().getNumThreads() * vars.get("remoteAgentCount").toInteger())}
+
+ =
+
+
+ host
+ ${host}
+ =
+
+
+ port
+ ${port}
+ =
+
+
+ username
+ ${username}
+ =
+
+
+ password
+ ${password}
+ =
+
+
+ notaryName
+ ${notaryName}
+ =
+
+
+ otherPartyName
+ ${otherPartyName}
+ =
+
+
+ numberOfStatesPerTx
+ 640
+ =
+
+
+ numberOfChangeStatesPerTx
+ 1
+ =
+
+
+ anonymousIdentities
+ false
+ =
+
+
+
+ com.r3.corda.jmeter.CashPaySampler
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+ false
+
+ saveConfig
+
+
+ true
+ true
+ true
+
+ true
+ true
+ true
+ true
+ false
+ true
+ true
+ false
+ false
+ false
+ true
+ false
+ false
+ false
+ true
+ 0
+ true
+ true
+ true
+ true
+ true
+
+
+
+
+
+
+
+ true
+
+
+
+
diff --git a/tools/jmeter/src/main/resources/Testplans/CashIssuance_40k.jmx b/tools/jmeter/src/main/data/Testplans/CashIssuance_40k.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/Testplans/CashIssuance_40k.jmx
rename to tools/jmeter/src/main/data/Testplans/CashIssuance_40k.jmx
diff --git a/tools/jmeter/src/main/resources/Testplans/NightlyBenchmark.jmx b/tools/jmeter/src/main/data/Testplans/NightlyBenchmark.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/Testplans/NightlyBenchmark.jmx
rename to tools/jmeter/src/main/data/Testplans/NightlyBenchmark.jmx
diff --git a/tools/jmeter/src/main/resources/Testplans/SQL.jmx b/tools/jmeter/src/main/data/Testplans/SQL.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/Testplans/SQL.jmx
rename to tools/jmeter/src/main/data/Testplans/SQL.jmx
diff --git a/tools/jmeter/src/main/resources/Testplans/SQL_parmeterized.jmx b/tools/jmeter/src/main/data/Testplans/SQL_parmeterized.jmx
similarity index 100%
rename from tools/jmeter/src/main/resources/Testplans/SQL_parmeterized.jmx
rename to tools/jmeter/src/main/data/Testplans/SQL_parmeterized.jmx
diff --git a/tools/jmeter/src/main/resources/server-rmi.config b/tools/jmeter/src/main/data/server-rmi.config
similarity index 100%
rename from tools/jmeter/src/main/resources/server-rmi.config
rename to tools/jmeter/src/main/data/server-rmi.config
diff --git a/tools/jmeter/src/main/kotlin/com/r3/corda/jmeter/Launcher.kt b/tools/jmeter/src/main/kotlin/com/r3/corda/jmeter/Launcher.kt
index 07146aa69c..712bd002c8 100644
--- a/tools/jmeter/src/main/kotlin/com/r3/corda/jmeter/Launcher.kt
+++ b/tools/jmeter/src/main/kotlin/com/r3/corda/jmeter/Launcher.kt
@@ -94,12 +94,14 @@ class Launcher {
} else {
File(cmdLine.jMeterProperties).toPath()
}
- val serverRmiMappingFile = if (cmdLine.serverRmiMappings.isBlank()) {
- (jMeterHome / "server-rmi.config").toString()
+ val serverRmiMappings = if (!cmdLine.serverRmiMappings.isBlank()) {
+ readHostAndPortMap(cmdLine.serverRmiMappings)
} else {
- cmdLine.serverRmiMappings
+ if (!cmdLine.sshHosts.isEmpty()) {
+ throw LauncherException("Enabling ssh tunneling requires providing rmi mappings via -XserverRmiMappings")
+ }
+ emptyMap()
}
- val serverRmiMappings = readHostAndPortMap(serverRmiMappingFile)
// we want to add the jMeter properties file here - it must not be part of the user specified jMeter
// arguments
@@ -118,9 +120,12 @@ class Launcher {
if (port != null) {
val rmiPropsFile = (jMeterHome / "server-rmi.properties").toFile()
rmiPropsFile.writeText("server.rmi.localport=$port")
-
jMeterArgs.addAll(listOf("-q", rmiPropsFile.toString()))
+ logger.info("Starting jmeter server using mapped server.rmi.localport=$port")
+ } else {
+ logger.info("No rmi server mapping found, using default server.rmi.localport - assuming no ssh tunnelling in effect")
}
+
}
return JMeterArgsPlus(jMeterArgs, jMeterPropertiesFile, serverRmiMappings)
}
diff --git a/tools/jmeter/src/test/kotlin/com/r3/corda/jmeter/TestLauncherHelpers.kt b/tools/jmeter/src/test/kotlin/com/r3/corda/jmeter/TestLauncherHelpers.kt
index 6f46a0d6ab..64be604ad6 100644
--- a/tools/jmeter/src/test/kotlin/com/r3/corda/jmeter/TestLauncherHelpers.kt
+++ b/tools/jmeter/src/test/kotlin/com/r3/corda/jmeter/TestLauncherHelpers.kt
@@ -118,11 +118,12 @@ class TestLauncherHelpers {
SystemPropertySetter("jmeter.home", temporaryFolder.root.toString()).use {
val defaultJmeterPropertiesFile = createFileInTmpFolder("jmeter.properties")
createFileInTmpFolder("custom.properties")
- createFileInTmpFolder("server-rmi.config", "${InetAddress.getLocalHost().hostName}:10101")
createFileInTmpFolder("nomatch-rmi.config", "notmatching:10101")
val cmdLine = LauncherCommandLine()
cmdLine.jMeterArguments.addAll(listOf("-s"))
+ cmdLine.serverRmiMappings = createFileInTmpFolder("server-rmi.config", "${InetAddress.getLocalHost().hostName}:10101")
+
val result = Launcher.prepareJMeterArguments(cmdLine)
assertEquals(defaultJmeterPropertiesFile, result.jmeterPropertiesFile.toString())
@@ -158,6 +159,23 @@ class TestLauncherHelpers {
}
}
+ @Test
+ fun testJMeterArgPreparationServerMissingRmiMapping() {
+ SystemPropertySetter("jmeter.home", temporaryFolder.root.toString()).use {
+ createFileInTmpFolder("jmeter.properties")
+ val customJmeterPropertiesFile = createFileInTmpFolder("custom.properties")
+ createFileInTmpFolder("server-rmi.config", "${InetAddress.getLocalHost().hostName}:10101")
+ createFileInTmpFolder("nomatch-rmi.config", "notmatching:10101")
+
+ val cmdLine = LauncherCommandLine()
+ cmdLine.jMeterArguments.addAll(listOf("-s"))
+ cmdLine.sshHosts = mutableListOf("node1.mydomain.com")
+ cmdLine.jMeterProperties = customJmeterPropertiesFile
+
+ testForException("Enabling ssh tunneling requires providing rmi mappings via -XserverRmiMappings") { Launcher.prepareJMeterArguments(cmdLine) }
+ }
+ }
+
@Test
fun testJMeterArgPreparationClient() {
SystemPropertySetter("jmeter.home", temporaryFolder.root.toString()).use {
@@ -170,7 +188,6 @@ class TestLauncherHelpers {
val result = Launcher.prepareJMeterArguments(cmdLine)
assertEquals(defaultJmeterPropertiesFile, result.jmeterPropertiesFile.toString())
- assertEquals(mapOf(InetAddress.getLocalHost().hostName to 10101), result.serverRmiMappings)
val expectedServerPropsFile = temporaryFolder.root.toPath() / "server-rmi.properties"
assertEquals(listOf("-p", defaultJmeterPropertiesFile), result.jmeterArgs)
val serverPropsFile = expectedServerPropsFile.toFile()