MM-52009: Fix hub data race (#22925)
After the monorepo integration, the boards product was started before we started the hub. This led to a data race where the GetHubForUserId was actually called before the hub was initialized. To fix this we initialize the platform first, and then the products. https://mattermost.atlassian.net/browse/MM-52009 ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
35d3e3e91e
Коммит
574e61bcc1
@@ -260,8 +260,17 @@ func NewServer(options ...Option) (*Server, error) {
|
|||||||
product.CommandKey: app,
|
product.CommandKey: app,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 4: Initialize products.
|
// It is important to initialize the hub only after the global logger is set
|
||||||
// Depends on s.httpService.
|
// to avoid race conditions while logging from inside the hub.
|
||||||
|
// Step 4: Start platform
|
||||||
|
s.platform.Start()
|
||||||
|
|
||||||
|
// NOTE: There should be no call to App.Srv().Channels() before step 5 is done
|
||||||
|
// otherwise it will throw a panic.
|
||||||
|
|
||||||
|
// Step 5: Initialize products.
|
||||||
|
// Depends on s.httpService, and depends on the hub to be initialized.
|
||||||
|
// Otherwise we run into race conditions.
|
||||||
err = s.initializeProducts(product.GetProducts(), serviceMap)
|
err = s.initializeProducts(product.GetProducts(), serviceMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to initialize products")
|
return nil, errors.Wrap(err, "failed to initialize products")
|
||||||
@@ -275,11 +284,6 @@ func NewServer(options ...Option) (*Server, error) {
|
|||||||
}
|
}
|
||||||
app.ch = channelsWrapper.app.ch
|
app.ch = channelsWrapper.app.ch
|
||||||
|
|
||||||
// It is important to initialize the hub only after the global logger is set
|
|
||||||
// to avoid race conditions while logging from inside the hub.
|
|
||||||
// Step 5: Start hub in platform which the hub depends on s.Channels() (step 4)
|
|
||||||
s.platform.Start()
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// Everything below this is not order sensitive and safe to be moved around.
|
// Everything below this is not order sensitive and safe to be moved around.
|
||||||
// If you are adding a new field that is non-channels specific, please add
|
// If you are adding a new field that is non-channels specific, please add
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user