@@ -1905,6 +1905,7 @@ impl MutTxnT for MutTxn<()> {
1905
1905
}
1906
1906
1907
1907
fn drop_channel ( & mut self , name0 : & str ) -> Result < bool , Self :: GraphError > {
1908
+ debug ! ( target: "drop_channel" , "drop channel {:?}" , name0) ;
1908
1909
let name = SmallString :: from_str ( name0) ;
1909
1910
let channel = if let Some ( channel) = self . open_channels . lock ( ) . remove ( & name) {
1910
1911
let channel = Arc :: try_unwrap ( channel. r )
@@ -1939,25 +1940,42 @@ impl MutTxnT for MutTxn<()> {
1939
1940
let mut unused_changes = Vec :: new ( ) ;
1940
1941
' outer: for x in btree:: rev_iter ( & self . txn , & c, None ) ? {
1941
1942
let ( _, p) = x?;
1942
- for chan in self . iter_channels ( "" ) . map_err ( |e| e. 0 ) ? {
1943
- let ( name, chan) = chan. map_err ( |e| e. 0 ) ?;
1943
+ debug ! ( target: "drop_channel" , "testing unused change: {:?}" , p) ;
1944
+ let mut it0 = self . iter_channels ( "" ) . map_err ( |e| e. 0 ) ?;
1945
+ let it1 = self . open_channels . lock ( ) ;
1946
+ let mut it1 = it1. iter ( ) ;
1947
+ loop {
1948
+ let ( name, chan) = if let Some ( chan) = it0. next ( ) {
1949
+ chan. map_err ( |e| e. 0 ) ?
1950
+ } else if let Some ( ( name, chan) ) = it1. next ( ) {
1951
+ ( name. as_ref ( ) , chan. clone ( ) )
1952
+ } else {
1953
+ break
1954
+ } ;
1955
+ debug ! ( target: "drop_channel" , "channel: {:?}" , name) ;
1944
1956
assert_ne ! ( name. as_str( ) , name0) ;
1945
1957
let chan = chan. read ( ) ;
1946
1958
if self
1947
1959
. channel_has_state ( & chan. states , & p. b )
1948
1960
. map_err ( |e| e. 0 ) ?
1949
1961
. is_some ( )
1950
1962
{
1963
+ // This other channel is in the same state as
1964
+ // our dropped channel is, so all subsequent
1965
+ // patches are in use.
1951
1966
break ' outer;
1952
1967
}
1953
1968
if self
1954
1969
. get_changeset ( & chan. changes , & p. a )
1955
1970
. map_err ( |e| e. 0 ) ?
1956
1971
. is_some ( )
1957
1972
{
1973
+ // This channel has a patch, move on.
1958
1974
continue ' outer;
1959
1975
}
1960
1976
}
1977
+
1978
+ debug ! ( target: "drop_channel" , "actually unused: {:?}" , p) ;
1961
1979
unused_changes. push ( p. a ) ;
1962
1980
}
1963
1981
let mut deps = Vec :: new ( ) ;
@@ -1970,7 +1988,8 @@ impl MutTxnT for MutTxn<()> {
1970
1988
deps. push ( ( * k, * v) ) ;
1971
1989
}
1972
1990
for ( k, v) in deps. drain ( ..) {
1973
- btree:: del ( & mut self . txn , & mut self . revdep , & k, Some ( & v) ) ?;
1991
+ debug ! ( target: "drop_channel" , "deleting from revdep: {:?} {:?}" , k, v) ;
1992
+ btree:: del ( & mut self . txn , & mut self . dep , & k, Some ( & v) ) ?;
1974
1993
btree:: del ( & mut self . txn , & mut self . revdep , & v, Some ( & k) ) ?;
1975
1994
}
1976
1995
}
0 commit comments