You've got a spare 'put's in there, but otherwise, +1.

Do you think this might be just the wrong way of doing this matching overall? My instincts around graphs seem to be particularly horrible, so there's probably a much better way to do this.

On Mar 17, 2010, at 12:14 PM, Brice Figureau wrote:

With recursive file resources, many change events can be generated.
The method used to find the good ones is pretty inefficient allocating
arrays and/or appending to arrays which is a slow operation.

This patch rewrite the code to never append or allocate an array if
there is no matching edge, or to limit those operations to their strict
minimum needed in the other cases.

Results for matching 1100 events:
* old code: 22s
* new code:  4s

This patch also helps on the memory consumption side since the GC has
almost no work to perform.

Signed-off-by: Brice Figureau <[email protected]>
---
lib/puppet/simple_graph.rb |   20 ++++++++++++++++----
lib/puppet/transaction.rb  |   18 ++++++++++--------
2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/lib/puppet/simple_graph.rb b/lib/puppet/simple_graph.rb
index 5e8f5cd..591c75d 100644
--- a/lib/puppet/simple_graph.rb
+++ b/lib/puppet/simple_graph.rb
@@ -64,6 +64,14 @@ class Puppet::SimpleGraph
            end
        end

+        def each_out_edges
+            @adjacencies[:out].values.each do |edges|
+                edges.each do |edge|
+                    yield edge
+                end
+            end
+        end
+
        # The other vertex in the edge.
        def other_vertex(direction, edge)
            case direction
@@ -146,7 +154,7 @@ class Puppet::SimpleGraph
    # Collect all of the edges that the passed events match.  Returns
    # an array of edges.
    def matching_edges(events, base = nil)
-        events.collect do |event|
+        events.inject([]) do |matching,event|
            source = base || event.source

            unless vertex?(source)
@@ -156,10 +164,14 @@ class Puppet::SimpleGraph
# Get all of the edges that this vertex should forward events # to, which is the same thing as saying all edges directly below
            # This vertex in the graph.
- adjacent(source, :direction => :out, :type => :edges).find_all do |edge|
-                edge.match?(event.name)
+
+            if wrapper = @vertices[source]
+                wrapper.each_out_edges do |edge|
+                    matching << edge if edge.match?(event.name)
+                end
            end
-        end.compact.flatten
+            matching
+        end
    end

    # Return a reversed version of this graph.
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index e132b72..3d8e38e 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -215,15 +215,17 @@ class Transaction
# Collect the targets of any subscriptions to those events. We pass # the parent resource in so it will override the source in the events, # since eval_generated children can't have direct relationships. - relationship_graph.matching_edges(events, resource).each do |orig_edge| - # We have to dup the label here, else we modify the original edge label, - # which affects whether a given event will match on the next run, which is,
-            # of course, bad.
- edge = orig_edge.class.new(orig_edge.source, orig_edge.target, orig_edge.label)
-            edge.event = events.collect { |e| e.name }
-            set_trigger(edge)
+ Puppet::Util.benchmark(:debug, "Time for triggering events to edges") do + relationship_graph.matching_edges(events, resource).each do |orig_edge| + # We have to dup the label here, else we modify the original edge label, + # which affects whether a given event will match on the next run, which is,
+                # of course, bad.
+ puts "new edge: #{orig_edge.target} <- #{orig_edge.source} #{orig_edge.label}" + edge = orig_edge.class.new(orig_edge.source, orig_edge.target, orig_edge.label)
+                edge.event = events.collect { |e| e.name }
+                set_trigger(edge)
+            end
        end
-
        # And return the events for collection
        events
    end
--
1.6.6.1

--
You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected] . For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en .



--
Man is the only animal that can remain on friendly terms with the
victims he intends to eat until he eats them.
    -- Samuel Butler (1835-1902)
---------------------------------------------------------------------
Luke Kanies  -|-   http://reductivelabs.com   -|-   +1(615)594-8199

--
You received this message because you are subscribed to the Google Groups "Puppet 
Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to