kvutils: Add VersionedOffsetBuilder#matchesVersionOf. (#11212)

This allows a caller to test whether an offset matches a specific
version without throwing an exception.

CHANGELOG_BEGIN
CHANGELOG_END
This commit is contained in:
Samir Talwar 2021-10-12 15:54:57 +02:00 committed by GitHub
parent 24c6329579
commit fe6acb60fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 28 additions and 1 deletions

View File

@ -21,6 +21,7 @@ import java.nio.ByteBuffer
* @see com.daml.ledger.offset.Offset
*/
class VersionedOffsetBuilder(version: Byte) {
import VersionedOffsetBuilder._
def onlyKeepHighestIndex(offset: Offset): Offset = {
@ -67,6 +68,12 @@ class VersionedOffsetBuilder(version: Byte) {
extractedVersion
}
def matchesVersionOf(offset: Offset): Boolean = {
val stream = toDataInputStream(offset)
val extractedVersion = stream.readByte()
extractedVersion == version
}
// `highestIndex` is used a lot, so it's worth optimizing a little rather than reusing `split`.
def highestIndex(offset: Offset): Long = {
val stream = toDataInputStream(offset)
@ -93,7 +100,6 @@ class VersionedOffsetBuilder(version: Byte) {
}
object VersionedOffsetBuilder {
val MaxHighest: Long = (1L << 56) - 1
private val highestStartByte = 1

View File

@ -14,6 +14,7 @@ class VersionedOffsetBuilderSpec
extends AnyWordSpec
with Matchers
with ScalaCheckDrivenPropertyChecks {
import VersionedOffsetBuilderSpec._
"VersionedOffsetBuilder" should {
@ -79,6 +80,26 @@ class VersionedOffsetBuilderSpec
}
}
}
"test the version of the offset, returning `true` on a match" in {
forAll(genHighest, Gen.posNum[Int], Gen.posNum[Int], arbitrary[Byte]) {
(highest, middle, lowest, version) =>
val offsetBuilder = VersionedOffsetBuilder(version)
val offset = offsetBuilder.of(highest, middle, lowest)
offsetBuilder.matchesVersionOf(offset) should be(true)
}
}
"test the version of the offset, returning `false` on a mismatch" in {
forAll(genHighest, Gen.posNum[Int], Gen.posNum[Int], genDifferentVersions) {
(highest, middle, lowest, versions) =>
val offset = VersionedOffsetBuilder(versions._1).of(highest, middle, lowest)
val offsetBuilder = VersionedOffsetBuilder(versions._2)
offsetBuilder.matchesVersionOf(offset) should be(false)
}
}
}
}