[LNT] r349578 - Scaleability improvements: don't expire objects and use better query

Chris Matthews via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 18 15:39:26 PST 2018


Author: cmatthews
Date: Tue Dec 18 15:39:25 2018
New Revision: 349578

URL: http://llvm.org/viewvc/llvm-project?rev=349578&view=rev
Log:
Scaleability improvements: don't expire objects and use better query

When we commit we expire all objects in the session, meaning the will be
lazy loaded again next time they are accessed.  Move the commit of all
found regressions to the end of processing, so the caches stay valid for
the entire life of analysis.

Also, use FieldChange directly for analysis, instead of RegressionInd,
we were mostly only accessing the change field anyways.

Modified:
    lnt/trunk/lnt/server/db/fieldchange.py
    lnt/trunk/tests/server/ui/change_processing.py

Modified: lnt/trunk/lnt/server/db/fieldchange.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/lnt/server/db/fieldchange.py?rev=349578&r1=349577&r2=349578&view=diff
==============================================================================
--- lnt/trunk/lnt/server/db/fieldchange.py (original)
+++ lnt/trunk/lnt/server/db/fieldchange.py Tue Dec 18 15:39:25 2018
@@ -125,14 +125,15 @@ def regenerate_fieldchanges_for_run(sess
                               .filter(ts.FieldChange.field_id.in_(field_ids))
                               .all())
 
-    active_indicators = session.query(ts.RegressionIndicator) \
+    active_indicators = session.query(ts.FieldChange) \
+        .join(ts.RegressionIndicator) \
         .join(ts.Regression) \
         .filter(or_(ts.Regression.state == RegressionState.DETECTED,
                     ts.Regression.state == RegressionState.DETECTED_FIXED)) \
-        .options(joinedload(ts.RegressionIndicator.field_change)) \
-        .options(joinedload("field_change.start_order")) \
-        .options(joinedload("field_change.end_order")) \
-        .options(joinedload("field_change.test")) \
+        .options(joinedload(ts.FieldChange.start_order),
+                 joinedload(ts.FieldChange.end_order),
+                 joinedload(ts.FieldChange.test),
+                 joinedload(ts.FieldChange.machine)) \
         .all()
 
     for field in list(ts.Sample.get_metric_fields()):
@@ -233,25 +234,26 @@ def identify_related_changes(session, ts
     ranges. Then looks for changes that are similar.
 
     """
-    for change in active_indicators:
-        regression_change = change.field_change
 
-        if is_overlaping(regression_change, fc):
+    for change in active_indicators:
+        if is_overlaping(change, fc):
             confidence = 0.0
 
-            confidence += percent_similar(regression_change.machine.name,
+            confidence += percent_similar(change.machine.name,
                                           fc.machine.name)
-            confidence += percent_similar(regression_change.test.name,
+            confidence += percent_similar(change.test.name,
                                           fc.test.name)
 
-            if regression_change.field_id == fc.field_id:
+            if change.field_id == fc.field_id:
                 confidence += 1.0
 
             if confidence >= 2.0:
                 # Matching
                 MSG = "Found a match: {} with score {}."
                 regression = session.query(ts.Regression) \
-                    .get(change.regression_id)
+                    .join(ts.RegressionIndicator) \
+                    .filter(ts.RegressionIndicator.field_change_id == change.id) \
+                    .one()
                 logger.info(MSG.format(str(regression),
                                        confidence))
                 ri = ts.RegressionIndicator(regression, fc)
@@ -259,7 +261,6 @@ def identify_related_changes(session, ts
                 active_indicators.append(ri)
                 # Update the default title if needed.
                 rebuild_title(session, ts, regression)
-                session.commit()
                 return True, regression
     logger.info("Could not find a partner, creating new Regression for change")
     new_reg, new_indicators = new_regression(session, ts, [fc.id])

Modified: lnt/trunk/tests/server/ui/change_processing.py
URL: http://llvm.org/viewvc/llvm-project/lnt/trunk/tests/server/ui/change_processing.py?rev=349578&r1=349577&r2=349578&view=diff
==============================================================================
--- lnt/trunk/tests/server/ui/change_processing.py (original)
+++ lnt/trunk/tests/server/ui/change_processing.py Tue Dec 18 15:39:25 2018
@@ -138,14 +138,15 @@ class ChangeProcessingTests(unittest.Tes
         self.assertFalse(is_overlaping(self.field_change, self.field_change3),
                          "Should not be overlapping")
 
-        active_indicators = session.query(ts_db.RegressionIndicator) \
+        active_indicators = session.query(ts_db.FieldChange) \
+            .join(ts_db.RegressionIndicator) \
             .join(ts_db.Regression) \
             .filter(or_(ts_db.Regression.state == RegressionState.DETECTED,
                         ts_db.Regression.state == RegressionState.DETECTED_FIXED)) \
-            .options(joinedload(ts_db.RegressionIndicator.field_change)) \
-            .options(joinedload("field_change.start_order")) \
-            .options(joinedload("field_change.end_order")) \
-            .options(joinedload("field_change.test")) \
+            .options(joinedload(ts_db.FieldChange.start_order),
+                     joinedload(ts_db.FieldChange.end_order),
+                     joinedload(ts_db.FieldChange.test),
+                     joinedload(ts_db.FieldChange.machine)) \
             .all()
 
         # Check non-overlapping changes are always False.
@@ -164,14 +165,15 @@ class ChangeProcessingTests(unittest.Tes
                                           self.a_field.id)
         session.add(field_change7)
 
-        active_indicators = session.query(ts_db.RegressionIndicator) \
+        active_indicators = session.query(ts_db.FieldChange) \
+            .join(ts_db.RegressionIndicator) \
             .join(ts_db.Regression) \
             .filter(or_(ts_db.Regression.state == RegressionState.DETECTED,
                         ts_db.Regression.state == RegressionState.DETECTED_FIXED)) \
-            .options(joinedload(ts_db.RegressionIndicator.field_change)) \
-            .options(joinedload("field_change.start_order")) \
-            .options(joinedload("field_change.end_order")) \
-            .options(joinedload("field_change.test")) \
+            .options(joinedload(ts_db.FieldChange.start_order),
+                     joinedload(ts_db.FieldChange.end_order),
+                     joinedload(ts_db.FieldChange.test),
+                     joinedload(ts_db.FieldChange.machine)) \
             .all()
 
         ret, reg = identify_related_changes(session, ts_db, field_change7, active_indicators)




More information about the llvm-commits mailing list