diff --git a/lib/SyTest/Homeserver/Synapse.pm b/lib/SyTest/Homeserver/Synapse.pm index a60489404..1bf1ba094 100644 --- a/lib/SyTest/Homeserver/Synapse.pm +++ b/lib/SyTest/Homeserver/Synapse.pm @@ -81,6 +81,14 @@ sub _init frontend_proxy_metrics => main::alloc_port( "frontend_proxy[$idx].metrics" ), frontend_proxy_manhole => main::alloc_port( "frontend_proxy[$idx].manhole" ), + event_persister1 => main::alloc_port( "event_persister1[$idx]" ), + event_persister1_metrics => main::alloc_port( "event_persister1[$idx].metrics" ), + event_persister1_manhole => main::alloc_port( "event_persister1[$idx].manhole" ), + + event_persister2 => main::alloc_port( "event_persister2[$idx]" ), + event_persister2_metrics => main::alloc_port( "event_persister2[$idx].metrics" ), + event_persister2_manhole => main::alloc_port( "event_persister2[$idx].manhole" ), + haproxy => main::alloc_port( "haproxy[$idx]" ), }; } @@ -290,14 +298,18 @@ sub start ) : (), instance_map => { - "frontend_proxy1" => { + "event_persister1" => { + host => "$bind_host", + port => $self->{ports}{event_persister1}, + }, + "event_persister2" => { host => "$bind_host", - port => $self->{ports}{frontend_proxy}, + port => $self->{ports}{event_persister2}, }, }, stream_writers => { - events => $self->{redis_host} ne '' ? "frontend_proxy1" : "master", + events => $self->{redis_host} ne '' ? [ "event_persister1", "event_persister2" ] : "master", }, # We use a high limit so the limit is never reached, but enabling the @@ -970,6 +982,74 @@ sub _start_synapse push @worker_configs, $background_worker_config; } + { + my $event_persister1_config = { + "worker_app" => "synapse.app.generic_worker", + "worker_name" => "event_persister1", + "worker_pid_file" => "$hsdir/event_persister1.pid", + "worker_log_config" => $self->configure_logger("event_persister1"), + "worker_replication_host" => "$bind_host", + "worker_replication_port" => $self->{ports}{synapse_replication_tcp}, + "worker_replication_http_port" => $self->{ports}{synapse_unsecure}, + "worker_main_http_uri" => "http://$bind_host:$self->{ports}{synapse_unsecure}", + "worker_listeners" => [ + { + type => "http", + resources => [{ names => ["client", "replication"] }], + port => $self->{ports}{event_persister1}, + bind_address => $bind_host, + }, + { + type => "manhole", + port => $self->{ports}{event_persister1_manhole}, + bind_address => $bind_host, + }, + { + type => "http", + resources => [{ names => ["metrics"] }], + port => $self->{ports}{event_persister1_metrics}, + bind_address => $bind_host, + }, + ], + }; + + push @worker_configs, $event_persister1_config; + } + + { + my $event_persister2_config = { + "worker_app" => "synapse.app.generic_worker", + "worker_name" => "event_persister2", + "worker_pid_file" => "$hsdir/event_persister2.pid", + "worker_log_config" => $self->configure_logger("event_persister2"), + "worker_replication_host" => "$bind_host", + "worker_replication_port" => $self->{ports}{synapse_replication_tcp}, + "worker_replication_http_port" => $self->{ports}{synapse_unsecure}, + "worker_main_http_uri" => "http://$bind_host:$self->{ports}{synapse_unsecure}", + "worker_listeners" => [ + { + type => "http", + resources => [{ names => ["client", "replication"] }], + port => $self->{ports}{event_persister2}, + bind_address => $bind_host, + }, + { + type => "manhole", + port => $self->{ports}{event_persister2_manhole}, + bind_address => $bind_host, + }, + { + type => "http", + resources => [{ names => ["metrics"] }], + port => $self->{ports}{event_persister2_metrics}, + bind_address => $bind_host, + }, + ], + }; + + push @worker_configs, $event_persister2_config; + } + my @base_synapse_command = $self->_generate_base_synapse_command(); my $idx = $self->{hs_index}; diff --git a/tests/30rooms/60version_upgrade.pl b/tests/30rooms/60version_upgrade.pl index 0c42c6e1e..dc601c81e 100644 --- a/tests/30rooms/60version_upgrade.pl +++ b/tests/30rooms/60version_upgrade.pl @@ -1070,46 +1070,55 @@ sub upgrade_room_synced { $remote_joiner, $new_room_id, ( server_name => $creator->server_name, ) ); })->then(sub { - do_request_json_for( $creator, - method => "GET", - uri => "/r0/publicRooms", - ); - })->then( sub { - # Check public rooms list for local user - my ( $body ) = @_; + # The room list can be updated asynchronously, so we retry if it + # doesn't match what we expect. + retry_until_success { + do_request_json_for( $creator, + method => "GET", + uri => "/r0/publicRooms", + )->then( sub { + # Check public rooms list for local user + my ( $body ) = @_; - log_if_fail "Public rooms list for local user", $body; + log_if_fail "Public rooms list for local user", $body; - assert_json_keys( $body, qw( chunk ) ); + assert_json_keys( $body, qw( chunk ) ); - # Check that the room list contains new room id - any { $new_room_id eq $_->{room_id} } @{ $body->{chunk} } - or die "Local room list did not include expected room id $new_room_id"; + # Check that the room list contains new room id + any { $new_room_id eq $_->{room_id} } @{ $body->{chunk} } + or die "Local room list did not include expected room id $new_room_id"; - # Check that the room list doesn't contain old room id - none { $room_id eq $_->{room_id} } @{ $body->{chunk} } - or die "Local room list included unexpected room id $room_id"; + # Check that the room list doesn't contain old room id + none { $room_id eq $_->{room_id} } @{ $body->{chunk} } + or die "Local room list included unexpected room id $room_id"; - do_request_json_for( $remote_joiner, - method => "GET", - uri => "/r0/publicRooms", - ); - })->then( sub { - # Check public rooms list for remote user - my ( $body ) = @_; + }) + } + })->then(sub { + # The room list can be updated asynchronously, so we retry if it + # doesn't match what we expect. + retry_until_success { + do_request_json_for( $remote_joiner, + method => "GET", + uri => "/r0/publicRooms", + )->then( sub { + # Check public rooms list for remote user + my ( $body ) = @_; - log_if_fail "Public rooms list for remote user", $body; + log_if_fail "Public rooms list for remote user", $body; - assert_json_keys( $body, qw( chunk ) ); + assert_json_keys( $body, qw( chunk ) ); - # Check that the room list contains new room id - any { $new_room_id eq $_->{room_id} } @{ $body->{chunk} } - or die "Remote room list did not include expected room id $new_room_id"; + # Check that the room list contains new room id + any { $new_room_id eq $_->{room_id} } @{ $body->{chunk} } + or die "Remote room list did not include expected room id $new_room_id"; - # Check that the room list doesn't contain old room id - none { $room_id eq $_->{room_id} } @{ $body->{chunk} } - or die "Remote room list included unexpected room id $room_id"; + # Check that the room list doesn't contain old room id + none { $room_id eq $_->{room_id} } @{ $body->{chunk} } + or die "Remote room list included unexpected room id $room_id"; - Future->done( 1 ); + Future->done( 1 ); + }) + } }); }