-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Backport the psql indexer into v0.34.x (#6906)
This change backports the PostgreSQL indexing sink, addressing part of #6828. Development on the main branch has diverged substantially since the v0.34.x release. It includes package moves, breaking API and protobuf schema changes, and new APIs, all of which together have a large footprint on the mapping between the implementation at tip and the v0.34 release branch. To avoid the need to retrofit all of those improvements, this change works by injecting the new indexing sink into the existing (v0.34) indexing interfaces by delegation. This means the backport does _not_ pull in all the newer APIs for event handling, and thus has minimal impact on existing code written against the v0.34 package structure. This change includes the test for the `psql` implementation, and thus updates some Go module dependencies. Because it does not interact with any other types, however, I did not add any unit tests to other packages in this change. Related changes: * Update module dependencies for psql backport. * Update test data to be type-compatible with the old protobuf types. * Add config settings for the PostgreSQL indexer. * Clean up some linter settings. * Hook up the psql indexer in the node main. Co-authored-by: M. J. Fromberger <fromberger@interchain.io>
- Loading branch information
Showing
10 changed files
with
852 additions
and
923 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
package psql | ||
|
||
// This file adds code to the psql package that is needed for integration with | ||
// v0.34, but which is not part of the original implementation. | ||
// | ||
// In v0.35, ADR 65 was implemented in which the TxIndexer and BlockIndexer | ||
// interfaces were merged into a hybrid EventSink interface. The Backport* | ||
// types defined here bridge the psql EventSink (which was built in terms of | ||
// the v0.35 interface) to the old interfaces. | ||
// | ||
// We took this narrower approach to backporting to avoid pulling in a much | ||
// wider-reaching set of changes in v0.35 that would have broken several of the | ||
// v0.34.x APIs. The result is sufficient to work with the node plumbing as it | ||
// exists in the v0.34 branch. | ||
|
||
import ( | ||
"context" | ||
"errors" | ||
|
||
abci "github.com/line/ostracon/abci/types" | ||
"github.com/line/ostracon/libs/pubsub/query" | ||
"github.com/line/ostracon/state/txindex" | ||
"github.com/line/ostracon/types" | ||
) | ||
|
||
const ( | ||
eventTypeBeginBlock = "begin_block" | ||
eventTypeEndBlock = "end_block" | ||
) | ||
|
||
// TxIndexer returns a bridge from es to the Tendermint v0.34 transaction indexer. | ||
func (es *EventSink) TxIndexer() BackportTxIndexer { | ||
return BackportTxIndexer{psql: es} | ||
} | ||
|
||
// BackportTxIndexer implements the txindex.TxIndexer interface by delegating | ||
// indexing operations to an underlying PostgreSQL event sink. | ||
type BackportTxIndexer struct{ psql *EventSink } | ||
|
||
// AddBatch indexes a batch of transactions in Postgres, as part of TxIndexer. | ||
func (b BackportTxIndexer) AddBatch(batch *txindex.Batch) error { | ||
return b.psql.IndexTxEvents(batch.Ops) | ||
} | ||
|
||
// Index indexes a single transaction result in Postgres, as part of TxIndexer. | ||
func (b BackportTxIndexer) Index(txr *abci.TxResult) error { | ||
return b.psql.IndexTxEvents([]*abci.TxResult{txr}) | ||
} | ||
|
||
// Get is implemented to satisfy the TxIndexer interface, but is not supported | ||
// by the psql event sink and reports an error for all inputs. | ||
func (BackportTxIndexer) Get([]byte) (*abci.TxResult, error) { | ||
return nil, errors.New("the TxIndexer.Get method is not supported") | ||
} | ||
|
||
// Search is implemented to satisfy the TxIndexer interface, but it is not | ||
// supported by the psql event sink and reports an error for all inputs. | ||
func (BackportTxIndexer) Search(context.Context, *query.Query) ([]*abci.TxResult, error) { | ||
return nil, errors.New("the TxIndexer.Search method is not supported") | ||
} | ||
|
||
// BlockIndexer returns a bridge that implements the Tendermint v0.34 block | ||
// indexer interface, using the Postgres event sink as a backing store. | ||
func (es *EventSink) BlockIndexer() BackportBlockIndexer { | ||
return BackportBlockIndexer{psql: es} | ||
} | ||
|
||
// BackportBlockIndexer implements the indexer.BlockIndexer interface by | ||
// delegating indexing operations to an underlying PostgreSQL event sink. | ||
type BackportBlockIndexer struct{ psql *EventSink } | ||
|
||
// Has is implemented to satisfy the BlockIndexer interface, but it is not | ||
// supported by the psql event sink and reports an error for all inputs. | ||
func (BackportBlockIndexer) Has(height int64) (bool, error) { | ||
return false, errors.New("the BlockIndexer.Has method is not supported") | ||
} | ||
|
||
// Index indexes block begin and end events for the specified block. It is | ||
// part of the BlockIndexer interface. | ||
func (b BackportBlockIndexer) Index(block types.EventDataNewBlockHeader) error { | ||
return b.psql.IndexBlockEvents(block) | ||
} | ||
|
||
// Search is implemented to satisfy the BlockIndexer interface, but it is not | ||
// supported by the psql event sink and reports an error for all inputs. | ||
func (BackportBlockIndexer) Search(context.Context, *query.Query) ([]int64, error) { | ||
return nil, errors.New("the BlockIndexer.Search method is not supported") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package psql | ||
|
||
import ( | ||
"github.com/line/ostracon/state/indexer" | ||
"github.com/line/ostracon/state/txindex" | ||
) | ||
|
||
var ( | ||
_ indexer.BlockIndexer = BackportBlockIndexer{} | ||
_ txindex.TxIndexer = BackportTxIndexer{} | ||
) |
Oops, something went wrong.