Skip to content

Goose hangs in the exiting phase #582

@lvn-ruby-dragon

Description

@lvn-ruby-dragon

I have the following setup ...

pub(crate) async fn transaction1(user: &mut GooseUser) -> TransactionResult {
    user.client = Client::builder()
        .http1_only()
        .trust_dns(true)
        .build()
        .expect("Client creation failed");

    let request_builder = user
        .get_request_builder(&GooseMethod::Get, "/endpoint1")?
        .version(reqwest::Version::HTTP_11);

    let goose_request = GooseRequest::builder()
        .set_request_builder(request_builder)
        .build();

    let validation = &Validate::builder().status(200).build();

    let goose = user.request(goose_request).await?;

    validate_page(user, goose, validation).await?;

    Ok(())
}

pub(crate) async fn transaction2(user: &mut GooseUser) -> TransactionResult {
    user.client = Client::builder()
        .http1_only()
        .trust_dns(true)
        .build()
        .expect("Client creation failed");

    let request_builder = user
        .get_request_builder(&GooseMethod::Get, "/endpoint2")?
        .version(reqwest::Version::HTTP_11);

    let goose_request = GooseRequest::builder()
        .set_request_builder(request_builder)
        .build();

    let validation = &Validate::builder().status(200).build();

    let goose = user.request(goose_request).await?;

    validate_page(user, goose, validation).await?;

    Ok(())
}

pub(crate) async fn transaction3(user: &mut GooseUser) -> TransactionResult {
    user.client = Client::builder()
        .http1_only()
        .trust_dns(true)
        .build()
        .expect("Client creation failed");

    let request_builder = user
        .get_request_builder(&GooseMethod::Get, "/endpoint3")?
        .version(reqwest::Version::HTTP_11);

    let goose_request = GooseRequest::builder()
        .set_request_builder(request_builder)
        .build();

    let validation = &Validate::builder().status(200).build();

    let goose = user.request(goose_request).await?;

    validate_page(user, goose, validation).await?;

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), GooseError> {
    GooseAttack::initialize()?
        .register_scenario(
            scenario!("scenario1").register_transaction(transaction!(transaction1).set_name("tx1")),
        )
        .register_scenario(
            scenario!("scenario2")
                .register_transaction(transaction!(transaction2).set_name("tx2"))
                .register_transaction(transaction!(transaction2).set_name("tx3"))
        )
        .execute()
        .await?;

  Ok(())
}

I have 5 scenarios with a total of some 30 transactions. When I build the binary:

$ cargo build --release --target=x86_64-unknown-linux-musl

and ship the binary onto a testing machine and run it like this:

./goose-test --users 100 --startup-time 100s --host MY_HOST --report-file=report.html --run-time 2m

It successfully goes through the launching and maintain phase and then pretty much always gets stuck on exiting one of the users:

exiting user 3 from SOME_SCENARIO...

Never finishes and never produces the report. Do you see anything I'm doing wrong, please?

Metadata

Metadata

Assignees

No one assigned

    Labels

    help wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions