|
363 | 363 | destination => $synapse_server_name, |
364 | 364 | ); |
365 | 365 | })->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 | + |
367 | 369 | await_sync_timeline_contains( |
368 | 370 | $creator_user, $room2_id, |
369 | 371 | check => sub { |
|
379 | 381 | })->then( sub { |
380 | 382 | my ( $sync_body ) = @_; |
381 | 383 | 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; |
383 | 385 |
|
384 | 386 | my $prev_batch = $room2_sync->{timeline}->{prev_batch}; |
385 | 387 | assert_ok( $prev_batch, "prev_batch" ); |
386 | 388 |
|
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 |
388 | 411 | # server backfills. |
389 | 412 | Future->needs_all( |
390 | 413 | do_request_json_for( |
|
395 | 418 | dir => "b", |
396 | 419 | from => $prev_batch, |
397 | 420 | }, |
398 | | - ), |
| 421 | + )->on_done(sub { |
| 422 | + my ( $resp ) = @_; |
| 423 | + log_if_fail "Pagination request completed", $resp; |
| 424 | + }), |
399 | 425 |
|
400 | 426 | $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; |
402 | 430 |
|
403 | 431 | $req->respond_json( { |
404 | 432 | origin => $inbound_server->server_name, |
405 | 433 | origin_server_ts => $inbound_server->time_ms, |
406 | 434 | pdus => [ |
407 | 435 | $event_Q, |
408 | | - $event_P, |
409 | 436 | ], |
410 | 437 | }); |
411 | 438 | Future->done; |
412 | 439 | }), |
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 | | - }), |
434 | 440 | )->then( sub { |
435 | 441 | my ( $messages ) = @_; |
436 | 442 | log_if_fail "/messages result", $messages; |
437 | 443 |
|
| 444 | + # cancel the state_ids responder, if it didn't get used. |
| 445 | + $state_ids_fut->cancel(); |
| 446 | + |
438 | 447 | # ensure that P does not feature in the list. |
439 | 448 | die 'too few events' if @{$messages->{chunk}} < 2; |
440 | 449 | foreach my $ev ( @{$messages->{chunk}} ) { |
|
0 commit comments