Bläddra i källkod

Added "purge", which only leaves the part of the graph that are reachable from the root.

Yentl Van Tendeloo 9 år sedan
förälder
incheckning
3538af0f29
2 ändrade filer med 34 tillägg och 1 borttagningar
  1. 10 1
      hybrid_server/classes/mvkcontroller.xml
  2. 24 0
      state/modelverse_state/main.py

+ 10 - 1
hybrid_server/classes/mvkcontroller.xml

@@ -20,6 +20,7 @@
             self.output_queue = defaultdict(list)
             self.source = None
             self.port = int(sys.argv[1])
+            self.count = 0
 
             self.mvs_operations = {
                     "CN": self.mvs.create_node,
@@ -146,6 +147,7 @@
                                         # Blocking or broken, so quit already to stop wasting CPU
                                         break
 
+                                    # Could at least execute one instruction, so mark it as "not failed"
                                     self.all_failed = False
 
                                 # Check that we don't have anything to output yet, otherwise we wait
@@ -159,7 +161,12 @@
                                             self.all_failed = False
 
                             else:
-                                self.mvs.garbage_collect()
+                                if self.count >= 2000:
+                                    self.count = 0
+                                    self.mvs.purge()
+                                else:
+                                    self.count += 1
+                                    self.mvs.garbage_collect()
                                 out = self.mvs.read_outgoing(self.root)[0]
                                 for m in out:
                                     src, user = self.mvs.read_edge(m)[0]
@@ -171,6 +178,8 @@
                                         continue
                                     self.users.add(name)
                                 self.timeout = self.all_failed
+                                if self.timeout:
+                                    print("FAILED ALL")
                                 self.all_failed = True
                         </script>
                     </onentry>

+ 24 - 0
state/modelverse_state/main.py

@@ -378,3 +378,27 @@ class ModelverseState(object):
             t = self.to_delete.pop()
             if not self.incoming[t]:
                 self.delete_node(t)
+
+    def purge(self):
+        self.garbage_collect()
+        values = set(self.nodes) | set(self.edges)
+        visit_list = [self.root]
+        print("Purge!")
+
+        while visit_list:
+            elem = visit_list.pop()
+            if elem in values:
+                # Remove it from the leftover values
+                values.remove(elem)
+                if elem in self.edges:
+                    visit_list.extend(self.edges[elem])
+                visit_list.extend(self.outgoing[elem])
+                visit_list.extend(self.incoming[elem])
+
+        # All remaining elements are to be purged
+        if len(values) > 0:
+            print("Purging %s unreachable elements!" % len(values))
+            while values:
+                v = values.pop()
+                if v in self.nodes:
+                    self.delete_node(v)