Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Linearize calls to _generate_user_id #3029

Merged
merged 4 commits into from
Mar 28, 2018

Conversation

erikjohnston
Copy link
Member

(And cheekily remove a cursor_to_dict call)

self._next_generated_user_id = (
yield self.store.find_next_generated_user_id_localpart()
)
with (yield self._generate_user_id_linearizer.queue(())):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

surely we should have a test for self._next_generated_user_id is None inside the linearizer?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, yes! I've added a guard inside too, but kept the outer one for the fast path

@@ -46,6 +46,10 @@ def __init__(self, hs):

self.macaroon_gen = hs.get_macaroon_generator()

self._generate_user_id_linearizer = Linearizer(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With the help of the twisted mailing list, I realised recently that our Linearizer is pretty inefficient, especially when you get lots of things queued up on it. In cases like this where you really just want to do a thing the first time we get to a bit of code, it's better to do it with a single Deferred that everything else hangs off:

if thing_result is None:
    if thing_deferred is None:
        thing_deferred = run_in_background(do_the_thing)
    yield make_deferred_yieldable(thing_deferred)

(which is probably more-or-less equivalent to what some of our cache wrappers do)

having said that, if you feel disinclined to rewrite all this right now, I won't insist. Just I think we should bear it in mind for the future.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, we could use an ObservableDeferred here. I think with the reseed logic it becomes a non-trivial rewrite, so I think I'll punt until we have a chance to look at how we should be doing this properly.

@richvdh richvdh assigned erikjohnston and unassigned richvdh Mar 27, 2018
@erikjohnston erikjohnston assigned richvdh and unassigned erikjohnston Mar 27, 2018
Copy link
Member

@richvdh richvdh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@richvdh richvdh assigned erikjohnston and unassigned richvdh Mar 27, 2018
@erikjohnston erikjohnston merged commit f879127 into develop Mar 28, 2018
@erikjohnston erikjohnston deleted the erikj/linearize_generate_user_id branch September 20, 2018 13:59
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants