* main: init implement rpc.Discover RPC method
This implement the basic functionality for the method
over HTTP RPC.
Signed-off-by: meows <b5c6@protonmail.com>
* main,go.mod,go.sum: init example with go-openrpc-reflect lib
Signed-off-by: meows <b5c6@protonmail.com>
Conflicts:
go.mod
go.sum
* main: make variable name human-friendly
Signed-off-by: meows <b5c6@protonmail.com>
* main,go.mod,go.sum: init impl of go-openrp-reflect printing document
Signed-off-by: meows <b5c6@protonmail.com>
Conflicts:
go.mod
go.sum
* go.mod,go.sum: use go-openrpc-reflect and open-rpc/meta-schema hackforks
This is for development only.
Versions need to be bumped when they're ready for use
as canonical remotes.
Signed-off-by: meows <b5c6@protonmail.com>
* main,openrpc,main: refactor openrpc supporting code to own package
This eliminates code duplication.
Signed-off-by: meows <b5c6@protonmail.com>
* main: add rpc.Discover to openrpc document
Signed-off-by: meows <b5c6@protonmail.com>
* openrpc: fix rpc.discover method name casing
Also fixes casing stuff for the rest of Filecoin.
methods.
Signed-off-by: meows <b5c6@protonmail.com>
* Revert "main: add rpc.Discover to openrpc document"
This reverts commit 116898efb10f33e405ac74acb1aa6daefcd46a62.
* main: fix document creation method name
This fixes an issue caused with the latest reverting
commit.
Signed-off-by: meows <b5c6@protonmail.com>
* main,docgen,openrpc: refactor to share api parsing, etc as docgen exported stuff
Signed-off-by: meows <b5c6@protonmail.com>
Makefile: fix docgen refactoring for makefile use of command
Signed-off-by: meows <b5c6@protonmail.com>
* openrpc: add schema.examples to app reflector
There are quite of few of these already registered
for the docgen command, so it makes sense to use
those!
Signed-off-by: meows <b5c6@protonmail.com>
* openrpc: init method pairing examples
Signed-off-by: meows <b5c6@protonmail.com>
* go.mod,go.sum: bump go.mod to use latest meta-schema and openrpc-reflect versions
Signed-off-by: meows <b5c6@protonmail.com>
* openrpc: init SchemaType mapper function
This function will handle the manual configurations
for app-specific data types w/r/t their json schema
representation.
This is useful for cases where the reflect library
is unable to provide a sufficient representation
automatically.
Provided in this commit is an initial implementation
for the integerD type (assuming number are represented
in the API as hexs), and a commonly used cid.Cid type.
Signed-off-by: meows <b5c6@protonmail.com>
* go.mod,go.sum: tame dependencies by bumping etclabscore/go-openrpc-reflect
This removes a problematic dependency
on github.com/ethereum/go-ethereum, which was
imported as a dependency for a couple github.com/etclabscore/go-openrpc-reflect
tests.
etclabscore/go-openrpc-reflect v0.0.36 has removed this
dependency, so this commit is the result of bumping
that version and then running 'go mod tidy'
This is in response to a review at
https://github.com/filecoin-project/lotus/pull/4711#pullrequestreview-535686205
Date: 2020-11-21 06:52:48-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* main: add 'miner' arg to openrpc gen cmd
This allows the command to EITHER
generate the doc for Full or Miner APIs.
See comment for usage.
Date: 2020-11-21 07:48:05-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* docgen: add missing examples for Miner API
Generating the Miner API OpenRPC doc
(via 'go run ./api/openrpc/cmd miner') caused
the example logic to panic because some types
were missing.
This commit adds those missing types, although
I'm not an expert in the API so I can't
suggest that the example values provided are
ideal or well representative.
Date: 2020-11-21 07:50:21-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* build/openrpc/full.json,build/openrpc/miner.json: add build/openrpc/[full/miner].json docs
These will be used as static documents
provided by the rpc.discover method.
Date: 2020-11-21 07:51:39-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* build: init go-rice openrpc static assets
Date: 2020-11-21 08:23:06-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* main: remove rpc.discover implementation from runtime plugin
Instead of generating the doc on the fly,
we're going to serve a static asset.
Rel https://github.com/filecoin-project/lotus/pull/4711#pullrequestreview-535686205
This removes the runtime implementation from the
RPC server construction.
Date: 2020-11-21 08:41:20-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api,apistruct,common: add Discover(ctx) method to CommonAPI interface and structs
Date: 2020-11-21 08:41:56-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* main: use rpc server method aliasing for rpc.discover
This depends on a currently-forked change at
filecoin-project/go-jsonrpc 8350f9463ee451b187d35c492e32f1b999e80210
which establishes this new method RPCServer.AliasMethod.
This solves the problem that the OpenRPC
spec says that the document should be served
at the system extension-prefixed endpoing
rpc.discover (not Filecoin.Discover).
In fact, the document will be available at BOTH
endpoints, but that duplicity is harmless.
Date: 2020-11-21 09:18:26-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api,apistruct,build,common: rpc.discover: return json object instead of string
Instead of casting the JSON asset from bytes to string,
unmarshal it to a map[string]interface{} so the
server will provide it as a JSON object.
Date: 2020-11-21 09:27:11-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* Makefile: merge resolve: docsgen command path
Date: 2020-11-22 07:19:36-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* apistruct,main,docgen,openrpc: merge resolve: fix func exporteds, signatures
Date: 2020-11-22 07:31:03-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* go.mod,go.sum: 'get get' auto-bumps version
Date: 2020-11-22 07:31:44-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* Makefile,docgen,main,build/openrpc: refactor openrpc documentation generation
This creates Makefile command docsgen-openrpc-json,
and refactors the docsgen command to generate both
the markdown and openrpc json documents, redirecting
the output of the openrpc json documentation to
the build/openrpc/ directory, where those json
files will be compiled as static assets via go-rice
boxes.
The api/openrpc/cmd now uses usage argumentation
congruent to that of the docgen command (switching
on API context).
Date: 2020-11-22 08:01:18-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* main,docgen_openrpc: rename api/openrpc -> api/docgen-openrpc
Renames the package as well.
This is intended to parallel the
existing docgen package and command
namespacing.
Date: 2020-11-22 10:34:46-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api,apistruct,docgen,build,build/openrpc: use typed Discover response
Instead of using a map[string]interface{}, use
a typed response for the Discover method implementation.
This avoids having to set a docgen Example for
the generic map[string]interface{} (as an openrpc document)
which both pollutes the generic type and lacks
useful information for the Discover method example.
Date: 2020-11-22 08:31:16-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* apistruct,build,main,impl: implement Discover method for Worker and StorageMiner APIs
Methods return static compiled assets respective
to the APIs.
Date: 2020-11-22 08:57:18-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* docgen_openrpc,build/openrpc: remove timestamping from openrpc doc info
This should allow openrpc docs generated at different
times to be equal. This is important because the CI
(Circle) runs the docgen command and tests that
the output and the source are unchanged (via git diff).
Date: 2020-11-22 10:47:07-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* main,docgen_openrpc,main,build: fix lint issues
Fixes goimports, staticcheck, golint issues.
Date: 2020-11-22 11:06:46-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* docgenopenrpc: fix: don't use an underscore in package name (golint)
Date: 2020-11-22 11:07:53-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* go.sum: fix: mod-tidy-check (run 'go mod tidy')
Date: 2020-11-22 11:09:48-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* go.mod,go.sum: bump filecoin-project/go-jsonrpc dep to latest
This version includes the necessary RPCServer.AliasMethod
method.
Date: 2020-11-23 12:16:15-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* Makefile,main,build,build/openrpc: init gzipped openrpc static docs
Date: 2020-11-24 06:15:06-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* build: refactor gzip reading
Date: 2020-11-24 06:18:34-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* build: add basic test for openrpc doc from static assets
Date: 2020-11-24 06:30:23-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* build: handle reader Close error
This keeps the errcheck linter happy.
Date: 2020-11-24 06:33:14-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* go.sum: run 'go mod tidy'
Date: 2020-11-24 06:36:07-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* go.mod,go.sum: go mod tidy
Tidying up after resolving the merge conflicts
with master at go.mod
Date: 2020-11-24 06:40:45-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* go.mod,go.sum: bump filecoin-project/go-jsonrpc to latest
This is a repeat of 76e6fd2, since the latest merge
to master seems to have reverted this.
Date: 2020-11-24 06:42:30-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* docgenopenrpc,build/openrpc: remove method example pairings, improve schema examples
Removing method example pairings since they were
redundant to schema examples and were not
implemented well.
Improved schema examples by using the ExampleValue
method instead of the map lookup.
Made a note in the comment here that this is
not ideal, since we have to make a shortcut assumption
/workaround by using 'unknown' as the method name
and the typea as its own parent.
Luckily these values aren't heavily used by the
method logic.
Date: 2020-11-27 12:57:36-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* docgenopenrpc: use generic number jsonschema for number types
Previously used an integer schema assuming
hex encoding. It appears, based on review some
of the examples, that this may not be the case.
Obvioussly this schema could be more descriptive,
but just shooting for mostly likely to be
not wrong at this point.
Date: 2020-12-15 14:44:37-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* cmd/lotus,go.mod,go.sum: maybe fix straggling merge resolution conflicts
Date: 2021-01-19 12:30:42-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* build/openrpc/full.json.gz,build/openrpc/miner.json.gz,build/openrpc/worker.json.gz: run 'make docsgen'
Date: 2021-01-19 12:33:55-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api/apistruct,node/impl: (lint) gofmt
Date: 2021-01-19 12:39:48-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api/docgen: maybe fix parse error: open ./api: no such file or directory
Date: 2021-01-19 12:52:04-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api/docgen,build/openrpc: maybe fix no such file error and run 'make docsgen'
Date: 2021-01-19 12:55:52-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api/docgen: return if AST comment/groupdoc parsing encounters any error
This will returns empty comments/docs maps.
This should fix issues like:
https://app.circleci.com/pipelines/github/filecoin-project/lotus/12445/workflows/4ebadce9-a298-4ad1-939b-f19ef4c0a5bf/jobs/107218
where the environment makes file lookups hard or
impossible.
Date: 2021-01-19 13:04:58-06:00
Signed-off-by: meows <b5c6@protonmail.com>
* api: Don't depend on build/
* make: support parallel docsgen
* openrpc gen: Use simple build version
* methodgen
* goimports
Co-authored-by: meows <b5c6@protonmail.com>
This paves the way for better object lifetime management.
Concretely, it makes it possible to:
- have different stores backing chain and state data.
- having the same datastore library, but using different parameters.
- attach different caching layers/policies to each class of data, e.g.
sizing caches differently.
- specifying different retention policies for chain and state data.
This separation is important because:
- access patterns/frequency of chain and state data are different.
- state is derivable from chain, so one could never expunge the chain
store, and only retain state objects reachable from the last finality
in the state store.
The bug is applying all messages from given From address are priors
before appling the message that we are estimating.
If user tries replacing message in the middle with gas limit estimation
then message sequence is off and user will either get an execution error
or gas mis-esimation.
Resolves#5402
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
This pulls in the improvements introduced in:
- https://github.com/raulk/go-watchdog/releases/tag/v1.0.0
- https://github.com/raulk/go-watchdog/releases/tag/v1.0.1
Lotus tries to initialize the watchdog in the following order of precedence:
1. If a max heap limit has been provided, initialize a heap-driven watchdog.
2. Else, try to initialize a cgroup-driven watchdog.
3. Else, try to initialize a system-driven watchdog.
4. Else, log a warning that the system is flying solo, and return.
This PR also enabled automatic heap profile capture when memory usage
surpasses 90% of the limit. Profiles are written to <LOTUS_HOME>/heapprof.
A single heap profile is captured per episode, with a max of 10 episodes
captured during the lifetime of the process. Episode = instance of usage
climbing above the 90% threshold.
The aim is to put some negative pressure on gas-premium instead of
maintining status quo.
55th percentile instead of median should not make much difference for
block inclusion timing.
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
_Always_ (almost) use the tipset's parent state, instead of computing.
Exceptions:
* MinerGetBaseInfo. Fixing this would break things so we need to be
careful (although we could bump the API version, fix it, then fix the call
sites).
* StateReplay. This is replaying a message on top of the given tipset.
* GasEstimateGasLimit. This executes the message on-top-of the tipset's
computed state (unlike call which executes it on the tipset's parent state).
* Having this method and Call apply the message at different heights is really
weird.
Instead, use proof type from miner actor. This will, in turn, use the upgraded
proof type if/when it's switched at runtime.
TODO: Consider making this some form of config option instead?
This is terrible, but we don't (currently) update this in the miner info.
Q: Maybe we should delay this by a few epochs? Some pre-commits could fail if we
get a reorg.
Some components like go-ds-measure, go-ipfs-blockstore and go-bitswap
expose metrics via ipfs/go-metrics-interface, but Lotus never injects
the Prometheus exporter (ipfs/go-metrics-prometheus). Therefore, those
metrics never surface in instrumentation.
Instead, Lotus uses OpenCensus directly.
This commit injects the Prometheus exporter for go-metrics-interface, and
instructs the OpenCensus Prometheus exporter to use the DefaultRegistry.
This has the effect of exposing blending the metrics of both metrics
libraries.
With this patch, the datastore, cache utilisation, and bitswap metrics
are now exported via the /debug/metrics endpoint.
This commit also fixes an issue where the metrics scope was empty, making
go-metrics-interface default to "<no-scope>". Angle brackets are inadmissible
characters for Prometheus, so it was refusing to export the affected metrics.
(These were the ARC cache metrics.)
It should significntly size of the LSM index, and thus increase the
performance with bigger datastores
Signed-off-by: Jakub Sztandera <kubuxu@protocol.ai>
Method numbers never change anyways. At worst, we'll deprecate old methods and
have to explicitly import them from the correct actors version to use them.
LifecycleCtx can _only_ be called during startup as it appends an fx hook.
Worse, this was causing us to append an fx hook on every single hello message,
leaking memory (and probably causing other shutdown issues...).
We'd read the deal ID without synchronizing. This could (and probably did given
the history of flaky deal tests) cause us to miss events.
This patch also makes sure to always unsubscribe from events, even on error.
Motivation:
* Run lotus with the race detector enabled (primary motivation).
* Allow multiple lotus nodes in a process (not a high priority).
Previously, the journal was shared between all lotus instances, but it was
initialized for every new node. This caused safety problems in tests (at a
minimum).
This patch explicitly passes the journal to all services that need it.
We're probably going to want to change some of these design decisions down the
road, but this is a good starting point.
* We may want to use a more general test for "is actor valid at epoch". Maybe
just a function?
* I'd like to push some of the actor metadata down into the actor types
themselves. Ideally, we'd be able to register actors with a simple
`Register(validation, manyActors...)` call.