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