forked from cerc-io/ipld-eth-server
fix for issue #146; mark header checked for contract if it doesnt have
any logs at that header but other contracts do; test
This commit is contained in:
@@ -20,7 +20,6 @@ import (
|
||||
"fmt"
|
||||
|
||||
"github.com/hashicorp/golang-lru"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/vulcanize/vulcanizedb/pkg/core"
|
||||
@@ -268,12 +267,3 @@ func continuousHeaders(headers []core.Header) []core.Header {
|
||||
func (r *headerRepository) CheckCache(key string) (interface{}, bool) {
|
||||
return r.columns.Get(key)
|
||||
}
|
||||
|
||||
// Used to mark a header checked as part of some external transaction so as to group into one commit
|
||||
func (r *headerRepository) MarkHeaderCheckedInTransaction(headerID int64, tx *sqlx.Tx, eventID string) error {
|
||||
_, err := tx.Exec(`INSERT INTO public.checked_headers (header_id, `+eventID+`)
|
||||
VALUES ($1, $2)
|
||||
ON CONFLICT (header_id) DO
|
||||
UPDATE SET `+eventID+` = checked_headers.`+eventID+` + 1`, headerID, 1)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -249,6 +249,11 @@ func (tr *Transformer) Execute() error {
|
||||
}
|
||||
|
||||
// Sort logs by the contract they belong to
|
||||
// Start by adding every contract addr to the map
|
||||
// So that if we don't have any logs for it, it is caught and the header is still marked checked for its events
|
||||
for _, addr := range tr.contractAddresses {
|
||||
sortedLogs[addr] = nil
|
||||
}
|
||||
for _, log := range allLogs {
|
||||
addr := strings.ToLower(log.Address.Hex())
|
||||
sortedLogs[addr] = append(sortedLogs[addr], log)
|
||||
@@ -256,12 +261,20 @@ func (tr *Transformer) Execute() error {
|
||||
|
||||
// Process logs for each contract
|
||||
for conAddr, logs := range sortedLogs {
|
||||
if logs == nil {
|
||||
con := tr.Contracts[conAddr]
|
||||
if len(logs) < 1 {
|
||||
eventIds := make([]string, 0)
|
||||
for eventName := range con.Events {
|
||||
eventIds = append(eventIds, strings.ToLower(eventName+"_"+con.Address))
|
||||
}
|
||||
markCheckedErr := tr.HeaderRepository.MarkHeaderCheckedForAll(header.Id, eventIds)
|
||||
if markCheckedErr != nil {
|
||||
return fmt.Errorf("error marking header checked: %s", markCheckedErr.Error())
|
||||
}
|
||||
logrus.Tracef("no logs found for contract %s at block %d, continuing", conAddr, header.BlockNumber)
|
||||
continue
|
||||
}
|
||||
// Configure converter with this contract
|
||||
con := tr.Contracts[conAddr]
|
||||
tr.Converter.Update(con)
|
||||
|
||||
// Convert logs into batches of log mappings (eventName => []types.Logs
|
||||
|
||||
@@ -294,8 +294,7 @@ func TearDown(db *postgres.DB) {
|
||||
|
||||
_, err = tx.Exec(`CREATE TABLE checked_headers (
|
||||
id SERIAL PRIMARY KEY,
|
||||
header_id INTEGER UNIQUE NOT NULL REFERENCES headers (id) ON DELETE CASCADE,
|
||||
check_count INTEGER NOT NULL DEFAULT 1);`)
|
||||
header_id INTEGER UNIQUE NOT NULL REFERENCES headers (id) ON DELETE CASCADE);`)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
|
||||
_, err = tx.Exec(`DROP SCHEMA IF EXISTS full_0x8dd5fbce2f6a956c3022ba3663759011dd51e73e CASCADE`)
|
||||
|
||||
Reference in New Issue
Block a user