Skip to content

Commit c002087

Browse files
russellballestriniphobologic
authored andcommitted
Creates a memoized provider builder for AWS. (#648)
This could speed up stacker by many seconds based on the profiling work @ejholmes performed in #630 modified: stacker/providers/aws/default.py
1 parent c396146 commit c002087

1 file changed

Lines changed: 28 additions & 5 deletions

File tree

stacker/providers/aws/default.py

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
import urllib.parse
1313
import sys
1414

15+
# thread safe, memoized, provider builder.
16+
from threading import Lock
17+
1518
import botocore.exceptions
1619
from botocore.config import Config
1720

@@ -448,17 +451,37 @@ def generate_stack_policy_args(stack_policy=None):
448451

449452

450453
class ProviderBuilder(object):
451-
"""Implements a ProviderBuilder for the AWS provider."""
454+
"""Implements a Memoized ProviderBuilder for the AWS provider."""
452455

453456
def __init__(self, region=None, **kwargs):
454457
self.region = region
455458
self.kwargs = kwargs
459+
self.providers = {}
460+
self.lock = Lock()
456461

457462
def build(self, region=None, profile=None):
458-
if not region:
459-
region = self.region
460-
session = get_session(region=region, profile=profile)
461-
return Provider(session, region=region, **self.kwargs)
463+
"""Get or create the provider for the given region and profile."""
464+
465+
with self.lock:
466+
# memoization lookup key derived from region + profile.
467+
key = "{}-{}".format(profile, region)
468+
try:
469+
# assume provider is in provider dictionary.
470+
provider = self.providers[key]
471+
except KeyError:
472+
msg = "Missed memoized lookup ({}), creating new AWS Provider."
473+
logger.debug(msg.format(key))
474+
if not region:
475+
region = self.region
476+
# memoize the result for later.
477+
self.providers[key] = Provider(
478+
get_session(region=region, profile=profile),
479+
region=region,
480+
**self.kwargs
481+
)
482+
provider = self.providers[key]
483+
484+
return provider
462485

463486

464487
class Provider(BaseProvider):

0 commit comments

Comments
 (0)