@@ -41,7 +41,7 @@ func (repository HeaderRepository) CreateOrUpdateHeader(header core.Header) (int
41
41
hash , err := repository .getHeaderHash (header )
42
42
if err != nil {
43
43
if headerDoesNotExist (err ) {
44
- return repository .insertHeader (header )
44
+ return repository .InternalInsertHeader (header )
45
45
}
46
46
log .Error ("CreateOrUpdateHeader: error getting header hash: " , err )
47
47
return 0 , err
@@ -128,13 +128,21 @@ func (repository HeaderRepository) getHeaderHash(header core.Header) (string, er
128
128
return hash , err
129
129
}
130
130
131
- func (repository HeaderRepository ) insertHeader (header core.Header ) (int64 , error ) {
131
+ // Function is public so we can test insert being called for the same header
132
+ // Can happen when concurrent processes are inserting headers
133
+ // Otherwise should not occur since only called in CreateOrUpdateHeader
134
+ func (repository HeaderRepository ) InternalInsertHeader (header core.Header ) (int64 , error ) {
132
135
var headerId int64
133
- err := repository .database .QueryRowx (
134
- `INSERT INTO public.headers (block_number, hash, block_timestamp, raw, eth_node_id, eth_node_fingerprint) VALUES ($1, $2, $3::NUMERIC, $4, $5, $6) RETURNING id` ,
135
- header .BlockNumber , header .Hash , header .Timestamp , header .Raw , repository .database .NodeID , repository .database .Node .ID ).Scan (& headerId )
136
+ row := repository .database .QueryRowx (
137
+ `INSERT INTO public.headers (block_number, hash, block_timestamp, raw, eth_node_id, eth_node_fingerprint)
138
+ VALUES ($1, $2, $3::NUMERIC, $4, $5, $6) ON CONFLICT DO NOTHING RETURNING id` ,
139
+ header .BlockNumber , header .Hash , header .Timestamp , header .Raw , repository .database .NodeID , repository .database .Node .ID )
140
+ err := row .Scan (& headerId )
136
141
if err != nil {
137
- log .Error ("insertHeader: error inserting header: " , err )
142
+ if err == sql .ErrNoRows {
143
+ return 0 , ErrValidHeaderExists
144
+ }
145
+ log .Error ("InternalInsertHeader: error inserting header: " , err )
138
146
}
139
147
return headerId , err
140
148
}
@@ -146,5 +154,5 @@ func (repository HeaderRepository) replaceHeader(header core.Header) (int64, err
146
154
log .Error ("replaceHeader: error deleting headers: " , err )
147
155
return 0 , err
148
156
}
149
- return repository .insertHeader (header )
157
+ return repository .InternalInsertHeader (header )
150
158
}
0 commit comments