forked from cerc-io/ipld-eth-server
(VDB-570) Handle duplicate storage diffs
- If processing a new diff for a row that already exists in the DB, ignore the error without logging or queueing - If processing a queued diff for a row that already exists, remove it from the queue
This commit is contained in:
parent
782e3fd095
commit
36c4da372b
@ -17,9 +17,12 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var ErrRowExists = errors.New("parsed row for storage diff already exists")
|
||||
|
||||
type ErrContractNotFound struct {
|
||||
Contract string
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ func (storageWatcher StorageWatcher) processRow(row utils.StorageDiffRow) {
|
||||
return
|
||||
}
|
||||
executeErr := storageTransformer.Execute(row)
|
||||
if executeErr != nil {
|
||||
if executeErr != nil && executeErr != utils.ErrRowExists {
|
||||
logrus.Warn(fmt.Sprintf("error executing storage transformer: %s", executeErr))
|
||||
queueErr := storageWatcher.Queue.Add(row)
|
||||
if queueErr != nil {
|
||||
@ -100,7 +100,7 @@ func (storageWatcher StorageWatcher) processQueue() {
|
||||
continue
|
||||
}
|
||||
executeErr := storageTransformer.Execute(row)
|
||||
if executeErr == nil {
|
||||
if executeErr == nil || executeErr == utils.ErrRowExists {
|
||||
storageWatcher.deleteRow(row.Id)
|
||||
}
|
||||
}
|
||||
|
@ -109,6 +109,18 @@ var _ = Describe("Storage Watcher", func() {
|
||||
close(done)
|
||||
})
|
||||
|
||||
It("does not queue row if transformer execution fails because row already exists", func(done Done) {
|
||||
mockTransformer.ExecuteErr = utils.ErrRowExists
|
||||
|
||||
go storageWatcher.Execute(rows, errs, time.Hour)
|
||||
|
||||
Expect(<-errs).To(BeNil())
|
||||
Consistently(func() bool {
|
||||
return mockQueue.AddCalled
|
||||
}).Should(BeFalse())
|
||||
close(done)
|
||||
})
|
||||
|
||||
It("queues row for later processing if transformer execution fails", func(done Done) {
|
||||
mockTransformer.ExecuteErr = fakes.FakeError
|
||||
|
||||
@ -187,6 +199,17 @@ var _ = Describe("Storage Watcher", func() {
|
||||
close(done)
|
||||
})
|
||||
|
||||
It("deletes row from queue if transformer execution errors because row already exists", func(done Done) {
|
||||
mockTransformer.ExecuteErr = utils.ErrRowExists
|
||||
|
||||
go storageWatcher.Execute(rows, errs, time.Nanosecond)
|
||||
|
||||
Eventually(func() int {
|
||||
return mockQueue.DeletePassedId
|
||||
}).Should(Equal(row.Id))
|
||||
close(done)
|
||||
})
|
||||
|
||||
It("logs error if deleting persisted row fails", func(done Done) {
|
||||
mockQueue.DeleteErr = fakes.FakeError
|
||||
tempFile, fileErr := ioutil.TempFile("", "log")
|
||||
|
Loading…
Reference in New Issue
Block a user