Don't perform some API self-tests in production mode for performance reasons

The API does a fair number of self tests and locking to assure that the
registered commands are consistent and will work. This does not need
to be done on a production system and adds additional overhead causing
somewhere between a 30 and 50% decrease in performance.

Because makeapi is executed when a build is done ensure that it is
executed in developer mode to ensure that the framework is ok.

ticket 751
This commit is contained in:
Rob Crittenden
2011-01-19 11:24:31 -05:00
committed by Simo Sorce
parent fd1d0857b5
commit 359d54e741
6 changed files with 20 additions and 8 deletions

View File

@@ -387,6 +387,7 @@ def main():
if ipautil.file_exists(config.dir + "/cacert.p12"):
fd.write("enable_ra=True\n")
fd.write("ra_plugin=dogtag\n")
fd.write("mode=production\n")
fd.close()
api.bootstrap(in_server=True)

View File

@@ -683,6 +683,7 @@ def main():
fd.write("enable_ra=True\n")
if not options.selfsign:
fd.write("ra_plugin=dogtag\n")
fd.write("mode=production\n")
fd.close()
api.bootstrap(**cfg)

View File

@@ -467,6 +467,9 @@ class Env(object):
else:
self.in_tree = False
if self.in_tree and 'mode' not in self:
self.mode = 'developer'
# Set dot_ipa:
if 'dot_ipa' not in self:
self.dot_ipa = self._join('home', '.ipa')

View File

@@ -351,9 +351,10 @@ class HasParam(Plugin):
self._filter_param_by_context(name, env),
sort=False
)
check = getattr(self, 'check_' + name, None)
if callable(check):
check(namespace)
if self.env.mode != 'production':
check = getattr(self, 'check_' + name, None)
if callable(check):
check(namespace)
setattr(self, name, namespace)

View File

@@ -207,6 +207,8 @@ class Plugin(ReadOnly):
def finalize(self):
"""
"""
if self.env.mode == 'production':
return
lock(self)
def set_api(self, api):
@@ -601,19 +603,22 @@ class API(DictProxy):
namespace = NameSpace(
plugin_iter(base, (magic[k] for k in magic))
)
assert not (
name in self.__d or hasattr(self, name)
)
if self.env.mode != 'production':
assert not (
name in self.__d or hasattr(self, name)
)
self.__d[name] = namespace
object.__setattr__(self, name, namespace)
for p in plugins.itervalues():
p.instance.set_api(self)
assert p.instance.api is self
if self.env.mode != 'production':
assert p.instance.api is self
for p in plugins.itervalues():
p.instance.finalize()
assert islocked(p.instance) is True
if self.env.mode != 'production':
assert islocked(p.instance) is True
object.__setattr__(self, '_API__finalized', True)
tuple(PluginInfo(p) for p in plugins.itervalues())
object.__setattr__(self, 'plugins',

View File

@@ -210,6 +210,7 @@ def main():
verbose=0,
validate_api=True,
enable_ra=True,
mode='developer',
)
api.bootstrap(**cfg)