daml/ledger
Gerolf Seitz 8158269b7d
Remove ExercisedEvent in Event oneof. (#1067)
* Remove ExercisedEvent in Event oneof.

The Event message is only used in the Transaction message. Flat
transactions do not contain exercised events, but only created and
archived events. Therefore we can remove the ExercisedEvent from the
Event oneof, without breaking transport compatibility.

HOWEVER: The Java Bindings used to use the data.Event class for both flat
transactions and transaction trees. To properly represent the actual
event types in the two transaction structures,
1) Event is now and interface and is only used in the Transaction class.
2) there is a new interface TreeEvent, which is used in the TransactionTree class.

* CreatedEvent implements Event and TreeEvent
* ExercisedEvent implements TreeEvent
* ArchivedEvent implements Event

Some "pathological" cases where an occurrence of an exercised event
would have resulted only in an exception, are now removed (see change in
LedgerApiV1.scala).

Fixes #960.
2019-05-13 14:36:13 +02:00
..
api-server-damlonx Check contract visibility in reference index service (#947) 2019-05-08 14:36:28 +02:00
backend-api avoiding linear searching for transactions from genesis (#994) 2019-05-10 11:28:14 +02:00
ledger-api-akka Enforce consistent formatting of BUILD files. (#412) 2019-04-12 13:10:16 +02:00
ledger-api-client CommandService returns useful data for successful submissions (#875) 2019-05-03 16:01:41 +02:00
ledger-api-common Remove ExercisedEvent in Event oneof. (#1067) 2019-05-13 14:36:13 +02:00
ledger-api-domain Ledger Api: drop ledger api domain values in favor of LF-values (#649) 2019-04-25 23:15:12 +00:00
ledger-api-integration-tests Remove ExercisedEvent in Event oneof. (#1067) 2019-05-13 14:36:13 +02:00
ledger-api-scala-logging Add TransactionService methods for looking up flat transactions (#830) 2019-05-03 09:03:12 +02:00
ledger-api-test-tool Extend test durations on CI for Ledger API Test Tool driven test. (#944) 2019-05-07 14:52:49 +02:00
participant-state Fixes to kvutils when used as external workspace (#984) 2019-05-07 17:55:11 +02:00
participant-state-index Check contract visibility in reference index service (#947) 2019-05-08 14:36:28 +02:00
sandbox Remove ExercisedEvent in Event oneof. (#1067) 2019-05-13 14:36:13 +02:00
sandbox-perf increasing a perf test timeout due to flakiness (#1028) 2019-05-09 11:26:13 +02:00
scripts correct jq in dev-env (#463) 2019-04-12 16:44:15 -04:00
test-common Sandbox: Respect MRT (#990) 2019-05-09 11:10:54 +02:00
API.md open-sourcing daml 2019-04-04 09:33:38 +01:00
CONTRIBUTING.md open-sourcing daml 2019-04-04 09:33:38 +01:00
README.md Update README.md (#640) 2019-04-23 17:47:54 +00:00
UNRELEASED.md open-sourcing daml 2019-04-04 09:33:38 +01:00

ledger

Home of our reference ledger implementation (Sandbox) and various ledger related libraries.

v1 gRPC API

The v1 gRPC API is described here

Logging

Logging Configuration

Ledger Server uses Logback for logging configuration.

Log Files

By default our log configuration creates two log files:

  • a plaintext file logs/ledger.log
  • a json file logs/ledger.json.log (for Logstash type log processors)

The path the file is stored in can be adjusted by setting -Dlogging.location=some/other/path. The filename used can be adjusted by setting -Dlogging.file=my-process-logs.

By default no output is sent to stdout (beyond logs from the logging setup itself).

standard streams logging

For development and testing it can be useful to send all logs to stdout & stderr rather than files (for instance to use the IntelliJ console or getting useful output from docker containers).

We ship a logging configuration for this which can be enabled by using -Dlogback.configurationFile=classpath:logback-standard.xml -Dlogging.config=classpath:logback-standard.xml.

INFO level and below goes to stdout. WARN and above goes to stderr.

_Note: always use both -Dlogback.configurationFile and -Dlogging.config. Logback is first initialized with the configuration file from logback.configurationFile. When the Spring framework boots it recreates logback and uses the configuration specified in logging.config.

Log levels

As most Java libraries and frameworks, ledger server uses INFO as the default logging level. This level is for minimal and important information (usually only startup and normal shutdown events). INFO level logging should not produce increasing volume of logging during normal operation.

WARN level should be used for transition between healthy/unhealthy state, or in other close to error scenarios.

DEBUG level should be turned on only when investigating issues in the system, and usually that means we want the trail loggers. Normal loggers at DEBUG level can be useful sometimes (e.g. DAML interpretation).

gRPC and back-pressure

RPC

Standard RPC requests should return with RESOURCE_EXHAUSTED status code to signal back-pressure. Envoy can be configured to retry on these errors. We have to be careful not to have any persistent changes when returning with such an error as the same original request can be retried on another service instance.

Streaming

gRPC's streaming protocol has built-in flow-control, but it's not fully active by default. What it does it controls the flow between the TCP/HTTP layer and the library so it builds on top of TCP's own flow control. The inbound flow control is active by default, but the outbound does not signal back-pressure out of the box.

AutoInboundFlowControl: The default behaviour for handling incoming items in a stream is to automatically signal demand after every onNext call. This is the correct thing to do if the handler logic is CPU bound and does not depend on other reactive downstream services. By default it's active on all inbound streams. One can disable this and signal demand by manually calling request to follow demands of downstream services. Disabling this feature is possible by calling disableAutoInboundFlowControl on CallStreamObserver.

ServerCallStreamObserver: casting an outbound StreamObserver manually to ServerCallStreamObserver gives us access to isReady and onReadyHandler. With these methods we can check if there is available capacity in the channel i.e. we are safe to push into it. This can be used to signal demand to our upstream flow. Note that gRPC buffers 32Kb data per channel and isReady will return false only when this buffer gets full.