1
0
mirror of https://github.com/ppy/osu.git synced 2026-05-17 04:32:35 +08:00
Commit Graph

6 Commits

  • Do not forcibly log out user if user retrieval fails with a server error code (#36897)
    * Do not forcibly log out user if user retrieval fails with a server error code
    
    This behaviour caused users to get forcibly logged out of the game
    during yesterday's redis outage.
    
    From one case where logs were provided
    (https://discord.com/channels/188630481301012481/1097318920991559880/1480201862610423933):
    
    - User had repeated timeouts on API requests; consequently, API went
      into failing state
    - On one of the login retries `/api/v2/me` returned a 500 with no error
      details (`{"error":"null}` JSON response) which resulted in
      an instant logout as per
    
      https://github.com/ppy/osu/blob/7263551aa868911a7d9148cf2cb16f9e0325f531/osu.Game/Online/API/APIAccess.cs#L323-L324
    
    This PR intends to only forcibly log the user out if the returned error
    code indicates a client error. If it is a server error, the login is
    preserved and a normal retry loop proceeds.
    
    This can be tested with a local web instance via following steps:
    
    1. Start `osu-web` and a client instance connected to it.
    2. Log in on the client instance.
    3. Kill (`^C`) `osu-web`.
    4. Trigger a few requests in the client and wait for enough of them to
       fail for the API to change to `Failing` state.
    5. Apply
    
    ```diff
    diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php
    index db34639abf2..392a844882a 100644
    --- a/app/Http/Controllers/UsersController.php
    +++ b/app/Http/Controllers/UsersController.php
    @@ -581,6 +581,8 @@ class UsersController extends Controller
          */
         public function me($mode = null)
         {
    +        abort(500);
    +
             $user = \Auth::user();
             $currentMode = $mode ?? $user->playmode;
    
    ```
    
    6. Start `osu-web` again.
    7. On master this will log the user out forcibly. On this PR, the user
       will remain in `Failing` state.
    8. Undo patch from step (5) (restarting web is not required).
    9. On this PR, the client will be logged back in.
    
    * Update framework
    
    ---------
    
    Co-authored-by: Dean Herbert <pe@ppy.sh>
  • Fix API request potentially firing failed events after completion
    Specifically, `Cancel()` calls were not thread safe. Due to a series of
    events, `ListPollingComponent` could call `Cancel` from a non-update
    thread, leading to a race condition where both a `Success` and `Fail`
    event can be fired.
    
    This is intended to be the simplest fix possible, locking and guarding
    specifically on the callbacks. Further work could be done in the future
    to improve the flow surrounding `pendingFailure`, potentially reducing
    redundant work and cleaning up the code, but that's not happening here.
    
    Closes https://github.com/ppy/osu/issues/13632.