-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[sonic-cfggen] optimize sonic-cfggen startup #3658
Changes from 2 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# monkey patch re.compile to improve import time of some packages | ||
|
||
import re | ||
|
||
_orig_re_compile = re.compile | ||
|
||
def __re_compile(*args, **kwargs): | ||
class __LazyReCompile(object): | ||
def __init__(self, *args, **kwargs): | ||
self.args = args | ||
self.kwargs = kwargs | ||
self.pattern_obj = None | ||
|
||
def __getattr__(self, name): | ||
if self.pattern_obj is None: | ||
self.pattern_obj = _orig_re_compile(*self.args, **self.kwargs) | ||
return getattr(self.pattern_obj, name) | ||
return __LazyReCompile(*args, **kwargs) | ||
|
||
re.compile = __re_compile | ||
|
||
|
||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
import jinja2 | ||
|
||
class RedisBytecodeCache(jinja2.BytecodeCache): | ||
""" A bytecode cache for jinja2 template that stores bytecode in Redis """ | ||
|
||
REDIS_HASH = 'JINJA2_CACHE' | ||
|
||
def __init__(self, client): | ||
self._client = client | ||
try: | ||
self._client.connect(self._client.STATE_DB, retry_on=False) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
use another non-used database? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can I use db index 8 and update swss-common/swss-sdk? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
except Exception: | ||
self._client = None | ||
|
||
def load_bytecode(self, bucket): | ||
if self._client is None: | ||
return | ||
code = self._client.get(self._client.STATE_DB, self.REDIS_HASH, bucket.key) | ||
if code is not None: | ||
bucket.bytecode_from_string(code) | ||
|
||
def dump_bytecode(self, bucket): | ||
if self._client is None: | ||
return | ||
self._client.set(self._client.STATE_DB, self.REDIS_HASH, bucket.key, bucket.bytecode_to_string()) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,16 @@ See usage string for detail description for arguments. | |
""" | ||
|
||
from __future__ import print_function | ||
|
||
# mokey patch re.compile to do lazy regular expression compilation. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
typo #Closed |
||
# This is done to improve import time of jinja2, yaml, natsort modules, because they | ||
# do many regexp compilation at import time, so it will speed up sonic-cfggen invocations | ||
# that do not require template generation or yaml loading. sonic-cfggen is used in so many places | ||
# during system boot up that importing jinja2, yaml, natsort every time | ||
# without lazy regular expression compilation affect boot up time. | ||
# FIXME: remove this once sonic-cfggen and templates dependencies are replaced with a faster approach | ||
import lazy_re | ||
|
||
import sys | ||
import os.path | ||
import argparse | ||
|
@@ -33,7 +43,8 @@ from sonic_device_util import get_platform_info | |
from sonic_device_util import get_system_mac | ||
from config_samples import generate_sample_config | ||
from config_samples import get_available_config | ||
from swsssdk import ConfigDBConnector | ||
from swsssdk import SonicV2Connector, ConfigDBConnector | ||
from redis_bcc import RedisBytecodeCache | ||
from collections import OrderedDict | ||
from natsort import natsorted | ||
|
||
|
@@ -259,7 +270,8 @@ def main(): | |
paths = ['/', '/usr/share/sonic/templates', os.path.dirname(template_file)] | ||
loader = jinja2.FileSystemLoader(paths) | ||
|
||
env = jinja2.Environment(loader=loader, trim_blocks=True) | ||
redis_bcc = RedisBytecodeCache(SonicV2Connector(host='127.0.0.1')) | ||
env = jinja2.Environment(loader=loader, trim_blocks=True, bytecode_cache=redis_bcc) | ||
env.filters['sort_by_port_index'] = sort_by_port_index | ||
env.filters['ipv4'] = is_ipv4 | ||
env.filters['ipv6'] = is_ipv6 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Several code format issues. Please check http://pep8online.com #Closed