@@ -2106,7 +2106,7 @@ type ChannelEdge struct {
2106
2106
// ChanUpdatesInHorizon returns all the known channel edges which have at least
2107
2107
// one edge that has an update timestamp within the specified horizon.
2108
2108
func (c * ChannelGraph ) ChanUpdatesInHorizon (startTime ,
2109
- endTime time.Time ) ([]ChannelEdge , error ) {
2109
+ endTime time.Time , startBlock , endBlock uint32 ) ([]ChannelEdge , error ) {
2110
2110
2111
2111
// To ensure we don't return duplicate ChannelEdges, we'll use an
2112
2112
// additional map to keep track of the edges already seen to prevent
@@ -2115,50 +2115,29 @@ func (c *ChannelGraph) ChanUpdatesInHorizon(startTime,
2115
2115
var edgesToCache map [uint64 ]ChannelEdge
2116
2116
var edgesInHorizon []ChannelEdge
2117
2117
2118
- c .cacheMu .Lock ()
2119
- defer c .cacheMu .Unlock ()
2120
-
2121
2118
var hits int
2122
- err := kvdb .View (c .db , func (tx kvdb.RTx ) error {
2123
- edges := tx .ReadBucket (edgeBucket )
2124
- if edges == nil {
2125
- return ErrGraphNoEdgesFound
2126
- }
2127
- edgeIndex := edges .NestedReadBucket (edgeIndexBucket )
2128
- if edgeIndex == nil {
2129
- return ErrGraphNoEdgesFound
2130
- }
2131
- edgeUpdateIndex := edges .NestedReadBucket (edgeUpdateIndexBucket )
2119
+ fetchUpdates := func (tx kvdb.RTx , edges , edgeIndex , nodes kvdb.RBucket ,
2120
+ updateIndexBkt []byte , startBytes , endBytes []byte ,
2121
+ chanIDFromKey func ([]byte ) []byte ) error {
2122
+
2123
+ edgeUpdateIndex := edges .NestedReadBucket (updateIndexBkt )
2132
2124
if edgeUpdateIndex == nil {
2133
2125
return ErrGraphNoEdgesFound
2134
2126
}
2135
2127
2136
- nodes := tx .ReadBucket (nodeBucket )
2137
- if nodes == nil {
2138
- return ErrGraphNodesNotFound
2139
- }
2140
-
2141
2128
// We'll now obtain a cursor to perform a range query within
2142
2129
// the index to find all channels within the horizon.
2143
2130
updateCursor := edgeUpdateIndex .ReadCursor ()
2144
2131
2145
- var startTimeBytes , endTimeBytes [8 + 8 ]byte
2146
- byteOrder .PutUint64 (
2147
- startTimeBytes [:8 ], uint64 (startTime .Unix ()),
2148
- )
2149
- byteOrder .PutUint64 (
2150
- endTimeBytes [:8 ], uint64 (endTime .Unix ()),
2151
- )
2152
-
2153
2132
// With our start and end times constructed, we'll step through
2154
2133
// the index collecting the info and policy of each update of
2155
2134
// each channel that has a last update within the time range.
2156
- for indexKey , _ := updateCursor .Seek (startTimeBytes [:]); indexKey != nil &&
2157
- bytes .Compare (indexKey , endTimeBytes [:]) <= 0 ; indexKey , _ = updateCursor .Next () {
2135
+ for indexKey , _ := updateCursor .Seek (startBytes [:]); indexKey != nil &&
2136
+ bytes .Compare (indexKey , endBytes [:]) <= 0 ; indexKey , _ = updateCursor .Next () {
2158
2137
2159
2138
// We have a new eligible entry, so we'll slice of the
2160
2139
// chan ID so we can query it in the DB.
2161
- chanID := indexKey [ 8 :]
2140
+ chanID := chanIDFromKey ( indexKey )
2162
2141
2163
2142
// If we've already retrieved the info and policies for
2164
2143
// this edge, then we can skip it as we don't need to do
@@ -2196,16 +2175,15 @@ func (c *ChannelGraph) ChanUpdatesInHorizon(startTime,
2196
2175
err )
2197
2176
}
2198
2177
2199
- var (
2200
- node1Bytes = edgeInfo .Node1Bytes ()
2201
- node2Bytes = edgeInfo .Node2Bytes ()
2202
- )
2178
+ node1Bytes := edgeInfo .Node1Bytes ()
2203
2179
2204
2180
node1 , err := fetchLightningNode (nodes , node1Bytes [:])
2205
2181
if err != nil {
2206
2182
return err
2207
2183
}
2208
2184
2185
+ node2Bytes := edgeInfo .Node2Bytes ()
2186
+
2209
2187
node2 , err := fetchLightningNode (nodes , node2Bytes [:])
2210
2188
if err != nil {
2211
2189
return err
@@ -2226,6 +2204,67 @@ func (c *ChannelGraph) ChanUpdatesInHorizon(startTime,
2226
2204
}
2227
2205
2228
2206
return nil
2207
+ }
2208
+
2209
+ c .cacheMu .Lock ()
2210
+ defer c .cacheMu .Unlock ()
2211
+
2212
+ err := kvdb .View (c .db , func (tx kvdb.RTx ) error {
2213
+ edges := tx .ReadBucket (edgeBucket )
2214
+ if edges == nil {
2215
+ return ErrGraphNoEdgesFound
2216
+ }
2217
+ edgeIndex := edges .NestedReadBucket (edgeIndexBucket )
2218
+ if edgeIndex == nil {
2219
+ return ErrGraphNoEdgesFound
2220
+ }
2221
+
2222
+ nodes := tx .ReadBucket (nodeBucket )
2223
+ if nodes == nil {
2224
+ return ErrGraphNodesNotFound
2225
+ }
2226
+
2227
+ var startTimeBytes , endTimeBytes [8 + 8 ]byte
2228
+ byteOrder .PutUint64 (
2229
+ startTimeBytes [:8 ], uint64 (startTime .Unix ()),
2230
+ )
2231
+ byteOrder .PutUint64 (
2232
+ endTimeBytes [:8 ], uint64 (endTime .Unix ()),
2233
+ )
2234
+
2235
+ var noEdgesFound bool
2236
+ err := fetchUpdates (
2237
+ tx , edges , edgeIndex , nodes , edgeUpdateIndexBucket ,
2238
+ startTimeBytes [:], endTimeBytes [:],
2239
+ func (key []byte ) []byte {
2240
+ return key [8 :]
2241
+ },
2242
+ )
2243
+ if errors .Is (err , ErrGraphNoEdgesFound ) {
2244
+ noEdgesFound = true
2245
+ } else if err != nil {
2246
+ return err
2247
+ }
2248
+
2249
+ var startBlockBytes , endBlockBytes [4 + 8 ]byte
2250
+ byteOrder .PutUint32 (startTimeBytes [:4 ], startBlock )
2251
+ byteOrder .PutUint32 (endTimeBytes [:4 ], endBlock )
2252
+
2253
+ err = fetchUpdates (
2254
+ tx , edges , edgeIndex , nodes , edgeUpdate2IndexBucket ,
2255
+ startBlockBytes [:], endBlockBytes [:],
2256
+ func (key []byte ) []byte {
2257
+ return key [4 :]
2258
+ },
2259
+ )
2260
+ if errors .Is (err , ErrGraphNoEdgesFound ) && noEdgesFound {
2261
+ return err
2262
+ } else if err != nil {
2263
+ return err
2264
+ }
2265
+
2266
+ return nil
2267
+
2229
2268
}, func () {
2230
2269
edgesSeen = make (map [uint64 ]struct {})
2231
2270
edgesToCache = make (map [uint64 ]ChannelEdge )
0 commit comments