Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow --no-web together with --master for automation #333

Merged
merged 1 commit into from
Apr 12, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions locust/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import inspect
import logging
import socket
import time
from optparse import OptionParser

import web
Expand Down Expand Up @@ -115,6 +116,15 @@ def parse_options():
help="Port that locust master should bind to. Only used when running with --master. Defaults to 5557. Note that Locust will also use this port + 1, so by default the master node will bind to 5557 and 5558."
)

parser.add_option(
'--expect-slaves',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally I prefer --min-slaves as it better communicates what the behavior is. Since you can have greater than the number of expected slaves with this implementation. See https://github.com/locustio/locust/pull/372/files#diff-6f782ed63a6a642694db58c0d5cdd932R125

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't the current implementation start close to immediately once the min slave count has been reached? If so, how would I go about to start a test with more slaves than min_slaves (other than just spawning them all at the same time and hoping that they would connect before the the poll check)?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it would but I think that's the behavior I would expect. I think most people using this feature would bring up the master process specifying --min-slaves 10, then bring up 10 slave processes to connect to the master. If I wanted 11 slaves, I would simply indicate --min-slaves 11. However if I thought I wanted 10 slaves, but later realized I need 11 slaves to reach my desired throughput, then I could add another 1 slave after the original 10 slaves have already started swarming.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In that case I think i'd still prefer --num-slaves or --expected-slave-count. Though it might be bikeshedding, and I'm fine with --min-slaves as well :).

but later realized I need 11 slaves to reach my desired throughput, then I could add another 1 slave after the original 10 slaves have already started swarming

That would require us to have some kind of automatic re-balancing of simulated users when new slaves connect.

action='store',
type='int',
dest='expect_slaves',
default=1,
help="How many slaves master should expect to connect before starting the test (only when --no-web used)."
)

# if we should print stats in the console
parser.add_option(
'--no-web',
Expand Down Expand Up @@ -386,11 +396,6 @@ def main():
}
console_logger.info(dumps(task_data))
sys.exit(0)

# if --master is set, make sure --no-web isn't set
if options.master and options.no_web:
logger.error("Locust can not run distributed with the web interface disabled (do not use --no-web and --master together)")
sys.exit(0)

if not options.no_web and not options.slave:
# spawn web greenlet
Expand All @@ -405,6 +410,14 @@ def main():
main_greenlet = runners.locust_runner.greenlet
elif options.master:
runners.locust_runner = MasterLocustRunner(locust_classes, options)
if options.no_web:
while len(runners.locust_runner.clients.ready)<options.expect_slaves:
logging.info("Waiting for slaves to be ready, %s of %s connected",
len(runners.locust_runner.clients.ready), options.expect_slaves)
time.sleep(1)

runners.locust_runner.start_hatching(options.num_clients, options.hatch_rate)
main_greenlet = runners.locust_runner.greenlet
elif options.slave:
try:
runners.locust_runner = SlaveLocustRunner(locust_classes, options)
Expand Down