Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor daemon, add more tests #1039

Merged

Conversation

Eric-Warehime
Copy link
Contributor

Summary

First in a series which aims to clean up our commands into something more testable and adds coverage.

  • Removed the makeOptions call in api_config.go because it was only being used for a single argument, and I've refactored it to take a config.
  • Moved the variables in daemon.go to a struct, daemonConfig
  • Added create functions for daemonConfig, and daemonCmd
  • Moved the bulk of the daemon logic into its own function, runDaemon. In the future we can separate this out further into more modular testable pieces, for now I've left it as one giant runner.
  • I've begun the process of removing panic and os.Exit calls from this except in the base cobra command. By only passing errors around it becomes more easily testable, we don't have to worry about defer funcs not running which is the reason we have the panic logic, and we are still able to properly exit non-zero when the error reaches the command's Run function.
  • makeOptions has been refactored to convert between a daemonConfig and api.ExtraOptions.
  • Added BindFlagSet which is a copy of BindFlags since it makes sense to pass the FlagSet around instead of the command, but I'm not yet able to fully convert the existing function without more changes.

Test Plan

Added various tests to get started on testing--mostly for config variables/params for now. It shows how the new setup can be used to simplify tests and validate specific scenarios.

Copy link
Contributor

@winder winder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a great start. RIP globals.

config/config.go Show resolved Hide resolved
cmd/algorand-indexer/daemon.go Outdated Show resolved Hide resolved
@codecov
Copy link

codecov bot commented Jun 16, 2022

Codecov Report

❗ No coverage uploaded for pull request base (localledger/integration@997719a). Click here to learn what that means.
The diff coverage is n/a.

@@                    Coverage Diff                     @@
##             localledger/integration    #1039   +/-   ##
==========================================================
  Coverage                           ?   60.02%           
==========================================================
  Files                              ?       49           
  Lines                              ?     8731           
  Branches                           ?        0           
==========================================================
  Hits                               ?     5241           
  Misses                             ?     3004           
  Partials                           ?      486           

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 997719a...9580434. Read the comment docs.

@Eric-Warehime Eric-Warehime marked this pull request as ready for review June 16, 2022 19:27
@Eric-Warehime
Copy link
Contributor Author

@winder @AlgoStephenAkiki @shiqizng Should be ready for another round of reviews whenever you all have a chance. :D

Copy link
Contributor

@winder winder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a few suggestions. Overall this is really great.

cmd/algorand-indexer/daemon.go Outdated Show resolved Hide resolved
cmd/algorand-indexer/daemon.go Outdated Show resolved Hide resolved
cmd/algorand-indexer/daemon.go Outdated Show resolved Hide resolved
cmd/algorand-indexer/daemon.go Outdated Show resolved Hide resolved
cmd/algorand-indexer/daemon.go Show resolved Hide resolved
cmd/algorand-indexer/daemon_test.go Outdated Show resolved Hide resolved
Comment on lines 149 to 151
if !strings.Contains(err.Error(), errorStr) {
t.Fatalf("expected error %s, but got %s", errorStr, err.Error())
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You get the idea, same thing for the rest of these.

Suggested change
if !strings.Contains(err.Error(), errorStr) {
t.Fatalf("expected error %s, but got %s", errorStr, err.Error())
}
require.Error(t, err)
require.Contains(t, err.Error(), errorStr)

cmd/algorand-indexer/daemon_test.go Outdated Show resolved Hide resolved
cmd/algorand-indexer/main.go Outdated Show resolved Hide resolved
cmd/algorand-indexer/daemon_test.go Outdated Show resolved Hide resolved
Copy link
Contributor

@shiqizng shiqizng left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is great! It looks like we should be able to write integration tests for daemon after this change.

@Eric-Warehime Eric-Warehime requested review from shiqizng and winder June 27, 2022 22:06
if indexerDataDir == "" {
fmt.Fprint(os.Stderr, "indexer data directory was not provided")
panic(exit{1})
func loadIndexerConfig(indexerDataDir string, configFile string) error {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AlgoStephenAkiki this function looks correct to me. Is anything needed for the BindFlags still?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We would still need to bind the flags yes.

defer configs.Close()
err = viper.ReadConfig(configs)
// Detect the various auto-loading configs from data directory
if err = loadIndexerConfig(daemonConfig.indexerDataDir, daemonConfig.configFile); err != nil {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AlgoStephenAkiki if we move this ahead of the BindFlagSet call, can we avoid calling that function twice?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think so since the problem is that we have a circular dependency on the logger inside the loadIndexerConfig function (the logger needs to be configured from configuration and the function uses the logger but also can re-load the configuration).

Copy link
Contributor

@winder winder left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good, just want Stephen to double check the config file loading.

logger.WithError(err).Errorf("invalid config file (%s): %v", viper.ConfigFileUsed(), err)
return err
}
logger.Infof("Using configuration file: %s\n", resolvedConfigPath)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After this log statement we should call BindSetFlags() to make sure we get everything set.

@Eric-Warehime Eric-Warehime merged commit f3f1177 into algorand:localledger/integration Jun 29, 2022
@Eric-Warehime Eric-Warehime deleted the new-daemon-tests branch June 29, 2022 18:36
Eric-Warehime added a commit that referenced this pull request Jul 21, 2022
* Local Ledger (#1011)

* integrate block processor

* Local Ledger Deployment (#1013)

* add simple local ledger migration

* add deleted opts

* fast catchup (#1023)

* add fast catchup

* Localledger merge (#1036)

* return empty lists from fetchApplications and fetchAppLocalStates (#1010)

* Update model to converge with algod (#1005)

* New Feature: Adds Data Directory Support (#1012)

- Updates the go-algorand submodule hash to point to rel/beta
- Moves the cpu profiling file, pid file and indexer configuration file
  to be options of only the daemon sub-command
- Changes os.Exit() to be a panic with a special handler.  This is so
  that defer's are handled instead of being ignored.
- Detects auto-loading configuration files in the data directory and
  issues errors if equivalent command line arguments are supplied.
- Updates the README with instructions on how to use the auto-loading
  configuration files and the data directory.

* Update mockery version

Co-authored-by: erer1243 <[email protected]>
Co-authored-by: AlgoStephenAkiki <[email protected]>

* recovery scenario (#1024)

* handle ledger recovery scenario

* refactor create genesis block (#1026)

* refactor create genesis block

* Adds Local Ledger Readme (#1035)

* Adds Local Ledger Readme

Resolves #4109

Starts Readme docs

* Update docs/LocalLedger.md

Co-authored-by: Will Winder <[email protected]>

* Update docs/LocalLedger.md

Co-authored-by: Will Winder <[email protected]>

* Update docs/LocalLedger.md

Co-authored-by: Will Winder <[email protected]>

* Removed troubleshooting section

Co-authored-by: Will Winder <[email protected]>

* update ledger file path and migration (#1042)

* LocalLedger Refactoring + Catchpoint Service (#1049)

Part 1

    cleanup genesis file access.
    put node catchup into a function that can be swapped out with the catchup service.
    pass the indexer logger into the block processor.
    move open ledger into a util function, and move the initial state util function into a new ledger util file.
    add initial catchupservice implementation.
    move ledger init from daemon.go to constructor.
    Merge multiple read genesis functions.

Part 2

    Merge local_ledger migration package into blockprocessor.
    Rename Migration to Initialize
    Use logger in catchup service catchup

Part 3

    Update submodule and use NewWrappedLogger.
    Make util.CreateInitState private

* build: merge develop into localledger/integration (#1062)

* Ledger init status (#1058)

* Generate an error if the catchpoint is not valid for initialization. (#1075)

* Use main logger in handler and fetcher. (#1077)

* Switch from fullNode catchup to catchpoint catchup service. (#1076)

* Refactor daemon, add more tests (#1039)

Refactors daemon cmd into separate, testable pieces.

* Merge develop into localledger/integration (#1083)

* Misc Local Ledger cleanup (#1086)

* Update processor/blockprocessor/initialize.go

Co-authored-by: Zeph Grunschlag <[email protected]>

* commit

* fix function call args

* RFC-0001: Rfc 0001 impl (#1069)

Adds an Exporter interface and a noop exporter implementation with factory methods for construction

* Fix test errors

* Add/fix tests

* Add postgresql_exporter tests

* Update config loading

* Change BlockExportData to pointers

* Move and rename ExportData

* Add Empty func to BlockData

* Add comment

Co-authored-by: shiqizng <[email protected]>
Co-authored-by: [email protected] <[email protected]>
Co-authored-by: erer1243 <[email protected]>
Co-authored-by: AlgoStephenAkiki <[email protected]>
Co-authored-by: Will Winder <[email protected]>
Co-authored-by: Zeph Grunschlag <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants