Skip to content

Commit 9766edd

Browse files
committed
Extend cross-room backfill request to work with different impls
Servers should not be *obliged* to send a `state_ids` request if it already has the `auth_events` of a given event.
1 parent a2c0e95 commit 9766edd

File tree

2 files changed

+36
-28
lines changed

2 files changed

+36
-28
lines changed

lib/SyTest/Federation/Server.pm

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ sub mk_await_request_pair
338338

339339
return $self->{$okey}{$ikey} = Future->new
340340
->on_cancel( sub {
341-
warn "Cancelling unused $shortname await for @paramvalues";
342341
delete $self->{$okey}{$ikey};
343342
});
344343
};

tests/50federation/34room-backfill.pl

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,9 @@
363363
destination => $synapse_server_name,
364364
);
365365
})->then( sub {
366-
# wait for it to arrive
366+
# wait for S to arrive
367+
log_if_fail "Awating arrival of event S $event_id_S in room $room2_id";
368+
367369
await_sync_timeline_contains(
368370
$creator_user, $room2_id,
369371
check => sub {
@@ -379,12 +381,33 @@
379381
})->then( sub {
380382
my ( $sync_body ) = @_;
381383
my $room2_sync = $sync_body->{rooms}->{join}->{$room2_id};
382-
log_if_fail "sync body", $room2_sync;
384+
log_if_fail "sync body for room2 $room2_id", $room2_sync;
383385

384386
my $prev_batch = $room2_sync->{timeline}->{prev_batch};
385387
assert_ok( $prev_batch, "prev_batch" );
386388

387-
# now back-paginate, and provide event Q (and P, for good measure) when the
389+
# the server may or may not see the prev_event link to P as a hole in the dag,
390+
# and send us another state_ids request at Q. We give it a response if so.
391+
my $state_ids_fut = $inbound_server->await_request_state_ids(
392+
$room2_id, $event_id_Q,
393+
)->then( sub {
394+
my ( $req, @params ) = @_;
395+
log_if_fail "/state_ids request", \@params;
396+
397+
my %state = %{ $room2->{current_state} };
398+
my $resp = {
399+
pdu_ids => [
400+
map { $room2->id_for_event( $_ ) } values( %state ),
401+
],
402+
auth_chain_ids => $room2->event_ids_from_refs( $event_Q->{auth_events} ),
403+
};
404+
405+
log_if_fail "/state_ids response", $resp;
406+
$req->respond_json( $resp );
407+
Future->done(1);
408+
});
409+
410+
# now back-paginate, and provide event Q when the
388411
# server backfills.
389412
Future->needs_all(
390413
do_request_json_for(
@@ -395,46 +418,32 @@
395418
dir => "b",
396419
from => $prev_batch,
397420
},
398-
),
421+
)->on_done(sub {
422+
my ( $resp ) = @_;
423+
log_if_fail "Pagination request completed", $resp;
424+
}),
399425

400426
$inbound_server->await_request_backfill( $room2_id )->then( sub {
401-
my ( $req ) = @_;
427+
my ( $req, @params ) = @_;
428+
429+
log_if_fail "Incoming /backfill request", \@params;
402430

403431
$req->respond_json( {
404432
origin => $inbound_server->server_name,
405433
origin_server_ts => $inbound_server->time_ms,
406434
pdus => [
407435
$event_Q,
408-
$event_P,
409436
],
410437
});
411438
Future->done;
412439
}),
413-
414-
# the server will (should) see the prev_event link to P as a hole in the dag,
415-
# so will send us another state_ids request at Q.
416-
$inbound_server->await_request_state_ids(
417-
$room2_id, $event_id_Q,
418-
)->then( sub {
419-
my ( $req, @params ) = @_;
420-
log_if_fail "/state_ids request", \@params;
421-
422-
my %state = %{ $room2->{current_state} };
423-
my $resp = {
424-
pdu_ids => [
425-
map { $room2->id_for_event( $_ ) } values( %state ),
426-
],
427-
auth_chain_ids => $room2->event_ids_from_refs( $event_Q->{auth_events} ),
428-
};
429-
430-
log_if_fail "/state_ids response", $resp;
431-
$req->respond_json( $resp );
432-
Future->done(1);
433-
}),
434440
)->then( sub {
435441
my ( $messages ) = @_;
436442
log_if_fail "/messages result", $messages;
437443

444+
# cancel the state_ids responder, if it didn't get used.
445+
$state_ids_fut->cancel();
446+
438447
# ensure that P does not feature in the list.
439448
die 'too few events' if @{$messages->{chunk}} < 2;
440449
foreach my $ev ( @{$messages->{chunk}} ) {

0 commit comments

Comments
 (0)