Add profiling, fix race condition with WaitGroup

This commit is contained in:
Jacob Gunther 2023-07-20 13:30:07 -05:00
parent 1c83ebc36a
commit 7ecc250f03
No known key found for this signature in database
GPG Key ID: 9E6F3F4BF45EC433
3 changed files with 52 additions and 18 deletions

View File

@ -6,6 +6,7 @@ import (
"net/http"
"os"
"os/signal"
"strconv"
"syscall"
"github.com/gofiber/fiber/v2"
@ -25,7 +26,7 @@ var (
})
r *Redis = &Redis{}
conf *Config = DefaultConfig
instanceID uint16
instanceID uint16 = 0
)
func init() {
@ -80,6 +81,18 @@ func init() {
}
func main() {
if v := os.Getenv("PROFILE"); len(v) > 0 {
port, err := strconv.ParseUint(v, 10, 16)
if err != nil {
panic(err)
}
go Profile(uint16(port))
log.Printf("Profiler is listening on :%d\n", port)
}
defer r.Close()
go ListenAndServe(conf.Host, conf.Port+instanceID)

15
src/profiler.go Normal file
View File

@ -0,0 +1,15 @@
package main
import (
"fmt"
"log"
"net/http"
"net/http/pprof"
)
func Profile(port uint16) {
mux := http.NewServeMux()
mux.HandleFunc("/", pprof.Profile)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), mux))
}

View File

@ -235,31 +235,37 @@ func GetServerIcon(host string, port uint16) ([]byte, time.Duration, error) {
func FetchJavaStatus(host string, port uint16, enableQuery bool) JavaStatusResponse {
var wg sync.WaitGroup
var status interface{} = nil
var query *response.FullQuery = nil
go func() {
defer wg.Done()
if result, _ := mcutil.Status(host, port); result != nil {
status = result
} else if result, _ := mcutil.StatusLegacy(host, port); result != nil {
status = result
}
}()
wg.Add(1)
if enableQuery {
go func() {
defer wg.Done()
wg.Add(1)
}
var status interface{} = nil
var query *response.FullQuery = nil
// Status
{
go func() {
if result, _ := mcutil.Status(host, port); result != nil {
status = result
} else if result, _ := mcutil.StatusLegacy(host, port); result != nil {
status = result
}
wg.Done()
}()
}
// Query
if enableQuery {
go func() {
query, _ = mcutil.FullQuery(host, port, options.Query{
Timeout: time.Second,
})
}()
wg.Add(1)
wg.Done()
}()
}
wg.Wait()