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

Tests for transaction validation #10167

Merged
merged 4 commits into from
Jul 6, 2021
Merged

Tests for transaction validation #10167

merged 4 commits into from
Jul 6, 2021

Conversation

nickchapman-da
Copy link
Contributor

@nickchapman-da nickchapman-da commented Jul 1, 2021

Testing for transaction validation (isReplayedBy)

  • Tweak based testing
  • methodically tweak every field of every kind of GenActionNode
  • classifying each tweak as SIGNIFICANT or INSIGNIFICANT
  • test over a range of hand constructed sample transactions (no scalacheck here!)

This PR advances #6665

@nickchapman-da
Copy link
Contributor Author

/azp run

@azure-pipelines
Copy link
Contributor

Azure Pipelines successfully started running 1 pipeline(s).

@nickchapman-da nickchapman-da added the component/daml-engine DAML-LF Engine & Interpreter label Jul 5, 2021
@nickchapman-da nickchapman-da marked this pull request as ready for review July 5, 2021 15:39
Copy link
Collaborator

@remyhaemmerle-da remyhaemmerle-da left a comment

Choose a reason for hiding this comment

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

I like it very much. Thanks a lot.

Comment on lines 259 to 262
val versionBeforeMinByKey: (TransactionVersion => Boolean) = { v =>
import scala.Ordering.Implicits.infixOrderingOps
v < TransactionVersion.minByKey
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

just curious to know

  • why it is a val ?
  • why it is not private like the other (I do not really care of private for tests) ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

val? -- no good reason. I changed to def.
not private? -- oversight. fixed now.
(good spot, thanks)
the reason I liked to use private here (when I remembered!) is that is ensures that everything definition has a use.

Comment on lines 276 to 278
private def tweakKeyMaintainers = Tweak[KWM] { x =>
List(samKWM1, samKWM2, samKWM3).filter(y => x != y)
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why this one is not a val ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

not a val? -- no good reason. changed to a val.

If you want to know the actual reason... during development I often use ??? for code I haven''t yet written, but I often want to check the overall structure compiles. However, scalac complains about unreachable code for combinations of val/???, so I must use def as a temporary workaround.


private val tweakOptKeyMaintainersSome = Tweak[OKWM] {
case None => List() // don't tweak from None
case Some(x) => None :: List(samKWM1, samKWM2, samKWM3).filter(y => x != y).map(Some(_))
Copy link
Collaborator

Choose a reason for hiding this comment

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

Just an alternative, not really better.

Suggested change
case Some(x) => None :: List(samKWM1, samKWM2, samKWM3).filter(y => x != y).map(Some(_))
case Some(x) => None :: List(samKWM1, samKWM2, samKWM3).collect{ case y if x != y => Some(y) }```

Comment on lines +53 to +64
private object Tweak {
def single[X](f1: X => Option[X]): Tweak[X] = {
def f(x: X) = f1(x) match {
case None => Nil
case Some(y) => List(y)
}
new Tweak(f)
}
def apply[X](f: X => List[X]): Tweak[X] = {
new Tweak(f)
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

I am perfectly fine with the current state of the Tweak object, but have you consider using PartialFunction ? I find it fits particularly well your use case.

See the following suggestion together with the two suggestions I made line 259 and line 276 (and two others)

Suggested change
private object Tweak {
def single[X](f1: X => Option[X]): Tweak[X] = {
def f(x: X) = f1(x) match {
case None => Nil
case Some(y) => List(y)
}
new Tweak(f)
}
def apply[X](f: X => List[X]): Tweak[X] = {
new Tweak(f)
}
}
private object Tweak {
def single[X](f1: PartialFunction[X, X]): Tweak[X] =
Tweak(f1.andThen(List(_)))
def apply[X](f: PartialFunction[X, List[X]]): Tweak[X] =
new Tweak(f.applyOrElse(List.empty))
}

Copy link
Contributor

Choose a reason for hiding this comment

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

partial function to list seems a bit odd. Afaict we have no difference between returning an empty list and the function not being defined.

Copy link
Collaborator

@remyhaemmerle-da remyhaemmerle-da Jul 6, 2021

Choose a reason for hiding this comment

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

new Tweak(f.orElse(_ => List.empty[X])) may work better than new Tweak(f.applyOrElse(List.empty))

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thank you for the suggestion about PartialFunction. I am aware of it, but to be honest it's not something that is in my everyday scala toolbox. Also, I would be a bit unhappy to loose exhaustiveness checking for pattern matches. However, perhaps it would be idiomatic for the use case here. I wont make the change in this PR. Let's discuss offline & you can try to persuade me. :)

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 see any use for the Tweak class. A type synonym will serve equally well.

When you write a function with partial function syntax, and the expected type is a non-partial function, you will still get exhaustiveness checking. Broadly speaking, this violates the Liskov Substitution Principle (because an expression that satisfies type t does not satisfy type u >: t if warnings are errors), but not in a way that violates soundness.

So that means you can write

private type Tweak[T] = T => List[T]
private object Tweak {
  def apply[T](f: Tweak[T]): Tweak[T] = f
}

Tweak[Option[Location]] {
  case None => //blah blah
  // I get an exhaustiveness warning if I don't handle Some
}

Comment on lines +296 to +299
private val tweakCreateCoid = Tweak.single[Node] {
case nc: Node.NodeCreate[_] => Some(nc.copy(coid = changeContractId(nc.coid)))
case _ => None
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

With the PartialFunction change made above:

Suggested change
private val tweakCreateCoid = Tweak.single[Node] {
case nc: Node.NodeCreate[_] => Some(nc.copy(coid = changeContractId(nc.coid)))
case _ => None
}
private val tweakCreateCoid = Tweak.single[Node] {
case nc: Node.NodeCreate[_] => nc.copy(coid = changeContractId(nc.coid))
}

Copy link
Contributor

Choose a reason for hiding this comment

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

It is perfectly reasonable to have another method in object Tweak that takes a PartialFunction instead and adds the Seq.empty case with orElse, producing a total function. You are getting no exhaustiveness-checking value out of many of these tweak definitions, and defining them as @remyhaemmerle-da suggests would clean them up.


"Significant tweaks" - {
var count = 0
significantTweaks.foreach { case (name, tweak) =>
Copy link
Collaborator

@remyhaemmerle-da remyhaemmerle-da Jul 6, 2021

Choose a reason for hiding this comment

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

Again not a request for change.

You could consider using scala check TableDrivenPropertyChecks (See for example SBuiltinTest)
This as the following advantages:

  • it runs all the test cases (and not stop at the first failing one)
  • it reports slightly nicer errors
    @S11001001 are there other advantages ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I'll have a look at this...

Copy link
Contributor

Choose a reason for hiding this comment

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

forEvery is already doing a lot of the stuff for you so you don't have to do it yourself. For example, a nested forEvery here would simply report the txA and txB in a nice way as part of the failure message, so you would not have to jam it into the fail string.

And that makes it so that you can simply use shouldBe or inside without using fail at all, and still getting all the stuff you might need to know to understand failures reported.

Comment on lines 639 to 642
res match {
case Right(()) => ()
case Left(_) =>
println(s"**expected $name to be INSIGNIFICANT (but it wasn't)\n-txA=$txA\n-txB=$txB")
assert(false)
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why not simply res shouldBe Right(())

Copy link
Contributor Author

Choose a reason for hiding this comment

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

because it is quite helpful to be able to see the txA and txB

Copy link
Collaborator

Choose a reason for hiding this comment

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

👍

Copy link
Contributor

Choose a reason for hiding this comment

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

forEvery solves this problem nicely, as mentioned in #10167 (comment).

But there's another aspect here that really illustrates why it's useful to track down the existing combinators rather than use scala-library to simulate them. There are two kinds of failures of these kinds of tests: break-everything, and break-something. As written, these tests stop on the first failure. So you don't really know which of those situations you're in.

With forEvery, you can immediately tell from one test run whether you've broken everything, just a few things, or a single edge case. It's a bit like the difference between having separate test declarations for each test, and just putting every assertion in the whole file into a single test case.

Redefining this functionality is annoying. And it is quite useful; #8879 was more or less an exercise of adding cases, tweaking or rewriting part of the algorithm, and quickly getting feedback on every shortcoming of whatever change I had just made--whether there was just one detail I had forgotten, or everything collapsed and I had hit a dead end.

Comment on lines 642 to 643
println(s"**expected $name to be INSIGNIFICANT (but it wasn't)\n-txA=$txA\n-txB=$txB")
assert(false)
Copy link
Collaborator

Choose a reason for hiding this comment

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

I would better not use println.
If you want to display a message on failure, better use fail.
See ScalaTest assertions

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ok, I used fail

Comment on lines +517 to +528
private val tweakExerciseExerciseResultSome = Tweak[Node] { //sig
case ne: Node.NodeExercises[_, _] =>
ne.exerciseResult match {
case None => Nil
case Some(v) =>
List(
ne.copy(exerciseResult = Some(changeValue(v))),
ne.copy(exerciseResult = None),
)
}
case _ => Nil
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

With the PartialFunction change for Tweak.apply

Suggested change
private val tweakExerciseExerciseResultSome = Tweak[Node] { //sig
case ne: Node.NodeExercises[_, _] =>
ne.exerciseResult match {
case None => Nil
case Some(v) =>
List(
ne.copy(exerciseResult = Some(changeValue(v))),
ne.copy(exerciseResult = None),
)
}
case _ => Nil
}
private val tweakExerciseExerciseResultSome = Tweak[Node] { //sig
case ne: Node.NodeExercises[_, _] if ne.exerciseResult.isDefined =>
List(
ne.copy(exerciseResult = ne.exerciseResult.map(changeValue)),
ne.copy(exerciseResult = None),
)
}
}

Comment on lines +542 to +547
private def tweakExerciseByKey(whenVersion: TransactionVersion => Boolean) = Tweak.single[Node] {
case ne: Node.NodeExercises[_, _] =>
if (whenVersion(ne.version)) Some(ne.copy(byKey = changeBoolean(ne.byKey)))
else None
case _ => None
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

with the PartialFunction change in Tweak.single.

Suggested change
private def tweakExerciseByKey(whenVersion: TransactionVersion => Boolean) = Tweak.single[Node] {
case ne: Node.NodeExercises[_, _] =>
if (whenVersion(ne.version)) Some(ne.copy(byKey = changeBoolean(ne.byKey)))
else None
case _ => None
}
private def tweakExerciseByKey(whenVersion: TransactionVersion => Boolean) = Tweak.single[Node] {
case ne: Node.NodeExercises[_, _] if whenVersion(ne.version) =>
ne.copy(byKey = changeBoolean(ne.byKey))
}

changelog_begin
changelog_end

try fix scala 2_12 build

fetch node: samples and tweaks

list sig/insig field tweaks side-by-side so coverage is easier to eyeball

exerciseResult tweak sig & insig

add sig/insig tweak for byKey of Fetch node

add sig/insig tweak for key of Fetch node

must use ImmArray.empty instead of ImmArray() for scala 2.12

another blind attempt to fix scala 2.12

use for/yield instead of flatMap for list-comprehensions

test sig/insig tweaks to LookupByKey nodes

wont attempt to tweak rollbacks

(and shorten trailing dash in comment banners)

comment about how Tweak testing is organized

dont dep/import scalacheck (not used!)

no wild imports
@nickchapman-da nickchapman-da force-pushed the nick-validation-tests branch from 716b5d6 to 79edb49 Compare July 6, 2021 10:49
Copy link
Contributor

@cocreature cocreature left a comment

Choose a reason for hiding this comment

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

Nice, I think there is a set of tests that is missing here that we should add but doesn’t have to be in this PR and some of this might also become redundant by adding the normalization:

Anything around items having different numbers of children: e.g., different number of children in an exercise rollback but also different number of record fields. More generally, I think there are probably a few more tests around values (e.g., tweak of record constructor) that could be useful.

Comment on lines +53 to +64
private object Tweak {
def single[X](f1: X => Option[X]): Tweak[X] = {
def f(x: X) = f1(x) match {
case None => Nil
case Some(y) => List(y)
}
new Tweak(f)
}
def apply[X](f: X => List[X]): Tweak[X] = {
new Tweak(f)
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

partial function to list seems a bit odd. Afaict we have no difference between returning an empty list and the function not being defined.

@nickchapman-da
Copy link
Contributor Author

partial function to list seems a bit odd. Afaict we have no difference between returning an empty list and the function not being defined.

A Tweak[X] is a total function from X to List[X]

(1) A non-empty return list provides a list of value-replacements which we want to apply here.
(2) An empty list means, this tweak does not apply here.

There is no concept of a tweak being applicable, but with a empty list of value-replacements. Or at least the meaning of this is indistinguishable from (2).

@mergify mergify bot merged commit 8578e56 into main Jul 6, 2021
@mergify mergify bot deleted the nick-validation-tests branch July 6, 2021 11:24
@remyhaemmerle-da
Copy link
Collaborator

remyhaemmerle-da commented Jul 6, 2021

partial function to list seems a bit odd. Afaict we have no difference between returning an empty list and the function not being defined.

A Tweak[X] is a total function from X to List[X]

I think Mortiz is referring to my suggestion to use PartialTransaction.
I do not propose to change Tweak, but the two builders to use PartialTransaction instead of total function, specially because You use partial function notation in all your usage of the builders.

Here is a concrete example of what I have in mind.

To answer @cocreature concern I do not find to have a "partial function to list" so odd, the idea is just to understand that where the function passed to the builder is undefined, we just use the default value List.empty.
I think this make the writing of test case much less tedious.

Comment on lines +53 to +64
private object Tweak {
def single[X](f1: X => Option[X]): Tweak[X] = {
def f(x: X) = f1(x) match {
case None => Nil
case Some(y) => List(y)
}
new Tweak(f)
}
def apply[X](f: X => List[X]): Tweak[X] = {
new Tweak(f)
}
}
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 see any use for the Tweak class. A type synonym will serve equally well.

When you write a function with partial function syntax, and the expected type is a non-partial function, you will still get exhaustiveness checking. Broadly speaking, this violates the Liskov Substitution Principle (because an expression that satisfies type t does not satisfy type u >: t if warnings are errors), but not in a way that violates soundness.

So that means you can write

private type Tweak[T] = T => List[T]
private object Tweak {
  def apply[T](f: Tweak[T]): Tweak[T] = f
}

Tweak[Option[Location]] {
  case None => //blah blah
  // I get an exhaustiveness warning if I don't handle Some
}

private val samVersion1: TransactionVersion = TransactionVersion.minVersion
private val samVersion2: TransactionVersion = TransactionVersion.maxVersion

private val someCreates: List[Node] =
Copy link
Contributor

Choose a reason for hiding this comment

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

This kind of code should broadly use Seq instead of List. It would probably be profitably idiomatic to replace every List with Seq here.

The only legitimate reasons to use List directly are

  1. you need to traverse or
  2. need a functor/monad instance, or
  3. you rely specifically on the structure of a list, i.e. cheap push/pop

Comment on lines +296 to +299
private val tweakCreateCoid = Tweak.single[Node] {
case nc: Node.NodeCreate[_] => Some(nc.copy(coid = changeContractId(nc.coid)))
case _ => None
}
Copy link
Contributor

Choose a reason for hiding this comment

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

It is perfectly reasonable to have another method in object Tweak that takes a PartialFunction instead and adds the Seq.empty case with orElse, producing a total function. You are getting no exhaustiveness-checking value out of many of these tweak definitions, and defining them as @remyhaemmerle-da suggests would clean them up.

}
}
}
println(s"**SIGNIFICANT tweaks checked: #$count")
Copy link
Contributor

Choose a reason for hiding this comment

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

All printlns should be removed.


"Significant tweaks" - {
var count = 0
significantTweaks.foreach { case (name, tweak) =>
Copy link
Contributor

Choose a reason for hiding this comment

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

forEvery is already doing a lot of the stuff for you so you don't have to do it yourself. For example, a nested forEvery here would simply report the txA and txB in a nice way as part of the failure message, so you would not have to jam it into the fail string.

And that makes it so that you can simply use shouldBe or inside without using fail at all, and still getting all the stuff you might need to know to understand failures reported.

azure-pipelines bot pushed a commit that referenced this pull request Jul 7, 2021
This PR has been created by a script, which is not very smart
and does not have all the context. Please do double-check that
the version prefix is correct before merging.

@Robin-da is in charge of this release.

Commit log:
```
0d881f5 Improvements to the documentation with regards to offsets (#10180)
1d5ba4f feed elasticsearch cluster (#10193)
e2bdca6 Use PartialFunction for more concise code. (#10191)
fe98c48 release 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10186)
4fe626a Drop logging on CompletionSource (#10190)
582aa5f Fix a typo in an exceptions example. (#10188)
8750c0c reduce noise in Scala bindings (#10187)
98b5ffe Add divulgence warning and test in script service. (#10179)
8578e56 Tests for transaction validation (#10167)
05a72a3 update compat versions for 1.15.0-snapshot.20210705.7286.0.62aabcc4 (#10184)
7b93923 [In-memory fan-out] Performance optimizations [DPP-470] (#10127)
6c49619 Document how to run the Java codegen from the Daml assistant (#10181)
61aa774 Release SDK 1.15 RC (#10182)
```
Changelog:
```
[Docs] Improvements to the documentation with regards to offsets
[Docs] Document how to use the Java codegen using the Daml assistant
```

CHANGELOG_BEGIN
CHANGELOG_END
@nickchapman-da
Copy link
Contributor Author

Thanks @stephencompall-DA for your suggestions. Please see: #10214

azure-pipelines bot pushed a commit that referenced this pull request Jul 14, 2021
This PR has been created by a script, which is not very smart
and does not have all the context. Please do double-check that
the version prefix is correct before merging.

@akshayshirahatti-da is in charge of this release.

Commit log:
```
1f35db1 ledger-on-sql: Use random log entry ID allocation so we don't depend on `SeedService`. [KVL-1002] (#10255)
b8e2198 Separate traces from warnings in engine. (#10253)
0a7f2b1 [JSON-API] Small refactoring to start using akka http routes internally (#10252)
6e8ec1d LF: Drop old depreated code (#10251)
de7a08f [In-memory fan-out] Handle `null` submitters in getTransactionLogUpdates (#10248)
584169a Participant state v1-to-v2 adaptors [KVL-1002] (#10246)
e4d7cd7 LF: Deprecate com.daml.lf.data.TryOps.Bracket (#10249)
b59f365 [JSON-API] Correctly extract the request source URL/IP (#10244)
edaf541 Adapt `ledger-api-bench-tool` to work with LR [DPP-424] (#10171)
6fe6ae0 LF: Make DarReader ZipEntries immulatble (#10243)
05e5218 Consolidating EventStorageBackend (#10224)
3fd3abf Instrument buffer after contract state events stream (#10209)
643a2de v2 participant state API draft [KVL-998] (#10210)
5abcd04 Adds Unit tests for parallel-ingestion [DPP-455] (#10238)
3cdedcf kvutils: Extract validators from TransactionCommitter [KVL-1015] (#10235)
00d622f Make @UNTIL-LF exclusive, add @UNTIL-LF-FEATURE. (#10240)
2bcbd4e es: switch to persistent nodes (#10236)
7f4bc2a update compat versions for 1.14.2 (#10233)
4eba4b0 Ledger: decouple BD value serialization library from archive library. (#10218)
729afa8 Write a few lines on how to run tests against an Oracle database (#10230)
2b67ebb tf: refactor appr var (#10232)
202b7f7 add akshay to appr team (#10229)
2c5410c Release SDK 1.14.2 (#10226)
89d87ad update compat versions for 1.14.2-snapshot.20210708.7135.0.aa297840 (#10223)
4839344 TODO Cleanup: QueryNonPruned [DPP-459] (#10225)
0bea5e3 Allow retriable lookupMaximumLedgerTime on contention (#10211)
ca2a9e9 Release 1.14.2 snapshot (#10222)
999577a tweak ES cluster (#10219)
6680d36 Warn on DA.Exception import (#10201)
f19f5b0 LF: Simplify DarReader (#10217)
8f1a8f2 Release DAML SDK 1.14.1 (#10204)
ebb76dc LF: reorganize errors in com.daml.lf.archive (#10213)
6964645 Improvements for validation tests (#10214)
5f124c3 Avoid collision in execution log postfix (#10205)
9e27ae0 Reshuffle cocreature in daml-lf codeowners (#10215)
41b8448 LF: Simplify archive reader. (#10208)
38734f0 es-feed: ignore invalid files (#10207)
6586dde Move exercise context computation to the client side (#10199)
c92c678 Mark Daml profiler as stable (#10203)
cb1f4ec ci/windows: disable spool (#10200)
2326d42 Publish execution logs on unix platforms (#10194)
4269345 Drop cleanup of node_modules (#10195)
c8faed8 Deduplicate Java codegen running instructions (#10185)
e4c8c39 update compat versions for 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10196)
0d881f5 Improvements to the documentation with regards to offsets (#10180)
1d5ba4f feed elasticsearch cluster (#10193)
e2bdca6 Use PartialFunction for more concise code. (#10191)
fe98c48 release 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10186)
4fe626a Drop logging on CompletionSource (#10190)
582aa5f Fix a typo in an exceptions example. (#10188)
8750c0c reduce noise in Scala bindings (#10187)
98b5ffe Add divulgence warning and test in script service. (#10179)
8578e56 Tests for transaction validation (#10167)
05a72a3 update compat versions for 1.15.0-snapshot.20210705.7286.0.62aabcc4 (#10184)
7b93923 [In-memory fan-out] Performance optimizations [DPP-470] (#10127)
6c49619 Document how to run the Java codegen from the Daml assistant (#10181)
61aa774 Release SDK 1.15 RC (#10182)
```
Changelog:
```
- [JSON-API] If the service is put behind a proxy filling either of these headers X-Forwarded-For & X-Real-Ip then these will now be respected for logging the request source ip/url
- [Daml Compiler] Importing DA.Exception on LF < 1.14 now produces a
warning that exceptions require Daml-LF >= 1.14.
- [Daml Profiler] The Daml profiler is now a stable feature.
[Docs] Improvements to the documentation with regards to offsets
[Docs] Document how to use the Java codegen using the Daml assistant
```

CHANGELOG_BEGIN
CHANGELOG_END
cocreature added a commit that referenced this pull request Jul 14, 2021
* release 1.15.0-snapshot.20210713.7343.0.1f35db17

This PR has been created by a script, which is not very smart
and does not have all the context. Please do double-check that
the version prefix is correct before merging.

@akshayshirahatti-da is in charge of this release.

Commit log:
```
1f35db1 ledger-on-sql: Use random log entry ID allocation so we don't depend on `SeedService`. [KVL-1002] (#10255)
b8e2198 Separate traces from warnings in engine. (#10253)
0a7f2b1 [JSON-API] Small refactoring to start using akka http routes internally (#10252)
6e8ec1d LF: Drop old depreated code (#10251)
de7a08f [In-memory fan-out] Handle `null` submitters in getTransactionLogUpdates (#10248)
584169a Participant state v1-to-v2 adaptors [KVL-1002] (#10246)
e4d7cd7 LF: Deprecate com.daml.lf.data.TryOps.Bracket (#10249)
b59f365 [JSON-API] Correctly extract the request source URL/IP (#10244)
edaf541 Adapt `ledger-api-bench-tool` to work with LR [DPP-424] (#10171)
6fe6ae0 LF: Make DarReader ZipEntries immulatble (#10243)
05e5218 Consolidating EventStorageBackend (#10224)
3fd3abf Instrument buffer after contract state events stream (#10209)
643a2de v2 participant state API draft [KVL-998] (#10210)
5abcd04 Adds Unit tests for parallel-ingestion [DPP-455] (#10238)
3cdedcf kvutils: Extract validators from TransactionCommitter [KVL-1015] (#10235)
00d622f Make @UNTIL-LF exclusive, add @UNTIL-LF-FEATURE. (#10240)
2bcbd4e es: switch to persistent nodes (#10236)
7f4bc2a update compat versions for 1.14.2 (#10233)
4eba4b0 Ledger: decouple BD value serialization library from archive library. (#10218)
729afa8 Write a few lines on how to run tests against an Oracle database (#10230)
2b67ebb tf: refactor appr var (#10232)
202b7f7 add akshay to appr team (#10229)
2c5410c Release SDK 1.14.2 (#10226)
89d87ad update compat versions for 1.14.2-snapshot.20210708.7135.0.aa297840 (#10223)
4839344 TODO Cleanup: QueryNonPruned [DPP-459] (#10225)
0bea5e3 Allow retriable lookupMaximumLedgerTime on contention (#10211)
ca2a9e9 Release 1.14.2 snapshot (#10222)
999577a tweak ES cluster (#10219)
6680d36 Warn on DA.Exception import (#10201)
f19f5b0 LF: Simplify DarReader (#10217)
8f1a8f2 Release DAML SDK 1.14.1 (#10204)
ebb76dc LF: reorganize errors in com.daml.lf.archive (#10213)
6964645 Improvements for validation tests (#10214)
5f124c3 Avoid collision in execution log postfix (#10205)
9e27ae0 Reshuffle cocreature in daml-lf codeowners (#10215)
41b8448 LF: Simplify archive reader. (#10208)
38734f0 es-feed: ignore invalid files (#10207)
6586dde Move exercise context computation to the client side (#10199)
c92c678 Mark Daml profiler as stable (#10203)
cb1f4ec ci/windows: disable spool (#10200)
2326d42 Publish execution logs on unix platforms (#10194)
4269345 Drop cleanup of node_modules (#10195)
c8faed8 Deduplicate Java codegen running instructions (#10185)
e4c8c39 update compat versions for 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10196)
0d881f5 Improvements to the documentation with regards to offsets (#10180)
1d5ba4f feed elasticsearch cluster (#10193)
e2bdca6 Use PartialFunction for more concise code. (#10191)
fe98c48 release 1.14.1-snapshot.20210706.7133.0.8ec16e94 (#10186)
4fe626a Drop logging on CompletionSource (#10190)
582aa5f Fix a typo in an exceptions example. (#10188)
8750c0c reduce noise in Scala bindings (#10187)
98b5ffe Add divulgence warning and test in script service. (#10179)
8578e56 Tests for transaction validation (#10167)
05a72a3 update compat versions for 1.15.0-snapshot.20210705.7286.0.62aabcc4 (#10184)
7b93923 [In-memory fan-out] Performance optimizations [DPP-470] (#10127)
6c49619 Document how to run the Java codegen from the Daml assistant (#10181)
61aa774 Release SDK 1.15 RC (#10182)
```
Changelog:
```
- [JSON-API] If the service is put behind a proxy filling either of these headers X-Forwarded-For & X-Real-Ip then these will now be respected for logging the request source ip/url
- [Daml Compiler] Importing DA.Exception on LF < 1.14 now produces a
warning that exceptions require Daml-LF >= 1.14.
- [Daml Profiler] The Daml profiler is now a stable feature.
[Docs] Improvements to the documentation with regards to offsets
[Docs] Document how to use the Java codegen using the Daml assistant
```

CHANGELOG_BEGIN
CHANGELOG_END

* 1.16 not 1.15

changelog_begin
changelog_end

Co-authored-by: Azure Pipelines DAML Build <[email protected]>
Co-authored-by: Moritz Kiefer <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component/daml-engine DAML-LF Engine & Interpreter
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants