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
3 changed files with 52 additions and 18 deletions

View File

@@ -6,6 +6,7 @@ import (
"net/http" "net/http"
"os" "os"
"os/signal" "os/signal"
"strconv"
"syscall" "syscall"
"github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2"
@@ -25,7 +26,7 @@ var (
}) })
r *Redis = &Redis{} r *Redis = &Redis{}
conf *Config = DefaultConfig conf *Config = DefaultConfig
instanceID uint16 instanceID uint16 = 0
) )
func init() { func init() {
@@ -80,6 +81,18 @@ func init() {
} }
func main() { 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() defer r.Close()
go ListenAndServe(conf.Host, conf.Port+instanceID) 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 { func FetchJavaStatus(host string, port uint16, enableQuery bool) JavaStatusResponse {
var wg sync.WaitGroup 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) wg.Add(1)
if enableQuery { if enableQuery {
go func() { wg.Add(1)
defer wg.Done() }
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{ query, _ = mcutil.FullQuery(host, port, options.Query{
Timeout: time.Second, Timeout: time.Second,
}) })
}()
wg.Add(1) wg.Done()
}()
} }
wg.Wait() wg.Wait()