Some checks failed
Server CI / Postgres (shard 0) (push) Has been skipped
Server CI / Postgres (shard 3) (push) Has been skipped
BuildEnv Docker Image / build-image (push) Failing after 4s
BuildEnv Docker Image / build-image-fips (push) Failing after 4s
Migration Review & Release Notes / Generate migration review & release notes (push) Failing after 3s
Server CI / Build Environment (push) Failing after 3s
Server CI / Postgres (shard 1) (push) Has been skipped
Tools CI / check-style (mattermost-govet) (push) Failing after 4s
Server CI / Postgres (shard 2) (push) Has been skipped
Tools CI / check-style (mmgotool) (push) Failing after 3s
Server CI / Elasticsearch v8 Compatibility (push) Has been skipped
Server CI / OpenSearch v2 Compatibility (push) Has been skipped
Server CI / Postgres FIPS (shard 0) (push) Has been skipped
Tools CI / Test (mattermost-govet) (push) Failing after 3s
Server CI / Postgres FIPS (shard 1) (push) Has been skipped
Server CI / Postgres FIPS (shard 2) (push) Has been skipped
Tools CI / Test (mmgotool) (push) Failing after 3s
Server CI / Postgres FIPS (shard 3) (push) Has been skipped
Server CI / Run mmctl tests (push) Has been skipped
Server CI / Run mmctl tests (FIPS) (push) Has been skipped
Server CI / Merge Postgres Test Results (push) Has been skipped
Server CI / Merge Postgres FIPS Test Results (push) Has been skipped
Server CI / Check backport migrations (push) Has been skipped
Server CI / Check generated files (push) Has been skipped
Server CI / check-style (push) Has been skipped
Server CI / Vet API (push) Has been skipped
Server CI / Build mattermost server app (push) Has been skipped
Server CI / Server CI Complete (push) Failing after 2s
Server CI / Server CI Artifacts (push) Has been skipped
Server CI / Sentry Upload (push) Has been skipped
Server CI / Server CI Report (push) Failing after 5m1s
Server CI Nightly Race / Race Detector (push) Has been skipped
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Webapp CI Cache Warm / Warm Webapp node_modules Cache (push) Has been cancelled
E2E CI Cache Warm / Warm E2E npm Registry Cache (push) Has been cancelled
API / build (push) Has been cancelled
Web App CI / check-types (push) Has been cancelled
Web App CI / check-lint (push) Has been cancelled
Web App CI / check-i18n (push) Has been cancelled
Web App CI / check-external-links (push) Has been cancelled
Web App CI / test (platform) (push) Has been cancelled
Web App CI / test (mattermost-redux) (push) Has been cancelled
Web App CI / test (channels shard 1/4) (push) Has been cancelled
Web App CI / test (channels shard 2/4) (push) Has been cancelled
Web App CI / test (channels shard 3/4) (push) Has been cancelled
Web App CI / test (channels shard 4/4) (push) Has been cancelled
Web App CI / upload-coverage (push) Has been cancelled
Web App CI / build (push) Has been cancelled
YAML Lint / yamllint (push) Has been cancelled
Push mirrored docker images / cd/Push mirrored docker images (push) Has been cancelled
docs-cd / Build and deploy docs (push) Has been cancelled
Docs CI / build (push) Has been cancelled
E2E Cache Warm: Cypress deps / Warm Cypress deps cache (push) Has been cancelled
Scorecards supply-chain security / Scorecard analysis (push) Has been cancelled
Server CI Weekly / Postgres FIPS (push) Has been skipped
Server CI Weekly / Run mmctl tests (FIPS) (push) Has been skipped
Server CI Weekly / Postgres with binary parameters (push) Has been skipped
Server CI Weekly / Build Environment (push) Failing after 1s
Server CI Cache Warm / Warm Go Module and Build Cache (push) Failing after 2s
Server CI Nightly Race / Build Environment (push) Failing after 1s
113 lines
2.8 KiB
Go
113 lines
2.8 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package platform
|
|
|
|
import (
|
|
"context"
|
|
"runtime"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// GoContext returns a context that is cancelled when the server begins shutting down. It is
|
|
// suitable as the parent for long-running background requests that must not outlive the server.
|
|
func (ps *PlatformService) GoContext() context.Context {
|
|
if ps.goroutineCtx == nil {
|
|
return context.Background()
|
|
}
|
|
return ps.goroutineCtx
|
|
}
|
|
|
|
// Go creates a goroutine, but maintains a record of it to ensure that execution completes before
|
|
// the server is shutdown.
|
|
func (ps *PlatformService) Go(f func()) {
|
|
atomic.AddInt32(&ps.goroutineCount, 1)
|
|
|
|
go func() {
|
|
f()
|
|
|
|
atomic.AddInt32(&ps.goroutineCount, -1)
|
|
select {
|
|
case ps.goroutineExitSignal <- struct{}{}:
|
|
default:
|
|
}
|
|
}()
|
|
}
|
|
|
|
// waitForGoroutines blocks until all goroutines created by PlatformService.Go() exit.
|
|
func (ps *PlatformService) waitForGoroutines() {
|
|
for atomic.LoadInt32(&ps.goroutineCount) != 0 {
|
|
<-ps.goroutineExitSignal
|
|
}
|
|
}
|
|
|
|
func (ps *PlatformService) GoBuffered(f func()) {
|
|
ps.goroutineBuffered <- struct{}{}
|
|
|
|
atomic.AddInt32(&ps.goroutineCount, 1)
|
|
|
|
go func() {
|
|
f()
|
|
|
|
atomic.AddInt32(&ps.goroutineCount, -1)
|
|
select {
|
|
case ps.goroutineExitSignal <- struct{}{}:
|
|
default:
|
|
}
|
|
|
|
<-ps.goroutineBuffered
|
|
}()
|
|
}
|
|
|
|
// startExtractionWorkers launches the fixed-size pool of workers that run
|
|
// document extraction tasks submitted through GoExtraction.
|
|
func (ps *PlatformService) startExtractionWorkers() {
|
|
numWorkers := runtime.NumCPU()
|
|
for range numWorkers {
|
|
ps.extractionWG.Go(func() {
|
|
for {
|
|
select {
|
|
case <-ps.extractionStop:
|
|
return
|
|
case f := <-ps.extractionQueue:
|
|
f()
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// stopExtractionWorkers signals the extraction workers to exit and waits for
|
|
// any in-flight extraction to finish. Queued-but-not-started tasks are drained
|
|
// and discarded so a worker cannot dequeue and run them after shutdown has been
|
|
// signaled.
|
|
func (ps *PlatformService) stopExtractionWorkers() {
|
|
close(ps.extractionStop)
|
|
|
|
drain:
|
|
for {
|
|
select {
|
|
case <-ps.extractionQueue:
|
|
default:
|
|
break drain
|
|
}
|
|
}
|
|
|
|
ps.extractionWG.Wait()
|
|
}
|
|
|
|
// GoExtraction submits f to the bounded document extraction worker pool. It
|
|
// never blocks the caller: if every worker is busy and the queue is full it
|
|
// returns false without running f. Skipped files stay unextracted until the
|
|
// scheduled ExtractContent catch-up job or an admin runs a content extraction job
|
|
// (e.g. mmctl extract). This keeps expensive extractions from stalling the
|
|
// from stalling the request goroutines that dispatch them.
|
|
func (ps *PlatformService) GoExtraction(f func()) bool {
|
|
select {
|
|
case ps.extractionQueue <- f:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|