mirror of
https://github.com/LukeHagar/libopenapi.git
synced 2025-12-06 04:20:11 +00:00
Updated logic to handle a single core
The remote loader was blocking the only thread. Signed-off-by: quobix <dave@quobix.com>
This commit is contained in:
@@ -119,9 +119,10 @@ func ExampleNewDocument_fromWithDocumentConfigurationSuccess() {
|
||||
// create a DocumentConfiguration that allows loading file and remote references, and sets the baseURL
|
||||
// to somewhere that can resolve the relative references.
|
||||
config := datamodel.DocumentConfiguration{
|
||||
AllowFileReferences: true,
|
||||
AllowRemoteReferences: true,
|
||||
BaseURL: baseURL,
|
||||
Logger: slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
|
||||
Level: slog.LevelError,
|
||||
})),
|
||||
}
|
||||
|
||||
// create a new document from specification bytes
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"fmt"
|
||||
"github.com/pb33f/libopenapi/datamodel"
|
||||
"log/slog"
|
||||
"runtime"
|
||||
|
||||
"golang.org/x/sync/syncmap"
|
||||
"gopkg.in/yaml.v3"
|
||||
@@ -259,6 +260,9 @@ func (i *RemoteFS) Open(remoteURL string) (fs.File, error) {
|
||||
// if we're processing, we need to block and wait for the file to be processed
|
||||
// try path first
|
||||
if _, ok := i.ProcessingFiles.Load(remoteParsedURL.Path); ok {
|
||||
// we can't block if we only have a single CPU, as we'll deadlock, only when we're running in parallel
|
||||
// can we block threads.
|
||||
if runtime.GOMAXPROCS(-1) > 1 {
|
||||
i.logger.Debug("waiting for existing fetch to complete", "file", remoteURL, "remoteURL", remoteParsedURL.String())
|
||||
for {
|
||||
if wf, ko := i.Files.Load(remoteParsedURL.Path); ko {
|
||||
@@ -266,6 +270,7 @@ func (i *RemoteFS) Open(remoteURL string) (fs.File, error) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add to processing
|
||||
i.ProcessingFiles.Store(remoteParsedURL.Path, true)
|
||||
@@ -288,10 +293,10 @@ func (i *RemoteFS) Open(remoteURL string) (fs.File, error) {
|
||||
|
||||
i.logger.Debug("loading remote file", "file", remoteURL, "remoteURL", remoteParsedURL.String())
|
||||
|
||||
// no handler func? use the default client.
|
||||
if i.RemoteHandlerFunc == nil {
|
||||
i.RemoteHandlerFunc = i.defaultClient.Get
|
||||
}
|
||||
//// no handler func? use the default client.
|
||||
//if i.RemoteHandlerFunc == nil {
|
||||
// i.RemoteHandlerFunc = i.defaultClient.Get
|
||||
//}
|
||||
|
||||
response, clientErr := i.RemoteHandlerFunc(remoteParsedURL.String())
|
||||
if clientErr != nil {
|
||||
|
||||
@@ -103,7 +103,7 @@ func TestSpecIndex_DigitalOcean(t *testing.T) {
|
||||
cf.AllowRemoteLookup = true
|
||||
cf.AvoidCircularReferenceCheck = true
|
||||
cf.Logger = slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
|
||||
Level: slog.LevelError,
|
||||
Level: slog.LevelDebug,
|
||||
}))
|
||||
|
||||
// setting this baseURL will override the base
|
||||
|
||||
Reference in New Issue
Block a user