Skip to content

Commit 2bf1e98

Browse files
authored
NODE-2641 Fixed active leases for address (#3928)
1 parent bb5cb6d commit 2bf1e98

File tree

3 files changed

+40
-17
lines changed

3 files changed

+40
-17
lines changed

node/src/main/scala/com/wavesplatform/api/common/lease/LeaseByAddressIterator.scala

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,19 @@ import com.wavesplatform.database
66
import com.wavesplatform.database.{AddressId, DBResource, Keys}
77
import com.wavesplatform.state.LeaseDetails
88

9-
import scala.collection.mutable
10-
119
private class LeaseByAddressIterator(resource: DBResource, addressId: AddressId) extends AbstractIterator[Seq[(ByteStr, LeaseDetails)]] {
1210
private val seqNr = resource.get(Keys.addressLeaseSeqNr(addressId))
1311
resource.withSafePrefixIterator(_.seekForPrev(Keys.addressLeaseSeq(addressId, seqNr).keyBytes))()
1412

1513
final override def computeNext(): Seq[(ByteStr, LeaseDetails)] =
1614
resource.withSafePrefixIterator { iterator =>
17-
val buffer = mutable.Map[ByteStr, LeaseDetails]()
18-
while (iterator.isValid) {
19-
for {
20-
id <- database.readLeaseIdSeq(iterator.value())
15+
if (iterator.isValid) {
16+
val details = for {
17+
id <- database.readLeaseIdSeq(iterator.value())
2118
details <- database.loadLease(resource, id) if details.isActive
22-
} buffer.update(id, details)
19+
} yield (id, details)
2320
iterator.prev()
24-
}
25-
if (buffer.nonEmpty)
26-
buffer.toSeq
27-
else
28-
endOfData()
29-
}(
30-
endOfData()
31-
)
21+
details
22+
} else endOfData()
23+
}(endOfData())
3224
}

node/src/main/scala/com/wavesplatform/database/RocksDBWriter.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -557,8 +557,11 @@ class RocksDBWriter(
557557
address <- Seq(details.recipientAddress, details.sender.toAddress)
558558
addressId = this.addressIdWithFallback(address, newAddresses)
559559
} yield (addressId, leaseId)
560-
val leaseIdsByAddressId = addressIdWithLeaseIds.groupMap { case (addressId, _) => (addressId, Keys.addressLeaseSeqNr(addressId)) }(_._2)
561-
rw.multiGetInts(leaseIdsByAddressId.keys.map(_._2).toSeq)
560+
val leaseIdsByAddressId = addressIdWithLeaseIds
561+
.groupMap { case (addressId, _) => (addressId, Keys.addressLeaseSeqNr(addressId)) }(_._2)
562+
.toSeq
563+
564+
rw.multiGetInts(leaseIdsByAddressId.map(_._1._2))
562565
.zip(leaseIdsByAddressId)
563566
.foreach { case (prevSeqNr, ((addressId, leaseSeqKey), leaseIds)) =>
564567
val nextSeqNr = prevSeqNr.getOrElse(0) + 1

node/src/test/scala/com/wavesplatform/http/LeaseRouteSpec.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,34 @@ class LeaseRouteSpec extends RouteSpec("/leasing") with OptionValues with RestAP
484484
checkForInvoke(EthTxGenerator.generateEthInvoke(invoker.toEthKeyPair, dApp1.toAddress, "foo", Seq.empty, Seq.empty))
485485
}
486486

487+
"multiple leases in the same block" in {
488+
val sender = TxHelpers.signer(240)
489+
val leases1 = Seq.tabulate(10)(i => TxHelpers.lease(sender, TxHelpers.address(241 + i)))
490+
val leases2 = Seq.tabulate(10)(i => TxHelpers.lease(sender, TxHelpers.address(251 + i)))
491+
val leases3 = Seq.tabulate(10)(i => TxHelpers.lease(sender, TxHelpers.address(261 + i)))
492+
val leases4 = Seq.tabulate(10)(i => TxHelpers.lease(sender, TxHelpers.address(271 + i)))
493+
494+
domain.appendBlock(TxHelpers.transfer(richAccount, sender.toAddress, 10_000.waves))
495+
domain.appendBlock(leases1*)
496+
domain.appendBlock(leases2*)
497+
domain.appendBlock(leases3*)
498+
domain.appendBlock(leases4*)
499+
domain.appendBlock()
500+
501+
import monix.execution.Scheduler.Implicits.global
502+
val leases = domain.accountsApi.activeLeases(sender.toAddress).toListL.runSyncUnsafe(15.seconds)
503+
leases.size shouldEqual 40
504+
505+
Get(routePath(s"/active/${sender.toAddress}")) ~> route ~> check {
506+
responseAs[Seq[JsObject]].map(v => (v \ "id").as[ByteStr]) should contain theSameElementsAs (
507+
leases4.map(_.id()) ++
508+
leases3.map(_.id()) ++
509+
leases2.map(_.id()) ++
510+
leases1.map(_.id())
511+
)
512+
}
513+
}
514+
487515
routePath("/info") in {
488516

489517
val lease = TxHelpers.lease()

0 commit comments

Comments
 (0)