@@ -2139,6 +2139,38 @@ def _update_backward_extremeties(self, txn, events):
21392139
21402140        Forward extremities are handled when we first start persisting the events. 
21412141        """ 
2142+         logger .info (
2143+             "_update_backward_extremeties events=%s" ,
2144+             [
2145+                 {
2146+                     "event_id" : ev .event_id ,
2147+                     "prev_events" : ev .prev_event_ids (),
2148+                     "outlier" : ev .internal_metadata .is_outlier (),
2149+                 }
2150+                 for  ev  in  events 
2151+             ],
2152+         )
2153+ 
2154+         for  ev  in  events :
2155+             for  e_id  in  ev .prev_event_ids ():
2156+                 query  =  """ 
2157+                         SELECT 1 FROM event_edges 
2158+                         INNER JOIN events AS e USING (event_id, room_id) 
2159+                         WHERE event_id = ? AND room_id = ? AND e.outlier = TRUE 
2160+                 """ 
2161+ 
2162+                 txn .execute (
2163+                     query ,
2164+                     (e_id , ev .room_id ),
2165+                 )
2166+                 result  =  txn .fetchall ()
2167+                 logger .info (
2168+                     "_update_backward_extremeties test ev=%s prev_event_id=%s result=%s" ,
2169+                     ev .event_id ,
2170+                     e_id ,
2171+                     result ,
2172+                 )
2173+ 
21422174        # From the events passed in, add all of the prev events as backwards extremities. 
21432175        # Ignore any events that are already backwards extrems or outliers. 
21442176        query  =  (
@@ -2147,22 +2179,45 @@ def _update_backward_extremeties(self, txn, events):
21472179            "   SELECT 1 FROM event_backward_extremities" 
21482180            "   WHERE event_id = ? AND room_id = ?" 
21492181            " )" 
2182+             # 1. Don't add an event as a extremity again if we already persisted it 
2183+             # as a non-outlier. 
2184+             # 2. Don't add an outlier as an extremity if it has no prev_events 
21502185            " AND NOT EXISTS (" 
2151-             "   SELECT 1 FROM events WHERE event_id = ? AND room_id = ? " 
2152-             "   AND outlier = ?" 
2186+             "   SELECT 1 FROM events" 
2187+             "   LEFT JOIN event_edges edge" 
2188+             "   ON edge.event_id = events.event_id" 
2189+             "   WHERE events.event_id = ? AND events.room_id = ? AND (events.outlier = FALSE OR edge.event_id IS NULL)" 
21532190            " )" 
21542191        )
21552192
21562193        txn .execute_batch (
21572194            query ,
21582195            [
2159-                 (e_id , ev .room_id , e_id , ev .room_id , e_id , ev .room_id ,  False )
2196+                 (e_id , ev .room_id , e_id , ev .room_id , e_id , ev .room_id )
21602197                for  ev  in  events 
21612198                for  e_id  in  ev .prev_event_ids ()
21622199                if  not  ev .internal_metadata .is_outlier ()
21632200            ],
21642201        )
21652202
2203+         for  ev  in  events :
2204+             for  e_id  in  ev .prev_event_ids ():
2205+                 query  =  """ 
2206+                         SELECT * FROM event_backward_extremities 
2207+                         WHERE event_id = ? AND room_id = ? 
2208+                 """ 
2209+ 
2210+                 txn .execute (
2211+                     query ,
2212+                     (e_id , ev .room_id ),
2213+                 )
2214+                 result  =  txn .fetchall ()
2215+                 logger .info (
2216+                     "_update_backward_extremeties ended up as prev_event_id=%s result=%s" ,
2217+                     e_id ,
2218+                     result ,
2219+                 )
2220+ 
21662221        # Delete all these events that we've already fetched and now know that their 
21672222        # prev events are the new backwards extremeties. 
21682223        query  =  (
@@ -2175,6 +2230,10 @@ def _update_backward_extremeties(self, txn, events):
21752230                (ev .event_id , ev .room_id )
21762231                for  ev  in  events 
21772232                if  not  ev .internal_metadata .is_outlier ()
2233+                 # If we encountered an event with no prev_events, then we might 
2234+                 # as well remove it now because it won't ever have anything else 
2235+                 # to backfill from. 
2236+                 or  len (ev .prev_event_ids ()) ==  0 
21782237            ],
21792238        )
21802239
0 commit comments