Add bulk ensure_atoms method to storage

The addition of this method will make it possible
to optimize the many queries and updates that are performed
when a engine is initially having its storage unit prepared.

Part of blueprint make-things-speedy

Change-Id: Ie812abfbeca97372be05bc13e5c1059278fbbf4c
This commit is contained in:
Joshua Harlow
2015-06-11 16:10:05 -07:00
parent 9604703c59
commit b7bb295fb0
2 changed files with 15 additions and 4 deletions

View File

@@ -215,8 +215,9 @@ class ActionEngine(base.Engine):
"""Ensure all contained atoms exist in the storage unit."""
transient = strutils.bool_from_string(
self._options.get('inject_transient', True))
self.storage.ensure_atoms(
self._compilation.execution_graph.nodes_iter())
for node in self._compilation.execution_graph.nodes_iter():
self.storage.ensure_atom(node)
if node.inject:
self.storage.inject_atom_args(node.name,
node.inject,

View File

@@ -186,10 +186,20 @@ class Storage(object):
with contextlib.closing(self._backend.get_connection()) as conn:
return functor(conn, *args, **kwargs)
def ensure_atom(self, atom):
"""Ensure that there is an atomdetail in storage for the given atom.
def ensure_atoms(self, atoms_iter):
"""Ensure there is an atomdetail for **each** of the given atoms.
Returns uuid for the atomdetail that is/was created.
Returns list of atomdetail uuids for each atom processed.
"""
atom_ids = []
for atom in atoms_iter:
atom_ids.append(self.ensure_atom(atom))
return atom_ids
def ensure_atom(self, atom):
"""Ensure there is an atomdetail for the **given** atom.
Returns the uuid for the atomdetail that corresponds to the given atom.
"""
match = misc.match_type(atom, self._ensure_matchers)
if not match: