Skip to content

Commit eebde06

Browse files
committed
handle close error
1 parent fdce574 commit eebde06

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

storage/operation/reads.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func TraverseByPrefix(r storage.Reader, prefix []byte, iterFunc IterationFunc, o
130130
// When this returned function is executed (and only then), it will write into the `keyExists` whether
131131
// the key exists.
132132
// No errors are expected during normal operation.
133-
func KeyExists(r storage.Reader, key []byte) (bool, error) {
133+
func KeyExists(r storage.Reader, key []byte) (exist bool, errExit error) {
134134
_, closer, err := r.Get(key)
135135
if err != nil {
136136
// the key does not exist in the database
@@ -140,7 +140,9 @@ func KeyExists(r storage.Reader, key []byte) (bool, error) {
140140
// exception while checking for the key
141141
return false, irrecoverable.NewExceptionf("could not load data: %w", err)
142142
}
143-
defer closer.Close()
143+
defer func() {
144+
errExit = closer.Close()
145+
}()
144146

145147
// the key does exist in the database
146148
return true, nil
@@ -153,13 +155,15 @@ func KeyExists(r storage.Reader, key []byte) (bool, error) {
153155
// - storage.ErrNotFound if the key does not exist in the database
154156
// - generic error in case of unexpected failure from the database layer, or failure
155157
// to decode an existing database value
156-
func RetrieveByKey(r storage.Reader, key []byte, entity interface{}) error {
158+
func RetrieveByKey(r storage.Reader, key []byte, entity interface{}) (errExit error) {
157159
val, closer, err := r.Get(key)
158160
if err != nil {
159161
return err
160162
}
161163

162-
defer closer.Close()
164+
defer func() {
165+
errExit = closer.Close()
166+
}()
163167

164168
err = msgpack.Unmarshal(val, entity)
165169
if err != nil {
@@ -172,7 +176,7 @@ func RetrieveByKey(r storage.Reader, key []byte, entity interface{}) error {
172176
// keys with the format prefix` + `height` (where "+" denotes concatenation of binary strings). The height
173177
// is encoded as Big-Endian (entries with numerically smaller height have lexicographically smaller key).
174178
// The function finds the *highest* key with the given prefix and height equal to or below the given height.
175-
func FindHighestAtOrBelowByPrefix(r storage.Reader, prefix []byte, height uint64, entity interface{}) error {
179+
func FindHighestAtOrBelowByPrefix(r storage.Reader, prefix []byte, height uint64, entity interface{}) (errExit error) {
176180
if len(prefix) == 0 {
177181
return fmt.Errorf("prefix must not be empty")
178182
}
@@ -182,7 +186,9 @@ func FindHighestAtOrBelowByPrefix(r storage.Reader, prefix []byte, height uint64
182186
if err != nil {
183187
return fmt.Errorf("can not create iterator: %w", err)
184188
}
185-
defer it.Close()
189+
defer func() {
190+
errExit = it.Close()
191+
}()
186192

187193
var highestKey []byte
188194

@@ -203,7 +209,9 @@ func FindHighestAtOrBelowByPrefix(r storage.Reader, prefix []byte, height uint64
203209
return err
204210
}
205211

206-
defer closer.Close()
212+
defer func() {
213+
errExit = closer.Close()
214+
}()
207215

208216
err = msgpack.Unmarshal(val, entity)
209217
if err != nil {

0 commit comments

Comments
 (0)