mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 18:01:01 -06:00
53901a7e62
Add a single global schema cache for providers. This allows multiple provider instances to share a single copy of the schema, and prevents loading the schema multiple times for a given provider type during a single command. This does not currently work with some provider releases, which are using GetProviderSchema to trigger certain initializations. A new server capability will be introduced to trigger reloading their schemas, but not store duplicate results.
42 lines
1.0 KiB
Go
42 lines
1.0 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package providers
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/hashicorp/terraform/internal/addrs"
|
|
)
|
|
|
|
// SchemaCache is a global cache of GetProviderSchemaResponses.
|
|
// This will be accessed by both core and the provider clients to ensure that
|
|
// large schemas are stored in a single location.
|
|
var SchemaCache = &schemaCache{
|
|
m: make(map[addrs.Provider]GetProviderSchemaResponse),
|
|
}
|
|
|
|
// Global cache for provider schemas
|
|
// Cache the entire response to ensure we capture any new fields, like
|
|
// ServerCapabilities. This also serves to capture errors so that multiple
|
|
// concurrent calls resulting in an error can be handled in the same manner.
|
|
type schemaCache struct {
|
|
mu sync.Mutex
|
|
m map[addrs.Provider]GetProviderSchemaResponse
|
|
}
|
|
|
|
func (c *schemaCache) Set(p addrs.Provider, s GetProviderSchemaResponse) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
c.m[p] = s
|
|
}
|
|
|
|
func (c *schemaCache) Get(p addrs.Provider) (GetProviderSchemaResponse, bool) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
s, ok := c.m[p]
|
|
return s, ok
|
|
}
|