From 9b8e511ddb4acd382da24523a2629e44e7eab754 Mon Sep 17 00:00:00 2001 From: papchenko Date: Mon, 17 Dec 2018 18:01:17 +0200 Subject: [PATCH 01/16] LWDEV-10200 remove obsolete balances functionality in balances holder --- .../matching/engine/holders/BalancesHolder.kt | 35 ------------------- .../balance/util/TestBalanceHolderWrapper.kt | 27 ++++++++++---- .../matching/engine/fee/FeeProcessorTest.kt | 1 + .../engine/services/InvalidBalanceTest.kt | 3 +- .../engine/services/MarketOrderServiceTest.kt | 3 +- .../matching/engine/services/RoundingTest.kt | 15 ++++---- .../engine/services/StopLimitOrderTest.kt | 1 + .../ReservedVolumesRecalculatorTest.kt | 23 ++++++------ 8 files changed, 46 insertions(+), 62 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt index d7fdf36da..3cbd540c1 100644 --- a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt +++ b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt @@ -5,10 +5,8 @@ import com.lykke.matching.engine.balance.WalletOperationsProcessor import com.lykke.matching.engine.daos.wallet.AssetBalance import com.lykke.matching.engine.daos.wallet.Wallet import com.lykke.matching.engine.database.PersistenceManager -import com.lykke.matching.engine.database.cache.ApplicationSettingsCache import com.lykke.matching.engine.database.common.entity.BalancesData import com.lykke.matching.engine.database.common.entity.PersistenceData -import com.lykke.matching.engine.deduplication.ProcessedMessage import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolder import org.apache.log4j.Logger @@ -85,39 +83,6 @@ class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAcce return BigDecimal.ZERO } - fun updateBalance(processedMessage: ProcessedMessage?, - messageSequenceNumber: Long?, - clientId: String, - assetId: String, - balance: BigDecimal): Boolean { - val currentTransactionBalancesHolder = createCurrentTransactionBalancesHolder() - currentTransactionBalancesHolder.updateBalance(clientId, assetId, balance) - val balancesData = currentTransactionBalancesHolder.persistenceData() - val persisted = persistenceManager.persist(PersistenceData(balancesData, processedMessage, null, null, messageSequenceNumber)) - if (!persisted) { - return false - } - currentTransactionBalancesHolder.apply() - return true - } - - fun updateReservedBalance(processedMessage: ProcessedMessage?, - messageSequenceNumber: Long?, - clientId: String, - assetId: String, - balance: BigDecimal, - skipForTrustedClient: Boolean = true): Boolean { - val currentTransactionBalancesHolder = createCurrentTransactionBalancesHolder() - currentTransactionBalancesHolder.updateReservedBalance(clientId, assetId, balance) - val balancesData = currentTransactionBalancesHolder.persistenceData() - val persisted = persistenceManager.persist(PersistenceData(balancesData, processedMessage, null, null, messageSequenceNumber)) - if (!persisted) { - return false - } - currentTransactionBalancesHolder.apply() - return true - } - fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?) { persistenceManager.persist(PersistenceData(BalancesData(wallets, wallets.flatMap { it.balances.values }), null, null, null, messageSequenceNumber = messageSequenceNumber)) diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt index 5891e8b93..d620f3ce8 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt @@ -1,20 +1,35 @@ package com.lykke.matching.engine.balance.util +import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest +import org.apache.log4j.Logger import org.springframework.beans.factory.annotation.Autowired import java.math.BigDecimal -class TestBalanceHolderWrapper @Autowired constructor (private val balanceUpdateHandlerTest: BalanceUpdateHandlerTest, - private val balancesHolder: BalancesHolder) { +class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateHandlerTest: BalanceUpdateHandlerTest, + private val balancesHolder: BalancesHolder) { - fun updateBalance(clientId: String, assetId: String, balance: Double) { - balancesHolder.updateBalance(null, null, clientId, assetId, BigDecimal.valueOf(balance)) + companion object { + val logger = Logger.getLogger(TestBalanceHolderWrapper::class.java.name) + } + + fun updateBalance(clientId: String, assetId: String, balance: Double, validate: Boolean = false) { + val walletProcessor = balancesHolder.createWalletProcessor(logger, validate) + val currentBalance = balancesHolder.getBalance(clientId, assetId) + walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.valueOf(balance).minus(currentBalance)))) + .apply() + walletProcessor.persistBalances(null, null, null, null) balanceUpdateHandlerTest.clear() } - fun updateReservedBalance(clientId: String, assetId: String, reservedBalance: Double, skip: Boolean = false) { - balancesHolder.updateReservedBalance(null, null, clientId, assetId, BigDecimal.valueOf(reservedBalance), skip) + fun updateReservedBalance(clientId: String, assetId: String, reservedBalance: Double, validate: Boolean = false) { + val walletProcessor = balancesHolder.createWalletProcessor(logger, validate) + val currentReservedBalance = balancesHolder.getReservedBalance(clientId, assetId) + + walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.ZERO, BigDecimal.valueOf(reservedBalance).minus(currentReservedBalance)))) + .apply() + walletProcessor.persistBalances(null, null, null, null) balanceUpdateHandlerTest.clear() } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt index 5e1b40f8a..22a87fe5f 100644 --- a/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt @@ -58,6 +58,7 @@ class FeeProcessorTest { open fun testBackOfficeDatabaseAccessor(): TestBackOfficeDatabaseAccessor { val testBackOfficeDatabaseAccessor = TestBackOfficeDatabaseAccessor() testBackOfficeDatabaseAccessor.addAsset(Asset("USD", 2)) + testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 4)) return testBackOfficeDatabaseAccessor } diff --git a/src/test/kotlin/com/lykke/matching/engine/services/InvalidBalanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/InvalidBalanceTest.kt index e127745f5..bcb2acf04 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/InvalidBalanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/InvalidBalanceTest.kt @@ -224,10 +224,11 @@ class InvalidBalanceTest : AbstractTest() { IncomingLimitOrder(-0.05, 1010.0, "2"), IncomingLimitOrder(-0.1, 1100.0, "3") ))) - testBalanceHolderWrapper.updateReservedBalance("Client1", "ETH", reservedBalance = 0.09) + testSettingDatabaseAccessor.clear() applicationSettingsCache.update() applicationSettingsHolder.update() + testBalanceHolderWrapper.updateReservedBalance("Client1", "ETH", 0.09) clearMessageQueues() singleLimitOrderService.processMessage(messageBuilder.buildLimitOrderWrapper(buildLimitOrder(uid = "4", clientId = "Client2", assetId = "ETHUSD", volume = 0.25, price = 1100.0))) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/MarketOrderServiceTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/MarketOrderServiceTest.kt index 558409b5f..3dde8e4ae 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/MarketOrderServiceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/MarketOrderServiceTest.kt @@ -360,8 +360,7 @@ class MarketOrderServiceTest : AbstractTest() { assertEquals(OrderRejectReason.NOT_ENOUGH_FUNDS, eventMarketOrder.rejectReason) assertEquals(0, eventMarketOrder.trades?.size) - balancesHolder.updateBalance( - ProcessedMessage(MessageType.CASH_IN_OUT_OPERATION.type, System.currentTimeMillis(), "test"), 0, "Client4", "EUR", BigDecimal.valueOf(1000.0)) + testBalanceHolderWrapper.updateBalance("Client4", "EUR", 1000.0) marketOrderService.processMessage(buildMarketOrderWrapper(buildMarketOrder(clientId = "Client4", assetId = "EURUSD", volume = -1000.0))) assertEquals(1, rabbitSwapListener.getCount()) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt index a6c41197b..227196845 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt @@ -5,6 +5,7 @@ import com.lykke.matching.engine.config.TestApplicationContext import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.AssetPair import com.lykke.matching.engine.database.TestBackOfficeDatabaseAccessor +import com.lykke.matching.engine.database.cache.AssetsCache import com.lykke.matching.engine.order.OrderStatus import com.lykke.matching.engine.outgoing.messages.MarketOrderWithTrades import com.lykke.matching.engine.utils.MessageBuilder.Companion.buildLimitOrder @@ -22,14 +23,13 @@ import org.springframework.test.context.junit4.SpringRunner import java.math.BigDecimal import kotlin.test.assertNotNull import com.lykke.matching.engine.utils.assertEquals +import org.springframework.beans.factory.annotation.Autowired import kotlin.test.assertEquals - - @RunWith(SpringRunner::class) @SpringBootTest(classes = [(TestApplicationContext::class), (RoundingTest.Config::class)]) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -class RoundingTest: AbstractTest() { +class RoundingTest : AbstractTest() { @TestConfiguration open class Config { @@ -49,6 +49,9 @@ class RoundingTest: AbstractTest() { } } + @Autowired + private lateinit var assetsCache: AssetsCache + @Before fun setUp() { testDictionariesDatabaseAccessor.addAssetPair(AssetPair("EURUSD", "EUR", "USD", 5)) @@ -110,7 +113,7 @@ class RoundingTest: AbstractTest() { assertEquals("USD", marketOrderReport.trades.first().limitAsset) assertEquals("Client3", marketOrderReport.trades.first().limitClientId) - assertEquals(BigDecimal.valueOf( 1.0), testWalletDatabaseAccessor.getBalance("Client3", "EUR")) + assertEquals(BigDecimal.valueOf(1.0), testWalletDatabaseAccessor.getBalance("Client3", "EUR")) assertEquals(BigDecimal.valueOf(998.89), testWalletDatabaseAccessor.getBalance("Client3", "USD")) assertEquals(BigDecimal.valueOf(1499.0), testWalletDatabaseAccessor.getBalance("Client4", "EUR")) assertEquals(BigDecimal.valueOf(1.11), testWalletDatabaseAccessor.getBalance("Client4", "USD")) @@ -179,7 +182,7 @@ class RoundingTest: AbstractTest() { testBalanceHolderWrapper.updateBalance("Client4", "CHF", 1.0) initServices() - marketOrderService.processMessage(buildMarketOrderWrapper(buildMarketOrder(clientId = "Client4", assetId = "BTCCHF", volume = -0.38, straight = false))) + marketOrderService.processMessage(buildMarketOrderWrapper(buildMarketOrder(clientId = "Client4", assetId = "BTCCHF", volume = -0.38, straight = false))) assertEquals(1, rabbitSwapListener.getCount()) val marketOrderReport = rabbitSwapListener.getQueue().poll() as MarketOrderWithTrades @@ -337,7 +340,7 @@ class RoundingTest: AbstractTest() { fun testNotStraightBuyEURJPY() { testOrderBookWrapper.addLimitOrder(buildLimitOrder(assetId = "EURJPY", price = 116.356, volume = 1000.0, clientId = "Client3")) testBalanceHolderWrapper.updateBalance("Client3", "JPY", 1000.0) - testBalanceHolderWrapper.updateBalance("Client4", "EUR", 0.00999999999999999) + testBalanceHolderWrapper.updateBalance("Client4", "EUR", 0.0) initServices() marketOrderService.processMessage(buildMarketOrderWrapper(buildMarketOrder(clientId = "Client4", assetId = "EURJPY", volume = 1.16, straight = false))) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/StopLimitOrderTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/StopLimitOrderTest.kt index c5220b567..a0125807e 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/StopLimitOrderTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/StopLimitOrderTest.kt @@ -54,6 +54,7 @@ class StopLimitOrderTest : AbstractTest() { testBackOfficeDatabaseAccessor.addAsset(Asset("USD", 2)) testBackOfficeDatabaseAccessor.addAsset(Asset("BTC", 8)) + testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 8)) return testBackOfficeDatabaseAccessor } diff --git a/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt b/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt index 551599553..b86525398 100644 --- a/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt @@ -7,6 +7,7 @@ import com.lykke.matching.engine.daos.AssetPair import com.lykke.matching.engine.daos.order.LimitOrderType import com.lykke.matching.engine.daos.setting.AvailableSettingGroup import com.lykke.matching.engine.database.* +import com.lykke.matching.engine.database.cache.ApplicationSettingsCache import com.lykke.matching.engine.holders.BalancesDatabaseAccessorsHolder import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest import com.lykke.matching.engine.order.utils.TestOrderBookWrapper @@ -30,7 +31,6 @@ import org.springframework.test.context.junit4.SpringRunner import java.math.BigDecimal import kotlin.test.assertEquals import com.lykke.matching.engine.utils.assertEquals -import com.lykke.matching.engine.utils.getSetting import java.util.concurrent.BlockingQueue @RunWith(SpringRunner::class) @@ -51,6 +51,7 @@ class ReservedVolumesRecalculatorTest { return testBackOfficeDatabaseAccessor } + @Bean @Primary open fun testDictionariesDatabaseAccessor(): TestDictionariesDatabaseAccessor { @@ -60,15 +61,6 @@ class ReservedVolumesRecalculatorTest { return testDictionariesDatabaseAccessor } - - @Bean - @Primary - open fun testConfig(): TestSettingsDatabaseAccessor { - val testSettingsDatabaseAccessor = TestSettingsDatabaseAccessor() - testSettingsDatabaseAccessor.createOrUpdateSetting(AvailableSettingGroup.TRUSTED_CLIENTS, getSetting("trustedClient")) - testSettingsDatabaseAccessor.createOrUpdateSetting(AvailableSettingGroup.TRUSTED_CLIENTS, getSetting("trustedClient2")) - return testSettingsDatabaseAccessor - } } @Autowired @@ -77,7 +69,8 @@ class ReservedVolumesRecalculatorTest { @Autowired lateinit var testOrderBookWrapper: TestOrderBookWrapper - @Autowired private + @Autowired + private lateinit var balancesDatabaseAccessorsHolder: BalancesDatabaseAccessorsHolder @Autowired @@ -95,6 +88,9 @@ class ReservedVolumesRecalculatorTest { @Autowired lateinit var balanceUpdateHandlerTest: BalanceUpdateHandlerTest + @Autowired + lateinit var applicationSettingsCache: ApplicationSettingsCache + @Before fun setUp() { testOrderBookWrapper.addLimitOrder(buildLimitOrder(clientId = "trustedClient", assetId = "BTCUSD", price = 10000.0, volume = -1.0, reservedVolume = 0.5)) @@ -134,6 +130,9 @@ class ReservedVolumesRecalculatorTest { testBalanceHolderWrapper.updateBalance("Client2", "USD", 990.0) testBalanceHolderWrapper.updateReservedBalance("Client2", "USD", 1.0) + + applicationSettingsCache.createOrUpdateSettingValue(AvailableSettingGroup.TRUSTED_CLIENTS, "trustedClient", "trustedClient", true) + applicationSettingsCache.createOrUpdateSettingValue(AvailableSettingGroup.TRUSTED_CLIENTS, "trustedClient2", "trustedClient2", true) } @Test @@ -152,7 +151,7 @@ class ReservedVolumesRecalculatorTest { assertEquals(BigDecimal.valueOf(2080.0), testWalletDatabaseAccessor.getReservedBalance("Client2", "USD")) assertEquals(7, reservedVolumesDatabaseAccessor.corrections.size) - assertEquals("1,2", reservedVolumesDatabaseAccessor.corrections.first { NumberUtils.equalsIgnoreScale(it.newReserved, BigDecimal.valueOf( 0.7)) }.orderIds) + assertEquals("1,2", reservedVolumesDatabaseAccessor.corrections.first { NumberUtils.equalsIgnoreScale(it.newReserved, BigDecimal.valueOf(0.7)) }.orderIds) assertEquals("3,4", reservedVolumesDatabaseAccessor.corrections.first { NumberUtils.equalsIgnoreScale(it.newReserved, BigDecimal.valueOf(2080.0)) }.orderIds) assertEquals(1, balanceUpdateHandlerTest.balanceUpdateQueue.size) From c45efd9174617f67c48f909dd1e6e35475f1025d Mon Sep 17 00:00:00 2001 From: papchenko Date: Tue, 18 Dec 2018 12:41:24 +0200 Subject: [PATCH 02/16] LWDEV-9478 do now use persistence manager in wallets processor --- .../balance/WalletOperationsProcessor.kt | 45 +++++++------------ .../services/CashInOutOperationService.kt | 11 ++++- .../services/CashTransferOperationService.kt | 11 ++++- .../ReservedCashInOutOperationService.kt | 12 +++-- .../balance/WalletOperationsProcessorTest.kt | 5 ++- .../balance/util/TestBalanceHolderWrapper.kt | 9 ++-- .../engine/config/TestApplicationContext.kt | 19 ++++---- .../performance/AbstractPerformanceTest.kt | 2 +- ...hTransferOperationBusinessValidatorTest.kt | 5 ++- 9 files changed, 67 insertions(+), 52 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt index f7c129c6d..64c8733ef 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt @@ -3,12 +3,7 @@ package com.lykke.matching.engine.balance import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.daos.wallet.AssetBalance import com.lykke.matching.engine.daos.wallet.Wallet -import com.lykke.matching.engine.database.PersistenceManager -import com.lykke.matching.engine.database.cache.ApplicationSettingsCache import com.lykke.matching.engine.database.common.entity.BalancesData -import com.lykke.matching.engine.database.common.entity.OrderBooksPersistenceData -import com.lykke.matching.engine.database.common.entity.PersistenceData -import com.lykke.matching.engine.deduplication.ProcessedMessage import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.BalancesHolder @@ -25,17 +20,16 @@ import java.util.Date class WalletOperationsProcessor(private val balancesHolder: BalancesHolder, private val currentTransactionBalancesHolder: CurrentTransactionBalancesHolder, private val applicationSettingsHolder: ApplicationSettingsHolder, - private val persistenceManager: PersistenceManager, private val assetsHolder: AssetsHolder, private val validate: Boolean, - private val logger: Logger?): BalancesGetter { + private val logger: Logger?) : BalancesGetter { companion object { private val LOGGER = Logger.getLogger(WalletOperationsProcessor::class.java.name) private val METRICS_LOGGER = MetricsLogger.getLogger() } - private val clientBalanceUpdatesByClientIdAndAssetId = HashMap() + private val clientBalanceUpdatesByClientIdAndAssetId = HashMap() fun preProcess(operations: Collection, forceApply: Boolean = false): WalletOperationsProcessor { if (operations.isEmpty()) { @@ -59,22 +53,26 @@ class WalletOperationsProcessor(private val balancesHolder: BalancesHolder, } if (validate) { - try { - changedAssetBalances.values.forEach { validateBalanceChange(it) } - } catch (e: BalanceException) { - if (!forceApply) { - throw e - } - val message = "Force applying of invalid balance: ${e.message}" - (logger ?: LOGGER).error(message) - METRICS_LOGGER.logError(message, e) - } + validateChangedAssetBalances(changedAssetBalances, forceApply) } changedAssetBalances.forEach { processChangedAssetBalance(it.value) } return this } + private fun validateChangedAssetBalances(changedAssetBalances: HashMap, forceApply: Boolean) { + try { + changedAssetBalances.values.forEach { validateBalanceChange(it) } + } catch (e: BalanceException) { + if (!forceApply) { + throw e + } + val message = "Force applying of invalid balance: ${e.message}" + (logger ?: LOGGER).error(message) + METRICS_LOGGER.logError(message, e) + } + } + private fun processChangedAssetBalance(changedAssetBalance: ChangedAssetBalance) { if (!changedAssetBalance.isChanged()) { return @@ -114,17 +112,6 @@ class WalletOperationsProcessor(private val balancesHolder: BalancesHolder, return currentTransactionBalancesHolder.persistenceData() } - fun persistBalances(processedMessage: ProcessedMessage?, - orderBooksData: OrderBooksPersistenceData?, - stopOrderBooksData: OrderBooksPersistenceData?, - messageSequenceNumber: Long?): Boolean { - return persistenceManager.persist(PersistenceData(persistenceData(), - processedMessage, - orderBooksData, - stopOrderBooksData, - messageSequenceNumber)) - } - fun sendNotification(id: String, type: String, messageId: String) { if (clientBalanceUpdatesByClientIdAndAssetId.isNotEmpty()) { balancesHolder.sendBalanceUpdate(BalanceUpdate(id, type, Date(), clientBalanceUpdatesByClientIdAndAssetId.values.toList(), messageId)) diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt index bf3f6f52b..e92b39bda 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt @@ -4,6 +4,8 @@ import com.lykke.matching.engine.balance.BalanceException import com.lykke.matching.engine.daos.context.CashInOutContext import com.lykke.matching.engine.daos.converters.CashInOutOperationConverter import com.lykke.matching.engine.daos.fee.v2.Fee +import com.lykke.matching.engine.database.PersistenceManager +import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.fee.FeeException import com.lykke.matching.engine.fee.FeeProcessor import com.lykke.matching.engine.holders.BalancesHolder @@ -32,7 +34,8 @@ class CashInOutOperationService(private val balancesHolder: BalancesHolder, private val feeProcessor: FeeProcessor, private val cashInOutOperationBusinessValidator: CashInOutOperationBusinessValidator, private val messageSequenceNumberHolder: MessageSequenceNumberHolder, - private val messageSender: MessageSender) : AbstractService { + private val messageSender: MessageSender, + private val persistenceManager: PersistenceManager) : AbstractService { override fun parseMessage(messageWrapper: MessageWrapper) { //do nothing } @@ -79,7 +82,11 @@ class CashInOutOperationService(private val balancesHolder: BalancesHolder, } val sequenceNumber = messageSequenceNumberHolder.getNewValue() - val updated = walletProcessor.persistBalances(cashInOutContext.processedMessage, null, null, sequenceNumber) + val updated = persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), + cashInOutContext.processedMessage, + null, + null, + sequenceNumber)) messageWrapper.triedToPersist = true messageWrapper.persisted = updated if (!updated) { diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt index e5e1bd21c..0a40b0b03 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt @@ -5,6 +5,8 @@ import com.lykke.matching.engine.daos.TransferOperation import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.daos.context.CashTransferContext import com.lykke.matching.engine.daos.fee.v2.Fee +import com.lykke.matching.engine.database.PersistenceManager +import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.exception.PersistenceException import com.lykke.matching.engine.fee.FeeException import com.lykke.matching.engine.fee.FeeProcessor @@ -40,7 +42,8 @@ class CashTransferOperationService(private val balancesHolder: BalancesHolder, private val feeProcessor: FeeProcessor, private val cashTransferOperationBusinessValidator: CashTransferOperationBusinessValidator, private val messageSequenceNumberHolder: MessageSequenceNumberHolder, - private val messageSender: MessageSender) : AbstractService { + private val messageSender: MessageSender, + private val persistenceManager: PersistenceManager) : AbstractService { override fun parseMessage(messageWrapper: MessageWrapper) { //do nothing } @@ -121,7 +124,11 @@ class CashTransferOperationService(private val balancesHolder: BalancesHolder, walletProcessor.preProcess(operations) val sequenceNumber = messageSequenceNumberHolder.getNewValue() - val updated = walletProcessor.persistBalances(cashTransferContext.processedMessage, null, null, sequenceNumber) + val updated = persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), + cashTransferContext.processedMessage, + null, + null, + sequenceNumber)) messageWrapper.triedToPersist = true messageWrapper.persisted = updated if (!updated) { diff --git a/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt index 934dfab16..80f2a6047 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt @@ -2,7 +2,8 @@ package com.lykke.matching.engine.services import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.balance.BalanceException -import com.lykke.matching.engine.daos.OperationType +import com.lykke.matching.engine.database.PersistenceManager +import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.holders.MessageProcessingStatusHolder @@ -29,7 +30,8 @@ class ReservedCashInOutOperationService @Autowired constructor (private val asse private val balancesHolder: BalancesHolder, private val reservedCashOperationQueue: BlockingQueue, private val reservedCashInOutOperationValidator: ReservedCashInOutOperationValidator, - private val messageProcessingStatusHolder: MessageProcessingStatusHolder) : AbstractService { + private val messageProcessingStatusHolder: MessageProcessingStatusHolder, + private val persistenceManager: PersistenceManager) : AbstractService { companion object { private val LOGGER = Logger.getLogger(ReservedCashInOutOperationService::class.java.name) @@ -73,7 +75,11 @@ class ReservedCashInOutOperationService @Autowired constructor (private val asse return } - val updated = walletProcessor.persistBalances(messageWrapper.processedMessage, null, null, null) + val updated = persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), + messageWrapper.processedMessage, + null, + null, + null)) messageWrapper.triedToPersist = true messageWrapper.persisted = updated if (!updated) { diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt index cfdfa70fb..6243010b7 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt @@ -6,6 +6,7 @@ import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.database.BackOfficeDatabaseAccessor import com.lykke.matching.engine.database.TestBackOfficeDatabaseAccessor +import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import org.junit.Test import org.junit.runner.RunWith @@ -69,7 +70,7 @@ class WalletOperationsProcessorTest : AbstractTest() { ) ) } - assertTrue(walletOperationsProcessor.persistBalances(null, null, null, null)) + assertTrue(persistenceManager.persist(PersistenceData( walletOperationsProcessor.persistenceData(), null, null, null, null))) walletOperationsProcessor.apply().sendNotification("id", "type", "test") assertBalance("Client1", "BTC", 0.5, 0.0) @@ -110,7 +111,7 @@ class WalletOperationsProcessorTest : AbstractTest() { WalletOperation("Client1", "BTC", BigDecimal.ZERO, BigDecimal.valueOf(-0.1)) ), true) - assertTrue(walletOperationsProcessor.persistBalances(null, null, null, null)) + assertTrue(persistenceManager.persist(PersistenceData(walletOperationsProcessor.persistenceData(), null, null, null, null))) walletOperationsProcessor.apply().sendNotification("id", "type","test") assertBalance("Client1", "BTC", 0.0, -0.1) diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt index d620f3ce8..37686a1a8 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt @@ -1,6 +1,8 @@ package com.lykke.matching.engine.balance.util import com.lykke.matching.engine.daos.WalletOperation +import com.lykke.matching.engine.database.PersistenceManager +import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest import org.apache.log4j.Logger @@ -8,7 +10,8 @@ import org.springframework.beans.factory.annotation.Autowired import java.math.BigDecimal class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateHandlerTest: BalanceUpdateHandlerTest, - private val balancesHolder: BalancesHolder) { + private val balancesHolder: BalancesHolder, + private val persistenceManager: PersistenceManager) { companion object { val logger = Logger.getLogger(TestBalanceHolderWrapper::class.java.name) @@ -19,7 +22,7 @@ class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateH val currentBalance = balancesHolder.getBalance(clientId, assetId) walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.valueOf(balance).minus(currentBalance)))) .apply() - walletProcessor.persistBalances(null, null, null, null) + persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), null, null, null, null)) balanceUpdateHandlerTest.clear() } @@ -29,7 +32,7 @@ class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateH walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.ZERO, BigDecimal.valueOf(reservedBalance).minus(currentReservedBalance)))) .apply() - walletProcessor.persistBalances(null, null, null, null) + persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), null, null, null, null)) balanceUpdateHandlerTest.clear() } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index 60a1da568..65c022ca1 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -194,8 +194,9 @@ open class TestApplicationContext { @Bean open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, - balancesHolder: BalancesHolder): TestBalanceHolderWrapper { - return TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder) + balancesHolder: BalancesHolder, + persistenceManager: PersistenceManager): TestBalanceHolderWrapper { + return TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, persistenceManager) } @Bean @@ -259,9 +260,10 @@ open class TestApplicationContext { feeProcessor: FeeProcessor, cashInOutOperationBusinessValidator: CashInOutOperationBusinessValidator, messageSequenceNumberHolder: MessageSequenceNumberHolder, - messageSender: MessageSender): CashInOutOperationService { + messageSender: MessageSender, + persistenceManager: PersistenceManager): CashInOutOperationService { return CashInOutOperationService(balancesHolder, rabbitCashInOutQueue, feeProcessor, - cashInOutOperationBusinessValidator, messageSequenceNumberHolder, messageSender) + cashInOutOperationBusinessValidator, messageSequenceNumberHolder, messageSender, persistenceManager) } @Bean @@ -292,9 +294,10 @@ open class TestApplicationContext { assetsHolder: AssetsHolder, reservedCashOperationQueue: BlockingQueue, reservedCashInOutOperationValidator: ReservedCashInOutOperationValidator, - messageProcessingStatusHolder: MessageProcessingStatusHolder): ReservedCashInOutOperationService { + messageProcessingStatusHolder: MessageProcessingStatusHolder, + persistenceManager: PersistenceManager): ReservedCashInOutOperationService { return ReservedCashInOutOperationService(assetsHolder, balancesHolder, reservedCashOperationQueue, - reservedCashInOutOperationValidator, messageProcessingStatusHolder) + reservedCashInOutOperationValidator, messageProcessingStatusHolder, persistenceManager) } @Bean @@ -557,9 +560,9 @@ open class TestApplicationContext { open fun cashTransferOperationService(balancesHolder: BalancesHolder, notification: BlockingQueue, dbTransferOperationQueue: BlockingQueue, feeProcessor: FeeProcessor, cashTransferOperationBusinessValidator: CashTransferOperationBusinessValidator, messageSequenceNumberHolder: MessageSequenceNumberHolder, - messageSender: MessageSender): CashTransferOperationService { + messageSender: MessageSender, persistenceManager: PersistenceManager): CashTransferOperationService { return CashTransferOperationService(balancesHolder, notification, dbTransferOperationQueue, feeProcessor, - cashTransferOperationBusinessValidator, messageSequenceNumberHolder, messageSender) + cashTransferOperationBusinessValidator, messageSequenceNumberHolder, messageSender, persistenceManager) } @Bean diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index cd553fd53..d0b526f70 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -154,7 +154,7 @@ abstract class AbstractPerformanceTest { balanceUpdateQueue, applicationSettingsHolder) - testBalanceHolderWrapper = TestBalanceHolderWrapper(BalanceUpdateHandlerTest(balanceUpdateQueue), balancesHolder) + testBalanceHolderWrapper = TestBalanceHolderWrapper(BalanceUpdateHandlerTest(balanceUpdateQueue), balancesHolder, persistenceManager) assetPairsCache = AssetPairsCache(testDictionariesDatabaseAccessor) assetsPairsHolder = AssetsPairsHolder(assetPairsCache) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt index 24b53a78c..c8c5c4667 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt @@ -5,6 +5,7 @@ import com.lykke.matching.engine.config.TestApplicationContext import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.context.CashTransferContext import com.lykke.matching.engine.database.BackOfficeDatabaseAccessor +import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.TestBackOfficeDatabaseAccessor import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.incoming.parsers.impl.CashTransferContextParser @@ -54,8 +55,8 @@ class CashTransferOperationBusinessValidatorTest { @Bean @Primary - open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, balancesHolder: BalancesHolder): TestBalanceHolderWrapper { - val testBalanceHolderWrapper = TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder) + open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, balancesHolder: BalancesHolder, persistenceManager: PersistenceManager): TestBalanceHolderWrapper { + val testBalanceHolderWrapper = TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, persistenceManager) testBalanceHolderWrapper.updateBalance(CLIENT_NAME1, ASSET_ID, 100.0) testBalanceHolderWrapper.updateReservedBalance(CLIENT_NAME1, ASSET_ID, 50.0) return testBalanceHolderWrapper From fee59c80ac414eba34350fc0898e49ded158fb79 Mon Sep 17 00:00:00 2001 From: papchenko Date: Tue, 18 Dec 2018 16:30:22 +0200 Subject: [PATCH 03/16] LWDEV-9478 create wallet operations --- .../WalletOperationsProcessorFactory.kt | 24 +++++++++++++ .../matching/engine/holders/BalancesHolder.kt | 12 ------- .../cancel/GenericLimitOrdersCanceller.kt | 6 ++-- .../GenericLimitOrdersCancellerFactory.kt | 3 ++ ...CurrentTransactionBalancesHolderFactory.kt | 11 ++++++ .../transaction/ExecutionContextFactory.kt | 6 ++-- .../services/CashInOutOperationService.kt | 8 ++--- .../services/CashTransferOperationService.kt | 6 ++-- .../ReservedCashInOutOperationService.kt | 6 ++-- .../balance/WalletOperationsProcessorTest.kt | 8 +++-- .../balance/util/TestBalanceHolderWrapper.kt | 6 ++-- .../engine/config/TestApplicationContext.kt | 36 ++++++++++++++----- .../engine/config/TestExecutionContext.kt | 6 ++-- .../performance/AbstractPerformanceTest.kt | 12 +++++-- ...hTransferOperationBusinessValidatorTest.kt | 7 ++-- 15 files changed, 110 insertions(+), 47 deletions(-) create mode 100644 src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt create mode 100644 src/main/kotlin/com/lykke/matching/engine/order/transaction/CurrentTransactionBalancesHolderFactory.kt diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt new file mode 100644 index 000000000..23da3a804 --- /dev/null +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt @@ -0,0 +1,24 @@ +package com.lykke.matching.engine.balance + +import com.lykke.matching.engine.holders.ApplicationSettingsHolder +import com.lykke.matching.engine.holders.AssetsHolder +import com.lykke.matching.engine.holders.BalancesHolder +import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolderFactory +import org.apache.log4j.Logger +import org.springframework.stereotype.Component + +@Component +class WalletOperationsProcessorFactory(private val currentTransactionBalancesHolderFactory: CurrentTransactionBalancesHolderFactory, + private val applicationSettingsHolder: ApplicationSettingsHolder, + private val assetsHolder: AssetsHolder, + private val balancesHolder: BalancesHolder) { + fun create(logger: Logger?, validate: Boolean = true): WalletOperationsProcessor { + + return WalletOperationsProcessor(balancesHolder, + currentTransactionBalancesHolderFactory.create(), + applicationSettingsHolder, + assetsHolder, + validate, + logger) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt index 3cbd540c1..448165fe6 100644 --- a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt +++ b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt @@ -98,18 +98,6 @@ class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAcce fun isTrustedClient(clientId: String) = applicationSettingsHolder.isTrustedClient(clientId) - fun createWalletProcessor(logger: Logger?, validate: Boolean = true): WalletOperationsProcessor { - return WalletOperationsProcessor(this, - createCurrentTransactionBalancesHolder(), - applicationSettingsHolder, - persistenceManager, - assetsHolder, - validate, - logger) - } - - private fun createCurrentTransactionBalancesHolder() = CurrentTransactionBalancesHolder(this) - fun setWallets(wallets: Collection) { wallets.forEach { wallet -> this.wallets[wallet.clientId] = wallet diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt index bce00d14d..1ba3380de 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt @@ -1,5 +1,6 @@ package com.lykke.matching.engine.order.cancel +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.daos.AssetPair import com.lykke.matching.engine.daos.LimitOrder import com.lykke.matching.engine.database.DictionariesDatabaseAccessor @@ -23,7 +24,8 @@ class GenericLimitOrdersCanceller(private val executionContextFactory: Execution dictionariesDatabaseAccessor: DictionariesDatabaseAccessor, assetsHolder: AssetsHolder, private val assetsPairsHolder: AssetsPairsHolder, - private val balancesHolder: BalancesHolder, + balancesHolder: BalancesHolder, + private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, genericLimitOrderService: GenericLimitOrderService, genericStopLimitOrderService: GenericStopLimitOrderService, private val date: Date, @@ -91,7 +93,7 @@ class GenericLimitOrdersCanceller(private val executionContextFactory: Execution assetPairsById, date, LOGGER, - walletOperationsProcessor = balancesHolder.createWalletProcessor(LOGGER, validateBalances)) + walletOperationsProcessor = walletOperationsProcessorFactory.create(LOGGER, validateBalances)) executionContext.walletOperationsProcessor.preProcess(limitOrdersCancelResult.walletOperations .plus(stopLimitOrdersResult.walletOperations)) diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt index f8af05327..dda480cd2 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt @@ -1,5 +1,6 @@ package com.lykke.matching.engine.order.cancel +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.database.DictionariesDatabaseAccessor import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.AssetsPairsHolder @@ -22,6 +23,7 @@ class GenericLimitOrdersCancellerFactory @Autowired constructor(private val exec private val assetsHolder: AssetsHolder, private val assetsPairsHolder: AssetsPairsHolder, private val balancesHolder: BalancesHolder, + private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val genericLimitOrderService: GenericLimitOrderService, private val genericStopLimitOrderService: GenericStopLimitOrderService) { @@ -34,6 +36,7 @@ class GenericLimitOrdersCancellerFactory @Autowired constructor(private val exec assetsHolder, assetsPairsHolder, balancesHolder, + walletOperationsProcessorFactory, genericLimitOrderService, genericStopLimitOrderService, date, diff --git a/src/main/kotlin/com/lykke/matching/engine/order/transaction/CurrentTransactionBalancesHolderFactory.kt b/src/main/kotlin/com/lykke/matching/engine/order/transaction/CurrentTransactionBalancesHolderFactory.kt new file mode 100644 index 000000000..861538756 --- /dev/null +++ b/src/main/kotlin/com/lykke/matching/engine/order/transaction/CurrentTransactionBalancesHolderFactory.kt @@ -0,0 +1,11 @@ +package com.lykke.matching.engine.order.transaction + +import com.lykke.matching.engine.holders.BalancesHolder +import org.springframework.stereotype.Component + +@Component +class CurrentTransactionBalancesHolderFactory(val balancesHolder: BalancesHolder) { + fun create(): CurrentTransactionBalancesHolder { + return CurrentTransactionBalancesHolder(balancesHolder) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/order/transaction/ExecutionContextFactory.kt b/src/main/kotlin/com/lykke/matching/engine/order/transaction/ExecutionContextFactory.kt index 0e41aebb4..fb1bdc0bf 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/transaction/ExecutionContextFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/transaction/ExecutionContextFactory.kt @@ -1,11 +1,11 @@ package com.lykke.matching.engine.order.transaction import com.lykke.matching.engine.balance.WalletOperationsProcessor +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.AssetPair import com.lykke.matching.engine.deduplication.ProcessedMessage import com.lykke.matching.engine.holders.AssetsHolder -import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.messages.MessageType import com.lykke.matching.engine.services.GenericLimitOrderService import com.lykke.matching.engine.services.GenericStopLimitOrderService @@ -15,7 +15,7 @@ import org.springframework.stereotype.Component import java.util.Date @Component -class ExecutionContextFactory(private val balancesHolder: BalancesHolder, +class ExecutionContextFactory(private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val genericLimitOrderService: GenericLimitOrderService, private val genericStopLimitOrderService: GenericStopLimitOrderService, private val assetsHolder: AssetsHolder) { @@ -29,7 +29,7 @@ class ExecutionContextFactory(private val balancesHolder: BalancesHolder, logger: Logger, assetsById: Map = getAssetsByIdMap(assetPairsById), preProcessorValidationResultsByOrderId: Map = emptyMap(), - walletOperationsProcessor: WalletOperationsProcessor = balancesHolder.createWalletProcessor(logger), + walletOperationsProcessor: WalletOperationsProcessor = walletOperationsProcessorFactory.create(logger), orderBooksHolder: CurrentTransactionOrderBooksHolder = genericLimitOrderService.createCurrentTransactionOrderBooksHolder(), stopOrderBooksHolder: CurrentTransactionStopOrderBooksHolder = genericStopLimitOrderService.createCurrentTransactionOrderBooksHolder()): ExecutionContext { return ExecutionContext(messageId, diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt index e92b39bda..f641ad9e7 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt @@ -1,6 +1,7 @@ package com.lykke.matching.engine.services import com.lykke.matching.engine.balance.BalanceException +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.daos.context.CashInOutContext import com.lykke.matching.engine.daos.converters.CashInOutOperationConverter import com.lykke.matching.engine.daos.fee.v2.Fee @@ -8,7 +9,6 @@ import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.fee.FeeException import com.lykke.matching.engine.fee.FeeProcessor -import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.holders.MessageSequenceNumberHolder import com.lykke.matching.engine.messages.MessageStatus import com.lykke.matching.engine.messages.MessageStatus.INVALID_FEE @@ -29,9 +29,9 @@ import java.util.* import java.util.concurrent.BlockingQueue @Service -class CashInOutOperationService(private val balancesHolder: BalancesHolder, - private val rabbitCashInOutQueue: BlockingQueue, +class CashInOutOperationService(private val rabbitCashInOutQueue: BlockingQueue, private val feeProcessor: FeeProcessor, + private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val cashInOutOperationBusinessValidator: CashInOutOperationBusinessValidator, private val messageSequenceNumberHolder: MessageSequenceNumberHolder, private val messageSender: MessageSender, @@ -73,7 +73,7 @@ class CashInOutOperationService(private val balancesHolder: BalancesHolder, return } - val walletProcessor = balancesHolder.createWalletProcessor(LOGGER) + val walletProcessor = walletOperationsProcessorFactory.create(LOGGER) try { walletProcessor.preProcess(operations) } catch (e: BalanceException) { diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt index 0a40b0b03..89ab36fe3 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt @@ -1,6 +1,7 @@ package com.lykke.matching.engine.services import com.lykke.matching.engine.balance.BalanceException +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.daos.TransferOperation import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.daos.context.CashTransferContext @@ -11,7 +12,6 @@ import com.lykke.matching.engine.exception.PersistenceException import com.lykke.matching.engine.fee.FeeException import com.lykke.matching.engine.fee.FeeProcessor import com.lykke.matching.engine.fee.singleFeeTransfer -import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.holders.MessageSequenceNumberHolder import com.lykke.matching.engine.messages.MessageStatus import com.lykke.matching.engine.messages.MessageStatus.INVALID_FEE @@ -36,7 +36,7 @@ import java.util.LinkedList import java.util.concurrent.BlockingQueue @Service -class CashTransferOperationService(private val balancesHolder: BalancesHolder, +class CashTransferOperationService(private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val notificationQueue: BlockingQueue, private val dbTransferOperationQueue: BlockingQueue, private val feeProcessor: FeeProcessor, @@ -120,7 +120,7 @@ class CashTransferOperationService(private val balancesHolder: BalancesHolder, val fees = feeProcessor.processFee(operation.fees, receiptOperation, operations) - val walletProcessor = balancesHolder.createWalletProcessor(LOGGER, false) + val walletProcessor = walletOperationsProcessorFactory.create(LOGGER, false) walletProcessor.preProcess(operations) val sequenceNumber = messageSequenceNumberHolder.getNewValue() diff --git a/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt index 80f2a6047..64bb42b40 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt @@ -2,10 +2,10 @@ package com.lykke.matching.engine.services import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.balance.BalanceException +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.holders.AssetsHolder -import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.holders.MessageProcessingStatusHolder import com.lykke.matching.engine.messages.MessageStatus import com.lykke.matching.engine.messages.MessageType @@ -27,7 +27,7 @@ import java.util.concurrent.BlockingQueue @Service class ReservedCashInOutOperationService @Autowired constructor (private val assetsHolder: AssetsHolder, - private val balancesHolder: BalancesHolder, + private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val reservedCashOperationQueue: BlockingQueue, private val reservedCashInOutOperationValidator: ReservedCashInOutOperationValidator, private val messageProcessingStatusHolder: MessageProcessingStatusHolder, @@ -66,7 +66,7 @@ class ReservedCashInOutOperationService @Autowired constructor (private val asse val accuracy = asset.accuracy - val walletProcessor = balancesHolder.createWalletProcessor(LOGGER) + val walletProcessor = walletOperationsProcessorFactory.create(LOGGER) try { walletProcessor.preProcess(listOf(operation)) } catch (e: BalanceException) { diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt index 6243010b7..194e2e02b 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt @@ -19,6 +19,7 @@ import org.springframework.test.context.junit4.SpringRunner import java.math.BigDecimal import kotlin.test.assertEquals import com.lykke.matching.engine.utils.assertEquals +import org.springframework.beans.factory.annotation.Autowired import kotlin.test.assertFailsWith import kotlin.test.assertFalse import kotlin.test.assertNotNull @@ -42,13 +43,16 @@ class WalletOperationsProcessorTest : AbstractTest() { } } + @Autowired + private lateinit var walletOperationsProcessorFactory: WalletOperationsProcessorFactory + @Test fun testPreProcessWalletOperations() { testBalanceHolderWrapper.updateBalance("Client1", "BTC", 1.0) testBalanceHolderWrapper.updateReservedBalance("Client1", "BTC", 0.1) initServices() - val walletOperationsProcessor = balancesHolder.createWalletProcessor(null, true) + val walletOperationsProcessor = walletOperationsProcessorFactory.create(null, true) walletOperationsProcessor.preProcess( listOf( @@ -104,7 +108,7 @@ class WalletOperationsProcessorTest : AbstractTest() { fun testForceProcessInvalidWalletOperations() { initServices() - val walletOperationsProcessor = balancesHolder.createWalletProcessor(null, true) + val walletOperationsProcessor = walletOperationsProcessorFactory.create(null, true) walletOperationsProcessor.preProcess( listOf( diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt index 37686a1a8..87b099e15 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt @@ -1,5 +1,6 @@ package com.lykke.matching.engine.balance.util +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.common.entity.PersistenceData @@ -11,6 +12,7 @@ import java.math.BigDecimal class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateHandlerTest: BalanceUpdateHandlerTest, private val balancesHolder: BalancesHolder, + private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val persistenceManager: PersistenceManager) { companion object { @@ -18,7 +20,7 @@ class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateH } fun updateBalance(clientId: String, assetId: String, balance: Double, validate: Boolean = false) { - val walletProcessor = balancesHolder.createWalletProcessor(logger, validate) + val walletProcessor = walletOperationsProcessorFactory.create(logger, validate) val currentBalance = balancesHolder.getBalance(clientId, assetId) walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.valueOf(balance).minus(currentBalance)))) .apply() @@ -27,7 +29,7 @@ class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateH } fun updateReservedBalance(clientId: String, assetId: String, reservedBalance: Double, validate: Boolean = false) { - val walletProcessor = balancesHolder.createWalletProcessor(logger, validate) + val walletProcessor = walletOperationsProcessorFactory.create(logger, validate) val currentReservedBalance = balancesHolder.getReservedBalance(clientId, assetId) walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.ZERO, BigDecimal.valueOf(reservedBalance).minus(currentReservedBalance)))) diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index 65c022ca1..f8da2e857 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -1,5 +1,6 @@ package com.lykke.matching.engine.config +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.balance.util.TestBalanceHolderWrapper import com.lykke.matching.engine.config.spring.JsonConfig import com.lykke.matching.engine.config.spring.QueueConfig @@ -30,6 +31,7 @@ import com.lykke.matching.engine.order.process.GenericLimitOrdersProcessor import com.lykke.matching.engine.order.process.PreviousLimitOrdersProcessor import com.lykke.matching.engine.order.process.StopOrderBookProcessor import com.lykke.matching.engine.order.process.common.MatchingResultHandlingHelper +import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolderFactory import com.lykke.matching.engine.order.transaction.ExecutionContextFactory import com.lykke.matching.engine.order.utils.TestOrderBookWrapper import com.lykke.matching.engine.outgoing.messages.* @@ -195,8 +197,9 @@ open class TestApplicationContext { @Bean open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, balancesHolder: BalancesHolder, - persistenceManager: PersistenceManager): TestBalanceHolderWrapper { - return TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, persistenceManager) + persistenceManager: PersistenceManager, + walletOperationsProcessorFactory: WalletOperationsProcessorFactory): TestBalanceHolderWrapper { + return TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, walletOperationsProcessorFactory, persistenceManager) } @Bean @@ -255,14 +258,14 @@ open class TestApplicationContext { } @Bean - open fun cashInOutOperationService(balancesHolder: BalancesHolder, + open fun cashInOutOperationService(walletOperationsProcessorFactory: WalletOperationsProcessorFactory, rabbitCashInOutQueue: BlockingQueue, feeProcessor: FeeProcessor, cashInOutOperationBusinessValidator: CashInOutOperationBusinessValidator, messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender, persistenceManager: PersistenceManager): CashInOutOperationService { - return CashInOutOperationService(balancesHolder, rabbitCashInOutQueue, feeProcessor, + return CashInOutOperationService(rabbitCashInOutQueue, feeProcessor, walletOperationsProcessorFactory, cashInOutOperationBusinessValidator, messageSequenceNumberHolder, messageSender, persistenceManager) } @@ -290,13 +293,13 @@ open class TestApplicationContext { } @Bean - open fun reservedCashInOutOperation(balancesHolder: BalancesHolder, + open fun reservedCashInOutOperation(walletOperationsProcessorFactory: WalletOperationsProcessorFactory, assetsHolder: AssetsHolder, reservedCashOperationQueue: BlockingQueue, reservedCashInOutOperationValidator: ReservedCashInOutOperationValidator, messageProcessingStatusHolder: MessageProcessingStatusHolder, persistenceManager: PersistenceManager): ReservedCashInOutOperationService { - return ReservedCashInOutOperationService(assetsHolder, balancesHolder, reservedCashOperationQueue, + return ReservedCashInOutOperationService(assetsHolder, walletOperationsProcessorFactory, reservedCashOperationQueue, reservedCashInOutOperationValidator, messageProcessingStatusHolder, persistenceManager) } @@ -409,11 +412,13 @@ open class TestApplicationContext { rabbitOrderBookQueue: BlockingQueue, clientLimitOrdersQueue: BlockingQueue, trustedClientsLimitOrdersQueue: BlockingQueue, + walletOperationsProcessorFactory: WalletOperationsProcessorFactory, messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender): GenericLimitOrdersCancellerFactory { return GenericLimitOrdersCancellerFactory(executionContextFactory, stopOrderBookProcessor, executionDataApplyService, - dictionariesDatabaseAccessor, assetsHolder, assetsPairsHolder, balancesHolder, genericLimitOrderService, + dictionariesDatabaseAccessor, assetsHolder, assetsPairsHolder, balancesHolder, walletOperationsProcessorFactory, + genericLimitOrderService, genericStopLimitOrderService) } @@ -557,11 +562,11 @@ open class TestApplicationContext { } @Bean - open fun cashTransferOperationService(balancesHolder: BalancesHolder, notification: BlockingQueue, + open fun cashTransferOperationService(walletOperationsProcessorFactory: WalletOperationsProcessorFactory, notification: BlockingQueue, dbTransferOperationQueue: BlockingQueue, feeProcessor: FeeProcessor, cashTransferOperationBusinessValidator: CashTransferOperationBusinessValidator, messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender, persistenceManager: PersistenceManager): CashTransferOperationService { - return CashTransferOperationService(balancesHolder, notification, dbTransferOperationQueue, feeProcessor, + return CashTransferOperationService(walletOperationsProcessorFactory, notification, dbTransferOperationQueue, feeProcessor, cashTransferOperationBusinessValidator, messageSequenceNumberHolder, messageSender, persistenceManager) } @@ -677,4 +682,17 @@ open class TestApplicationContext { messageProcessingStatusHolder, logger) } + + @Bean + open fun currentTransactionBalancesHolderFactory(balancesHolder: BalancesHolder): CurrentTransactionBalancesHolderFactory { + return CurrentTransactionBalancesHolderFactory(balancesHolder) + } + + @Bean + open fun walletOperationsProcessorFactory(currentTransactionBalancesHolderFactory: CurrentTransactionBalancesHolderFactory, + applicationSettingsHolder: ApplicationSettingsHolder, + assetsHolder: AssetsHolder, + balancesHolder: BalancesHolder): WalletOperationsProcessorFactory { + return WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, applicationSettingsHolder, assetsHolder, balancesHolder) + } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt index b3575eafe..acc9e5676 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt @@ -1,8 +1,8 @@ package com.lykke.matching.engine.config +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.daos.LkkTrade import com.lykke.matching.engine.database.PersistenceManager -import com.lykke.matching.engine.database.cache.ApplicationSettingsCache import com.lykke.matching.engine.fee.FeeProcessor import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder @@ -46,11 +46,11 @@ open class TestExecutionContext { } @Bean - open fun executionContextFactory(balancesHolder: BalancesHolder, + open fun executionContextFactory(walletOperationsProcessorFactory: WalletOperationsProcessorFactory, genericLimitOrderService: GenericLimitOrderService, genericStopLimitOrderService: GenericStopLimitOrderService, assetsHolder: AssetsHolder): ExecutionContextFactory { - return ExecutionContextFactory(balancesHolder, + return ExecutionContextFactory(walletOperationsProcessorFactory, genericLimitOrderService, genericStopLimitOrderService, assetsHolder) diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index d0b526f70..92bf0564e 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -1,5 +1,6 @@ package com.lykke.matching.engine.performance +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.balance.util.TestBalanceHolderWrapper import com.lykke.matching.engine.daos.LkkTrade import com.lykke.matching.engine.daos.TradeInfo @@ -34,6 +35,7 @@ import com.lykke.matching.engine.order.process.PreviousLimitOrdersProcessor import com.lykke.matching.engine.order.process.StopLimitOrderProcessor import com.lykke.matching.engine.order.process.StopOrderBookProcessor import com.lykke.matching.engine.order.process.common.MatchingResultHandlingHelper +import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolderFactory import com.lykke.matching.engine.order.transaction.ExecutionContextFactory import com.lykke.matching.engine.order.transaction.ExecutionEventsSequenceNumbersGenerator import com.lykke.matching.engine.outgoing.messages.BalanceUpdate @@ -123,6 +125,11 @@ abstract class AbstractPerformanceTest { val tradeInfoQueue = LinkedBlockingQueue() + val currentTransactionBalancesHolderFactory = CurrentTransactionBalancesHolderFactory(balancesHolder) + + val walletOperationsProcessorFactory = WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, + applicationSettingsHolder, assetsHolder, balancesHolder) + private fun clearMessageQueues() { rabbitEventsQueue.clear() rabbitTrustedClientsEventsQueue.clear() @@ -154,7 +161,7 @@ abstract class AbstractPerformanceTest { balanceUpdateQueue, applicationSettingsHolder) - testBalanceHolderWrapper = TestBalanceHolderWrapper(BalanceUpdateHandlerTest(balanceUpdateQueue), balancesHolder, persistenceManager) + testBalanceHolderWrapper = TestBalanceHolderWrapper(BalanceUpdateHandlerTest(balanceUpdateQueue), balancesHolder, walletOperationsProcessorFactory, persistenceManager) assetPairsCache = AssetPairsCache(testDictionariesDatabaseAccessor) assetsPairsHolder = AssetsPairsHolder(assetPairsCache) @@ -193,7 +200,7 @@ abstract class AbstractPerformanceTest { executionPersistenceService, executionEventSender) - val executionContextFactory = ExecutionContextFactory(balancesHolder, + val executionContextFactory = ExecutionContextFactory(walletOperationsProcessorFactory, genericLimitOrderService, genericStopLimitOrderService, assetsHolder) @@ -224,6 +231,7 @@ abstract class AbstractPerformanceTest { assetsHolder, assetsPairsHolder, balancesHolder, + walletOperationsProcessorFactory, genericLimitOrderService, genericStopLimitOrderService) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt index c8c5c4667..cc4ae2109 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt @@ -1,5 +1,6 @@ package com.lykke.matching.engine.services.validator.business +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.balance.util.TestBalanceHolderWrapper import com.lykke.matching.engine.config.TestApplicationContext import com.lykke.matching.engine.daos.Asset @@ -55,8 +56,10 @@ class CashTransferOperationBusinessValidatorTest { @Bean @Primary - open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, balancesHolder: BalancesHolder, persistenceManager: PersistenceManager): TestBalanceHolderWrapper { - val testBalanceHolderWrapper = TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, persistenceManager) + open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, balancesHolder: BalancesHolder, + walletOperationsProcessorFactory: WalletOperationsProcessorFactory, + persistenceManager: PersistenceManager): TestBalanceHolderWrapper { + val testBalanceHolderWrapper = TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, walletOperationsProcessorFactory, persistenceManager) testBalanceHolderWrapper.updateBalance(CLIENT_NAME1, ASSET_ID, 100.0) testBalanceHolderWrapper.updateReservedBalance(CLIENT_NAME1, ASSET_ID, 50.0) return testBalanceHolderWrapper From 998c1c73c1855716d13ad15649bc106d125c2cba Mon Sep 17 00:00:00 2001 From: papchenko Date: Wed, 19 Dec 2018 19:55:15 +0200 Subject: [PATCH 04/16] LWDEV-9478 add console log, add balances service --- src/dist/cfg/log4j.properties | 9 +++ .../AccountsMigrationService.kt | 65 ++++++++++--------- .../reconciliation/OrdersMigrationService.kt | 13 ++-- .../matching/engine/holders/BalancesHolder.kt | 13 ---- .../engine/services/BalancesService.kt | 7 ++ .../engine/services/BalancesServiceImpl.kt | 37 +++++++++++ .../balance/ReservedVolumesRecalculator.kt | 26 ++++---- .../engine/config/TestApplicationContext.kt | 17 +++-- .../performance/AbstractPerformanceTest.kt | 2 - .../services/CashInOutOperationServiceTest.kt | 7 +- 10 files changed, 120 insertions(+), 76 deletions(-) create mode 100644 src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt create mode 100644 src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt diff --git a/src/dist/cfg/log4j.properties b/src/dist/cfg/log4j.properties index 2210158aa..dbf9bc150 100644 --- a/src/dist/cfg/log4j.properties +++ b/src/dist/cfg/log4j.properties @@ -19,6 +19,15 @@ log4j.additivity.com.lykke.matching.engine.utils.order.MinVolumeOrderCanceller=f log4j.logger.com.lykke.matching.engine.utils.order.AllOrdersCanceller=info, console, file log4j.additivity.com.lykke.matching.engine.utils.order.AllOrdersCanceller=false +log4j.logger.com.lykke.matching.engine.database.reconciliation.AccountsMigrationService=info, console, file +log4j.additivity.com.lykke.matching.engine.database.reconciliation.AccountsMigrationService=false + +log4j.logger.com.lykke.matching.engine.database.reconciliation.OrdersMigrationService=info, console, file +log4j.additivity.com.lykke.matching.engine.database.reconciliation.OrdersMigrationService=false + +log4j.logger.com.lykke.matching.engine.utils.balance.ReservedVolumesRecalculator=info, console, file +log4j.additivity.com.lykke.matching.engine.utils.balance.ReservedVolumesRecalculator=false + log4j.logger.com.lykke.matching.engine.services.events.listeners.MessageProcessingSwitchListener=info, console, file log4j.additivity.com.lykke.matching.engine.services.events.listeners.MessageProcessingSwitchListener=false diff --git a/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/AccountsMigrationService.kt b/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/AccountsMigrationService.kt index fb28c4c6d..27e078515 100644 --- a/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/AccountsMigrationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/AccountsMigrationService.kt @@ -5,7 +5,7 @@ import com.lykke.matching.engine.database.Storage import com.lykke.matching.engine.database.azure.AzureWalletDatabaseAccessor import com.lykke.matching.engine.database.redis.accessor.impl.RedisWalletDatabaseAccessor import com.lykke.matching.engine.exception.MatchingEngineException -import com.lykke.matching.engine.holders.BalancesHolder +import com.lykke.matching.engine.services.BalancesService import com.lykke.matching.engine.utils.config.Config import org.apache.log4j.Logger import org.springframework.beans.factory.annotation.Autowired @@ -17,9 +17,9 @@ import java.util.* @Component @Order(1) -class AccountsMigrationService @Autowired constructor (private val balancesHolder: BalancesHolder, - private val config: Config, - private val redisWalletDatabaseAccessor: Optional): ApplicationRunner { +class AccountsMigrationService @Autowired constructor (private val config: Config, + private val redisWalletDatabaseAccessor: Optional, + private val balancesService: BalancesService): ApplicationRunner { override fun run(args: ApplicationArguments?) { if (config.me.walletsMigration) { migrateAccounts() @@ -55,38 +55,41 @@ class AccountsMigrationService @Autowired constructor (private val balancesHolde } val startTime = Date().time - teeLog("Starting wallets migration from azure to redis; azure table: $azureAccountsTableName, redis: ${config.me.redis.host}.${config.me.redis.port}") + LOGGER.info("Starting wallets migration from azure to redis; azure table: $azureAccountsTableName, redis: ${config.me.redis.host}.${config.me.redis.port}") val wallets = azureDatabaseAccessor.loadWallets() val loadTime = Date().time - teeLog("Loaded ${wallets.size} wallets from azure (ms: ${loadTime - startTime})") - balancesHolder.insertOrUpdateWallets(wallets.values.toList(), null) + LOGGER.info("Loaded ${wallets.size} wallets from azure (ms: ${loadTime - startTime})") + val balancesSaved = balancesService.insertOrUpdateWallets(wallets.values.toList(), null) + if (!balancesSaved) { + LOGGER.error("Can not save balances data during migration from azure db to redis") + return + } val saveTime = Date().time - teeLog("Saved ${wallets.size} wallets to redis (ms: ${saveTime - loadTime})") + LOGGER.info("Saved ${wallets.size} wallets to redis (ms: ${saveTime - loadTime})") compare() } fun fromRedisToDb() { val startTime = Date().time - teeLog("Starting wallets migration from redis to azure; redis: ${config.me.redis.host}.${config.me.redis.port}, azure table: $azureAccountsTableName") + LOGGER.info("Starting wallets migration from redis to azure; redis: ${config.me.redis.host}.${config.me.redis.port}, azure table: $azureAccountsTableName") val loadTime = Date().time val wallets = redisWalletDatabaseAccessor.get().loadWallets() if (wallets.isEmpty()) { throw AccountsMigrationException("There are no wallets in redis ${config.me.redis.host}.${config.me.redis.port}") } - teeLog("Loaded ${wallets.size} wallets from redis (ms: ${loadTime - startTime})") - balancesHolder.insertOrUpdateWallets(wallets.values.toList(), null) + LOGGER.info("Loaded ${wallets.size} wallets from redis (ms: ${loadTime - startTime})") + val balancesSaved = balancesService.insertOrUpdateWallets(wallets.values.toList(), null) + if (!balancesSaved) { + LOGGER.error("Can not save balances data during migration from redis to azure db") + return + } val saveTime = Date().time - teeLog("Saved ${wallets.size} wallets to azure (ms: ${saveTime - loadTime})") + LOGGER.info("Saved ${wallets.size} wallets to azure (ms: ${saveTime - loadTime})") compare() } - private fun teeLog(message: String) { - println(message) - LOGGER.info(message) - } - /** Compares balances stored in redis & azure; logs comparison result */ private fun compare() { val azureWallets = azureDatabaseAccessor.loadWallets().filter { it.value.balances.isNotEmpty() } @@ -98,8 +101,8 @@ class AccountsMigrationService @Autowired constructor (private val balancesHolde val differentWallets = LinkedList() - teeLog("Comparison result. Differences: ") - teeLog("---------------------------------------------------------------------------------------------") + LOGGER.info("Comparison result. Differences: ") + LOGGER.info("---------------------------------------------------------------------------------------------") commonClients.forEach { val azureWallet = azureWallets[it] val redisWallet = redisWallets[it] @@ -107,19 +110,19 @@ class AccountsMigrationService @Autowired constructor (private val balancesHolde differentWallets.add(it) } } - teeLog("---------------------------------------------------------------------------------------------") - - teeLog("Total: ") - teeLog("azure clients count: ${azureWallets.size}") - teeLog("redis clients count: ${redisWallets.size}") - teeLog("only azure clients (count: ${onlyAzureClients.size}): $onlyAzureClients") - teeLog("only redis clients (count: ${onlyRedisClients.size}): $onlyRedisClients") - teeLog("clients with different wallets (count: ${differentWallets.size}): $differentWallets") + LOGGER.info("---------------------------------------------------------------------------------------------") + + LOGGER.info("Total: ") + LOGGER.info("azure clients count: ${azureWallets.size}") + LOGGER.info("redis clients count: ${redisWallets.size}") + LOGGER.info("only azure clients (count: ${onlyAzureClients.size}): $onlyAzureClients") + LOGGER.info("only redis clients (count: ${onlyRedisClients.size}): $onlyRedisClients") + LOGGER.info("clients with different wallets (count: ${differentWallets.size}): $differentWallets") } private fun compareBalances(azureWallet: Wallet, redisWallet: Wallet): Boolean { if (azureWallet.clientId != redisWallet.clientId) { - teeLog("different clients: ${azureWallet.clientId} & ${redisWallet.clientId}") + LOGGER.info("different clients: ${azureWallet.clientId} & ${redisWallet.clientId}") return false } val clientId = azureWallet.clientId @@ -130,7 +133,7 @@ class AccountsMigrationService @Autowired constructor (private val balancesHolde val onlyRedisAssets = redisBalances.keys.filterNot { azureBalances.keys.contains(it) } if (onlyAzureAssets.isNotEmpty() || onlyRedisAssets.isNotEmpty()) { - teeLog("different asset sets: $onlyAzureAssets & $onlyRedisAssets, client: $clientId") + LOGGER.info("different asset sets: $onlyAzureAssets & $onlyRedisAssets, client: $clientId") return false } @@ -139,11 +142,11 @@ class AccountsMigrationService @Autowired constructor (private val balancesHolde val azureBalance = azureBalances[it] val redisBalance = redisBalances[it] if (azureBalance!!.balance != redisBalance!!.balance) { - teeLog("different balances: ${azureBalance.balance} & ${redisBalance.balance}, client: $clientId") + LOGGER.info("different balances: ${azureBalance.balance} & ${redisBalance.balance}, client: $clientId") return false } if (azureBalance.reserved != redisBalance.reserved) { - teeLog("different reserved balances: ${azureBalance.reserved} & ${redisBalance.reserved}, client: $clientId") + LOGGER.info("different reserved balances: ${azureBalance.reserved} & ${redisBalance.reserved}, client: $clientId") return false } } diff --git a/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/OrdersMigrationService.kt b/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/OrdersMigrationService.kt index ad3cbbab1..b361296ed 100644 --- a/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/OrdersMigrationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/database/reconciliation/OrdersMigrationService.kt @@ -45,7 +45,7 @@ class OrdersMigrationService(private val config: Config, return } if (config.me.storage != Storage.Redis) { - teeLog("Do not perform migration to files") + LOGGER.info("Do not perform migration to files") return } fromFilesToRedis() @@ -59,12 +59,12 @@ class OrdersMigrationService(private val config: Config, throw Exception("Stop orders already exist in redis ${config.me.redis.host}.${config.me.redis.port}/${config.me.redis.ordersDatabase}") } val startTime = Date().time - teeLog("Starting orders migration from files to redis; files dirs: ${config.me.orderBookPath}, ${config.me.stopOrderBookPath}" + + LOGGER.info("Starting orders migration from files to redis; files dirs: ${config.me.orderBookPath}, ${config.me.stopOrderBookPath}" + ", redis: ${config.me.redis.host}.${config.me.redis.port}/${config.me.redis.ordersDatabase}") val orders = fileOrderBookDatabaseAccessor.loadLimitOrders() val stopOrders = fileStopOrderBookDatabaseAccessor.loadStopLimitOrders() val loadTime = Date().time - teeLog("Loaded ${orders.size} orders from files (ms: ${loadTime - startTime})") + LOGGER.info("Loaded ${orders.size} orders from files (ms: ${loadTime - startTime})") persistenceManager.persist(PersistenceData(null, null, OrderBooksPersistenceData(mapOrdersToOrderBookPersistenceDataList(orders, LOGGER), @@ -77,11 +77,6 @@ class OrdersMigrationService(private val config: Config, genericLimitOrderService.update() genericStopLimitOrderService.update() val saveTime = Date().time - teeLog("Saved ${orders.size} orders and ${stopOrders.size} stop orders to redis (ms: ${saveTime - loadTime})") - } - - private fun teeLog(message: String) { - println(message) - LOGGER.info(message) + LOGGER.info("Saved ${orders.size} orders and ${stopOrders.size} stop orders to redis (ms: ${saveTime - loadTime})") } } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt index 448165fe6..31e081db2 100644 --- a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt +++ b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt @@ -1,14 +1,9 @@ package com.lykke.matching.engine.holders import com.lykke.matching.engine.balance.BalancesGetter -import com.lykke.matching.engine.balance.WalletOperationsProcessor import com.lykke.matching.engine.daos.wallet.AssetBalance import com.lykke.matching.engine.daos.wallet.Wallet -import com.lykke.matching.engine.database.PersistenceManager -import com.lykke.matching.engine.database.common.entity.BalancesData -import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.outgoing.messages.BalanceUpdate -import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolder import org.apache.log4j.Logger import org.springframework.stereotype.Component import java.math.BigDecimal @@ -16,8 +11,6 @@ import java.util.concurrent.BlockingQueue @Component class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAccessorsHolder, - private val persistenceManager: PersistenceManager, - private val assetsHolder: AssetsHolder, private val balanceUpdateQueue: BlockingQueue, private val applicationSettingsHolder: ApplicationSettingsHolder): BalancesGetter { @@ -83,12 +76,6 @@ class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAcce return BigDecimal.ZERO } - fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?) { - persistenceManager.persist(PersistenceData(BalancesData(wallets, wallets.flatMap { it.balances.values }), null, null, null, - messageSequenceNumber = messageSequenceNumber)) - update() - } - fun sendBalanceUpdate(balanceUpdate: BalanceUpdate) { if (balanceUpdate.balances.isNotEmpty()) { LOGGER.info(balanceUpdate.toString()) diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt new file mode 100644 index 000000000..81ace9035 --- /dev/null +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt @@ -0,0 +1,7 @@ +package com.lykke.matching.engine.services + +import com.lykke.matching.engine.daos.wallet.Wallet + +interface BalancesService { + fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?): Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt new file mode 100644 index 000000000..936525f7a --- /dev/null +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt @@ -0,0 +1,37 @@ +package com.lykke.matching.engine.services + +import com.lykke.matching.engine.daos.wallet.Wallet +import com.lykke.matching.engine.database.PersistenceManager +import com.lykke.matching.engine.database.common.entity.BalancesData +import com.lykke.matching.engine.database.common.entity.PersistenceData +import com.lykke.matching.engine.holders.BalancesHolder +import com.lykke.utils.logging.MetricsLogger +import org.apache.log4j.Logger +import org.springframework.stereotype.Service + +@Service +class BalancesServiceImpl(private val balancesHolder: BalancesHolder, + private val persistenceManager: PersistenceManager): BalancesService { + private companion object { + val LOGGER = Logger.getLogger(BalancesServiceImpl::class.java.name) + val METRICS_LOGGER = MetricsLogger.getLogger() + } + + override fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?): Boolean { + val updated = persistenceManager.persist(PersistenceData(BalancesData(wallets, + wallets.flatMap { it.balances.values }), + null, + null, + null, + messageSequenceNumber = messageSequenceNumber)) + if (!updated) { + val message = "Can not persist balances data, wallets: ${wallets.size}" + LOGGER.error(message) + METRICS_LOGGER.logError(message) + return false + } + + balancesHolder.setWallets(wallets) + return true + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt b/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt index 3847f0ed4..7c9e2eb8b 100644 --- a/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt +++ b/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt @@ -18,6 +18,7 @@ import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate import com.lykke.matching.engine.outgoing.messages.v2.builders.EventFactory import com.lykke.matching.engine.outgoing.messages.v2.events.Event +import com.lykke.matching.engine.services.BalancesService import com.lykke.matching.engine.services.MessageSender import com.lykke.matching.engine.utils.NumberUtils import org.apache.log4j.Logger @@ -44,18 +45,14 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa private val applicationSettingsHolder: ApplicationSettingsHolder, @Value("#{Config.me.correctReservedVolumes}") private val correctReservedVolumes: Boolean, private val messageSequenceNumberHolder: MessageSequenceNumberHolder, - private val messageSender: MessageSender) : ApplicationRunner { + private val messageSender: MessageSender, + private val balancesService: BalancesService) : ApplicationRunner { override fun run(args: ApplicationArguments?) { correctReservedVolumesIfNeed() } companion object { private val LOGGER = Logger.getLogger(ReservedVolumesRecalculator::class.java.name) - - fun teeLog(message: String) { - println(message) - LOGGER.info(message) - } } fun correctReservedVolumesIfNeed() { @@ -63,7 +60,7 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa return } - teeLog("Starting order books analyze") + LOGGER.info("Starting order books analyze") recalculate() } @@ -104,7 +101,7 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa balance.orderIds.add(order.externalId) } catch (e: Exception) { val errorMessage = "Unable to handle order (id: ${order.externalId}): ${e.message}" - teeLog(errorMessage) + LOGGER.info(errorMessage) } } } @@ -133,7 +130,7 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa if (!NumberUtils.equalsIgnoreScale(oldBalance, newBalance.volume)) { val correction = ReservedVolumeCorrection(id, assetBalance.asset, newBalance.orderIds.joinToString(","), oldBalance, newBalance.volume) corrections.add(correction) - teeLog("1 $id, ${assetBalance.asset} : Old $oldBalance New $newBalance") + LOGGER.info("1 $id, ${assetBalance.asset} : Old $oldBalance New $newBalance") wallet.setReservedBalance(assetBalance.asset, newBalance.volume) updatedWallets.add(wallet) val balanceUpdate = ClientBalanceUpdate(id, @@ -148,7 +145,7 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa val orderIds = newBalance?.orderIds?.joinToString(",") val correction = ReservedVolumeCorrection(id, assetBalance.asset, orderIds, oldBalance, newBalance?.volume ?: BigDecimal.ZERO) corrections.add(correction) - teeLog("2 $id, ${assetBalance.asset} : Old $oldBalance New ${newBalance ?: 0.0}") + LOGGER.info("2 $id, ${assetBalance.asset} : Old $oldBalance New ${newBalance ?: 0.0}") wallet.setReservedBalance(assetBalance.asset, BigDecimal.ZERO) updatedWallets.add(wallet) val balanceUpdate = ClientBalanceUpdate(id, @@ -185,14 +182,19 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa walletOperation, emptyList())) } + val balancesPersisted = balancesService.insertOrUpdateWallets(updatedWallets, sequenceNumber) + + if (!balancesPersisted) { + LOGGER.error("Can not persist balances during reserved balance recalculation, updated wallets size: ${updatedWallets.size}") + return + } - balancesHolder.insertOrUpdateWallets(updatedWallets, sequenceNumber) reservedVolumesDatabaseAccessor.addCorrectionsInfo(corrections) balancesHolder.sendBalanceUpdate(BalanceUpdate(operationId, MessageType.LIMIT_ORDER.name, now, balanceUpdates, operationId)) cashInOutEvents.forEach { messageSender.sendMessage(it) } } - teeLog("Reserved volume recalculation finished") + LOGGER.info("Reserved volume recalculation finished") } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index f8da2e857..5acbc6687 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -104,12 +104,9 @@ open class TestApplicationContext { @Bean open fun balanceHolder(balancesDatabaseAccessorsHolder: BalancesDatabaseAccessorsHolder, - persistenceManager: PersistenceManager, balanceUpdateQueue: BlockingQueue, - applicationSettingsHolder: ApplicationSettingsHolder, - backOfficeDatabaseAccessor: BackOfficeDatabaseAccessor): BalancesHolder { - return BalancesHolder(balancesDatabaseAccessorsHolder, persistenceManager, assetHolder(backOfficeDatabaseAccessor), - balanceUpdateQueue, applicationSettingsHolder) + applicationSettingsHolder: ApplicationSettingsHolder): BalancesHolder { + return BalancesHolder(balancesDatabaseAccessorsHolder, balanceUpdateQueue, applicationSettingsHolder) } @Bean @@ -138,14 +135,15 @@ open class TestApplicationContext { stopOrdersDatabaseAccessorsHolder: StopOrdersDatabaseAccessorsHolder, testReservedVolumesDatabaseAccessor: TestReservedVolumesDatabaseAccessor, assetHolder: AssetsHolder, assetsPairsHolder: AssetsPairsHolder, - balancesHolder: BalancesHolder, applicationSettingsHolder: ApplicationSettingsHolder, + balancesHolder: BalancesHolder, + balancesService: BalancesService, applicationSettingsHolder: ApplicationSettingsHolder, messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender): ReservedVolumesRecalculator { return ReservedVolumesRecalculator(testOrderDatabaseAccessorHolder, stopOrdersDatabaseAccessorsHolder, testReservedVolumesDatabaseAccessor, assetHolder, assetsPairsHolder, balancesHolder, applicationSettingsHolder, - false, messageSequenceNumberHolder, messageSender) + false, messageSequenceNumberHolder, messageSender, balancesService) } @Bean @@ -695,4 +693,9 @@ open class TestApplicationContext { balancesHolder: BalancesHolder): WalletOperationsProcessorFactory { return WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, applicationSettingsHolder, assetsHolder, balancesHolder) } + + @Bean + open fun balancesService(balancesHolder: BalancesHolder, persistenceManager: PersistenceManager): BalancesService { + return BalancesServiceImpl(balancesHolder, persistenceManager) + } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index 92bf0564e..c95d65d8a 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -156,8 +156,6 @@ abstract class AbstractPerformanceTest { ordersDatabaseAccessorsHolder, stopOrdersDatabaseAccessorsHolder) balancesHolder = BalancesHolder(balancesDatabaseAccessorsHolder, - persistenceManager, - assetsHolder, balanceUpdateQueue, applicationSettingsHolder) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/CashInOutOperationServiceTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/CashInOutOperationServiceTest.kt index acb4290f9..922222b4b 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/CashInOutOperationServiceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/CashInOutOperationServiceTest.kt @@ -47,7 +47,10 @@ class CashInOutOperationServiceTest : AbstractTest() { private lateinit var messageBuilder: MessageBuilder @Autowired - protected lateinit var reservedCashInOutOperationService: ReservedCashInOutOperationService + private lateinit var reservedCashInOutOperationService: ReservedCashInOutOperationService + + @Autowired + private lateinit var balancesService: BalancesService @TestConfiguration open class Config { @@ -244,7 +247,7 @@ class CashInOutOperationServiceTest : AbstractTest() { @Test fun testRounding() { - balancesHolder.insertOrUpdateWallets(listOf(Wallet("Client1", listOf(AssetBalance("Client1","Asset1", BigDecimal.valueOf(29.99))))), null) + balancesService.insertOrUpdateWallets(listOf(Wallet("Client1", listOf(AssetBalance("Client1","Asset1", BigDecimal.valueOf(29.99))))), null) cashInOutOperationService.processMessage(messageBuilder.buildCashInOutWrapper("Client1", "Asset1", -0.01)) val balance = testWalletDatabaseAccessor.getBalance("Client1", "Asset1") From ca9b6bd90b73472db33d4822d033616245d3c6bb Mon Sep 17 00:00:00 2001 From: papchenko Date: Thu, 20 Dec 2018 10:01:24 +0200 Subject: [PATCH 05/16] LWDEV-9478 move send notifications to balances service --- .../matching/engine/holders/BalancesHolder.kt | 15 +-------------- .../order/cancel/AbstractLimitOrdersCanceller.kt | 6 ++++-- .../matching/engine/services/BalancesService.kt | 2 ++ .../engine/services/BalancesServiceImpl.kt | 12 +++++++++++- .../utils/balance/ReservedVolumesRecalculator.kt | 2 +- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt index 31e081db2..d6b7aede4 100644 --- a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt +++ b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt @@ -3,16 +3,12 @@ package com.lykke.matching.engine.holders import com.lykke.matching.engine.balance.BalancesGetter import com.lykke.matching.engine.daos.wallet.AssetBalance import com.lykke.matching.engine.daos.wallet.Wallet -import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import org.apache.log4j.Logger import org.springframework.stereotype.Component import java.math.BigDecimal -import java.util.concurrent.BlockingQueue @Component -class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAccessorsHolder, - private val balanceUpdateQueue: BlockingQueue, - private val applicationSettingsHolder: ApplicationSettingsHolder): BalancesGetter { +class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAccessorsHolder): BalancesGetter { companion object { private val LOGGER = Logger.getLogger(BalancesHolder::class.java.name) @@ -76,15 +72,6 @@ class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAcce return BigDecimal.ZERO } - fun sendBalanceUpdate(balanceUpdate: BalanceUpdate) { - if (balanceUpdate.balances.isNotEmpty()) { - LOGGER.info(balanceUpdate.toString()) - balanceUpdateQueue.put(balanceUpdate) - } - } - - fun isTrustedClient(clientId: String) = applicationSettingsHolder.isTrustedClient(clientId) - fun setWallets(wallets: Collection) { wallets.forEach { wallet -> this.wallets[wallet.clientId] = wallet diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/AbstractLimitOrdersCanceller.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/AbstractLimitOrdersCanceller.kt index 3e1ac12a6..8bf937ccd 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/AbstractLimitOrdersCanceller.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/AbstractLimitOrdersCanceller.kt @@ -5,6 +5,7 @@ import com.lykke.matching.engine.daos.AssetPair import com.lykke.matching.engine.daos.LimitOrder import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.database.DictionariesDatabaseAccessor +import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.AssetsPairsHolder import com.lykke.matching.engine.holders.BalancesHolder @@ -21,6 +22,7 @@ abstract class AbstractLimitOrdersCanceller, private val date: Date) { @@ -89,7 +91,7 @@ abstract class AbstractLimitOrdersCanceller() orderInfo.allOrders.forEach { order -> - val isTrustedClientOrder = balancesHolder.isTrustedClient(order.clientId) + val isTrustedClientOrder = applicationSettingsHolder.isTrustedClient(order.clientId) if (!isTrustedClientOrder) { val limitAssetId = if (order.isBuySide()) assetPair.quotingAssetId else assetPair.baseAssetId @@ -163,7 +165,7 @@ abstract class AbstractLimitOrdersCanceller - val isTrustedClientOrder = balancesHolder.isTrustedClient(order.clientId) + val isTrustedClientOrder = applicationSettingsHolder.isTrustedClient(order.clientId) if (isTrustedClientOrder && !order.isPartiallyMatched()) { trustedClientsOrdersWithTrades.add(LimitOrderWithTrades(order)) } else { diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt index 81ace9035..8de20c0c5 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt @@ -1,7 +1,9 @@ package com.lykke.matching.engine.services import com.lykke.matching.engine.daos.wallet.Wallet +import com.lykke.matching.engine.outgoing.messages.BalanceUpdate interface BalancesService { fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?): Boolean + fun sendBalanceUpdate(balanceUpdate: BalanceUpdate) } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt index 936525f7a..f08dbe8d8 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt @@ -5,13 +5,16 @@ import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.common.entity.BalancesData import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.holders.BalancesHolder +import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.utils.logging.MetricsLogger import org.apache.log4j.Logger import org.springframework.stereotype.Service +import java.util.concurrent.BlockingQueue @Service class BalancesServiceImpl(private val balancesHolder: BalancesHolder, - private val persistenceManager: PersistenceManager): BalancesService { + private val persistenceManager: PersistenceManager, + private val balanceUpdateQueue: BlockingQueue): BalancesService { private companion object { val LOGGER = Logger.getLogger(BalancesServiceImpl::class.java.name) val METRICS_LOGGER = MetricsLogger.getLogger() @@ -34,4 +37,11 @@ class BalancesServiceImpl(private val balancesHolder: BalancesHolder, balancesHolder.setWallets(wallets) return true } + + override fun sendBalanceUpdate(balanceUpdate: BalanceUpdate) { + if (balanceUpdate.balances.isNotEmpty()) { + LOGGER.info(balanceUpdate.toString()) + balanceUpdateQueue.put(balanceUpdate) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt b/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt index 7c9e2eb8b..2e9ce0e3e 100644 --- a/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt +++ b/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt @@ -190,7 +190,7 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa } reservedVolumesDatabaseAccessor.addCorrectionsInfo(corrections) - balancesHolder.sendBalanceUpdate(BalanceUpdate(operationId, MessageType.LIMIT_ORDER.name, now, balanceUpdates, operationId)) + balancesService.sendBalanceUpdate(BalanceUpdate(operationId, MessageType.LIMIT_ORDER.name, now, balanceUpdates, operationId)) cashInOutEvents.forEach { messageSender.sendMessage(it) } } From db51a55e4feb59accec28d46e851eaf9abafcd18 Mon Sep 17 00:00:00 2001 From: papchenko Date: Thu, 20 Dec 2018 10:19:53 +0200 Subject: [PATCH 06/16] LWDEV-9478 fix tests --- .../balance/WalletOperationsProcessor.kt | 6 +++--- .../WalletOperationsProcessorFactory.kt | 6 +++--- .../cancel/GenericLimitOrdersCanceller.kt | 4 ++++ .../GenericLimitOrdersCancellerFactory.kt | 3 +++ .../order/cancel/LimitOrdersCanceller.kt | 3 +++ .../order/cancel/StopLimitOrdersCanceller.kt | 3 +++ .../engine/config/TestApplicationContext.kt | 18 +++++++++++------- .../performance/AbstractPerformanceTest.kt | 9 +++++---- 8 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt index 64c8733ef..ed2048f91 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt @@ -6,18 +6,18 @@ import com.lykke.matching.engine.daos.wallet.Wallet import com.lykke.matching.engine.database.common.entity.BalancesData import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder -import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolder import com.lykke.matching.engine.order.transaction.WalletAssetBalance +import com.lykke.matching.engine.services.BalancesService import com.lykke.matching.engine.utils.NumberUtils import com.lykke.utils.logging.MetricsLogger import org.apache.log4j.Logger import java.math.BigDecimal import java.util.Date -class WalletOperationsProcessor(private val balancesHolder: BalancesHolder, +class WalletOperationsProcessor(private val balancesService: BalancesService, private val currentTransactionBalancesHolder: CurrentTransactionBalancesHolder, private val applicationSettingsHolder: ApplicationSettingsHolder, private val assetsHolder: AssetsHolder, @@ -114,7 +114,7 @@ class WalletOperationsProcessor(private val balancesHolder: BalancesHolder, fun sendNotification(id: String, type: String, messageId: String) { if (clientBalanceUpdatesByClientIdAndAssetId.isNotEmpty()) { - balancesHolder.sendBalanceUpdate(BalanceUpdate(id, type, Date(), clientBalanceUpdatesByClientIdAndAssetId.values.toList(), messageId)) + balancesService.sendBalanceUpdate(BalanceUpdate(id, type, Date(), clientBalanceUpdatesByClientIdAndAssetId.values.toList(), messageId)) } } diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt index 23da3a804..559852ac0 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt @@ -2,8 +2,8 @@ package com.lykke.matching.engine.balance import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder -import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolderFactory +import com.lykke.matching.engine.services.BalancesService import org.apache.log4j.Logger import org.springframework.stereotype.Component @@ -11,10 +11,10 @@ import org.springframework.stereotype.Component class WalletOperationsProcessorFactory(private val currentTransactionBalancesHolderFactory: CurrentTransactionBalancesHolderFactory, private val applicationSettingsHolder: ApplicationSettingsHolder, private val assetsHolder: AssetsHolder, - private val balancesHolder: BalancesHolder) { + private val balancesService: BalancesService) { fun create(logger: Logger?, validate: Boolean = true): WalletOperationsProcessor { - return WalletOperationsProcessor(balancesHolder, + return WalletOperationsProcessor(balancesService, currentTransactionBalancesHolderFactory.create(), applicationSettingsHolder, assetsHolder, diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt index 1ba3380de..5b3df02c0 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCanceller.kt @@ -5,6 +5,7 @@ import com.lykke.matching.engine.daos.AssetPair import com.lykke.matching.engine.daos.LimitOrder import com.lykke.matching.engine.database.DictionariesDatabaseAccessor import com.lykke.matching.engine.deduplication.ProcessedMessage +import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.AssetsPairsHolder import com.lykke.matching.engine.holders.BalancesHolder @@ -28,6 +29,7 @@ class GenericLimitOrdersCanceller(private val executionContextFactory: Execution private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, genericLimitOrderService: GenericLimitOrderService, genericStopLimitOrderService: GenericStopLimitOrderService, + applicationSettingsHolder: ApplicationSettingsHolder, private val date: Date, private val LOGGER: Logger) { @@ -36,12 +38,14 @@ class GenericLimitOrdersCanceller(private val executionContextFactory: Execution assetsPairsHolder, balancesHolder, genericLimitOrderService, + applicationSettingsHolder, date) private val stopLimitOrdersCanceller = StopLimitOrdersCanceller(dictionariesDatabaseAccessor, assetsHolder, assetsPairsHolder, balancesHolder, + applicationSettingsHolder, genericStopLimitOrderService, date) diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt index dda480cd2..5e9687222 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/GenericLimitOrdersCancellerFactory.kt @@ -2,6 +2,7 @@ package com.lykke.matching.engine.order.cancel import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.database.DictionariesDatabaseAccessor +import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.AssetsPairsHolder import com.lykke.matching.engine.holders.BalancesHolder @@ -25,6 +26,7 @@ class GenericLimitOrdersCancellerFactory @Autowired constructor(private val exec private val balancesHolder: BalancesHolder, private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val genericLimitOrderService: GenericLimitOrderService, + private val applicationSettingsHolder: ApplicationSettingsHolder, private val genericStopLimitOrderService: GenericStopLimitOrderService) { @@ -39,6 +41,7 @@ class GenericLimitOrdersCancellerFactory @Autowired constructor(private val exec walletOperationsProcessorFactory, genericLimitOrderService, genericStopLimitOrderService, + applicationSettingsHolder, date, logger) } diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/LimitOrdersCanceller.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/LimitOrdersCanceller.kt index f2e5760a6..a28ed5135 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/LimitOrdersCanceller.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/LimitOrdersCanceller.kt @@ -4,6 +4,7 @@ import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.LimitOrder import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.database.DictionariesDatabaseAccessor +import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.AssetsPairsHolder import com.lykke.matching.engine.holders.BalancesHolder @@ -19,11 +20,13 @@ class LimitOrdersCanceller(dictionariesDatabaseAccessor: DictionariesDatabaseAcc assetsPairsHolder: AssetsPairsHolder, balancesHolder: BalancesHolder, genericLimitOrderService: GenericLimitOrderService, + applicationSettingsHolder: ApplicationSettingsHolder, date: Date) : AbstractLimitOrdersCanceller(dictionariesDatabaseAccessor, assetsHolder, assetsPairsHolder, balancesHolder, + applicationSettingsHolder, genericLimitOrderService, date) { diff --git a/src/main/kotlin/com/lykke/matching/engine/order/cancel/StopLimitOrdersCanceller.kt b/src/main/kotlin/com/lykke/matching/engine/order/cancel/StopLimitOrdersCanceller.kt index 375d48f42..df0df0db8 100644 --- a/src/main/kotlin/com/lykke/matching/engine/order/cancel/StopLimitOrdersCanceller.kt +++ b/src/main/kotlin/com/lykke/matching/engine/order/cancel/StopLimitOrdersCanceller.kt @@ -4,6 +4,7 @@ import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.LimitOrder import com.lykke.matching.engine.daos.WalletOperation import com.lykke.matching.engine.database.DictionariesDatabaseAccessor +import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.holders.AssetsPairsHolder import com.lykke.matching.engine.holders.BalancesHolder @@ -18,12 +19,14 @@ class StopLimitOrdersCanceller(dictionariesDatabaseAccessor: DictionariesDatabas assetsHolder: AssetsHolder, assetsPairsHolder: AssetsPairsHolder, balancesHolder: BalancesHolder, + applicationSettingsHolder: ApplicationSettingsHolder, genericStopLimitOrderService: GenericStopLimitOrderService, date: Date) : AbstractLimitOrdersCanceller(dictionariesDatabaseAccessor, assetsHolder, assetsPairsHolder, balancesHolder, + applicationSettingsHolder, genericStopLimitOrderService, date) { diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index 5acbc6687..a38c919f8 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -52,7 +52,6 @@ import com.lykke.matching.engine.services.validators.business.* import com.lykke.matching.engine.services.validators.business.impl.* import com.lykke.matching.engine.services.validators.impl.MarketOrderValidatorImpl import com.lykke.matching.engine.services.validators.impl.ReservedCashInOutOperationValidatorImpl -import com.lykke.matching.engine.services.validators.impl.* import com.lykke.matching.engine.services.validators.input.LimitOrderInputValidator import com.lykke.matching.engine.services.validators.input.CashInOutOperationInputValidator import com.lykke.matching.engine.services.validators.input.CashTransferOperationInputValidator @@ -106,7 +105,7 @@ open class TestApplicationContext { open fun balanceHolder(balancesDatabaseAccessorsHolder: BalancesDatabaseAccessorsHolder, balanceUpdateQueue: BlockingQueue, applicationSettingsHolder: ApplicationSettingsHolder): BalancesHolder { - return BalancesHolder(balancesDatabaseAccessorsHolder, balanceUpdateQueue, applicationSettingsHolder) + return BalancesHolder(balancesDatabaseAccessorsHolder) } @Bean @@ -411,12 +410,15 @@ open class TestApplicationContext { clientLimitOrdersQueue: BlockingQueue, trustedClientsLimitOrdersQueue: BlockingQueue, walletOperationsProcessorFactory: WalletOperationsProcessorFactory, - messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender): GenericLimitOrdersCancellerFactory { + messageSequenceNumberHolder: MessageSequenceNumberHolder, + messageSender: MessageSender, + applicationSettingsHolder: ApplicationSettingsHolder): GenericLimitOrdersCancellerFactory { return GenericLimitOrdersCancellerFactory(executionContextFactory, stopOrderBookProcessor, executionDataApplyService, dictionariesDatabaseAccessor, assetsHolder, assetsPairsHolder, balancesHolder, walletOperationsProcessorFactory, genericLimitOrderService, + applicationSettingsHolder, genericStopLimitOrderService) } @@ -690,12 +692,14 @@ open class TestApplicationContext { open fun walletOperationsProcessorFactory(currentTransactionBalancesHolderFactory: CurrentTransactionBalancesHolderFactory, applicationSettingsHolder: ApplicationSettingsHolder, assetsHolder: AssetsHolder, - balancesHolder: BalancesHolder): WalletOperationsProcessorFactory { - return WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, applicationSettingsHolder, assetsHolder, balancesHolder) + balancesService: BalancesService): WalletOperationsProcessorFactory { + return WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, applicationSettingsHolder, assetsHolder, balancesService) } @Bean - open fun balancesService(balancesHolder: BalancesHolder, persistenceManager: PersistenceManager): BalancesService { - return BalancesServiceImpl(balancesHolder, persistenceManager) + open fun balancesService(balancesHolder: BalancesHolder, + persistenceManager: PersistenceManager, + balanceUpdateQueue: BlockingQueue): BalancesService { + return BalancesServiceImpl(balancesHolder, persistenceManager, balanceUpdateQueue) } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index c95d65d8a..3c99999f5 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -77,6 +77,7 @@ abstract class AbstractPerformanceTest { protected lateinit var assetsHolder: AssetsHolder protected lateinit var balancesHolder: BalancesHolder + protected lateinit var balancesService: BalancesService protected lateinit var assetsPairsHolder: AssetsPairsHolder protected lateinit var assetCache: AssetsCache protected lateinit var balancesDatabaseAccessorsHolder: BalancesDatabaseAccessorsHolder @@ -128,7 +129,7 @@ abstract class AbstractPerformanceTest { val currentTransactionBalancesHolderFactory = CurrentTransactionBalancesHolderFactory(balancesHolder) val walletOperationsProcessorFactory = WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, - applicationSettingsHolder, assetsHolder, balancesHolder) + applicationSettingsHolder, assetsHolder, balancesService) private fun clearMessageQueues() { rabbitEventsQueue.clear() @@ -155,9 +156,8 @@ abstract class AbstractPerformanceTest { persistenceManager = TestPersistenceManager(balancesDatabaseAccessorsHolder.primaryAccessor, ordersDatabaseAccessorsHolder, stopOrdersDatabaseAccessorsHolder) - balancesHolder = BalancesHolder(balancesDatabaseAccessorsHolder, - balanceUpdateQueue, - applicationSettingsHolder) + balancesHolder = BalancesHolder(balancesDatabaseAccessorsHolder) + balancesService = BalancesServiceImpl(balancesHolder, persistenceManager, balanceUpdateQueue) testBalanceHolderWrapper = TestBalanceHolderWrapper(BalanceUpdateHandlerTest(balanceUpdateQueue), balancesHolder, walletOperationsProcessorFactory, persistenceManager) assetPairsCache = AssetPairsCache(testDictionariesDatabaseAccessor) @@ -231,6 +231,7 @@ abstract class AbstractPerformanceTest { balancesHolder, walletOperationsProcessorFactory, genericLimitOrderService, + applicationSettingsHolder, genericStopLimitOrderService) val previousLimitOrdersProcessor = PreviousLimitOrdersProcessor(genericLimitOrderService, genericStopLimitOrderService, genericLimitOrdersCancellerFactory) From 0ca9b06dcae26f69d71ceeeb3504e2f442eda8df Mon Sep 17 00:00:00 2001 From: papchenko Date: Fri, 21 Dec 2018 11:09:30 +0200 Subject: [PATCH 07/16] LWDEV-9478 add balance update service test --- .../engine/services/BalancesServiceImpl.kt | 4 ++ .../engine/services/BalancesServiceTest.kt | 61 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt index f08dbe8d8..1299da030 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt @@ -20,6 +20,10 @@ class BalancesServiceImpl(private val balancesHolder: BalancesHolder, val METRICS_LOGGER = MetricsLogger.getLogger() } + /** + * Persists wallets to the db and updates values in cache, + * Note: this method will not send balance updates notifications + */ override fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?): Boolean { val updated = persistenceManager.persist(PersistenceData(BalancesData(wallets, wallets.flatMap { it.balances.values }), diff --git a/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt new file mode 100644 index 000000000..6d898a7a0 --- /dev/null +++ b/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt @@ -0,0 +1,61 @@ +package com.lykke.matching.engine.services + +import com.lykke.matching.engine.config.TestApplicationContext +import com.lykke.matching.engine.daos.wallet.AssetBalance +import com.lykke.matching.engine.daos.wallet.Wallet +import com.lykke.matching.engine.holders.BalancesDatabaseAccessorsHolder +import com.lykke.matching.engine.holders.BalancesHolder +import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest +import com.lykke.matching.engine.outgoing.messages.BalanceUpdate +import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate +import com.lykke.matching.engine.utils.assertEquals +import org.junit.Test +import org.junit.runner.RunWith +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.test.annotation.DirtiesContext +import org.springframework.test.context.junit4.SpringRunner +import java.math.BigDecimal +import java.util.* +import kotlin.test.assertEquals + +@RunWith(SpringRunner::class) +@SpringBootTest(classes = [(TestApplicationContext::class)]) +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +class BalancesServiceTest { + + @Autowired + private lateinit var balancesService: BalancesService + + @Autowired + private lateinit var balancesHolder: BalancesHolder + + @Autowired + private lateinit var testBalancesDatabaseAccessorsHolder: BalancesDatabaseAccessorsHolder + + @Autowired + private lateinit var balanceUpdateHandlerTest: BalanceUpdateHandlerTest + + @Test + fun testInsertOrUpdateWallets() { + balancesService.insertOrUpdateWallets(listOf(Wallet("test", listOf(AssetBalance("test", "BTC", BigDecimal.valueOf(10))))), null) + + + assertEquals(BigDecimal.valueOf(10), balancesHolder.getBalance("test", "BTC")) + assertEquals(BigDecimal.valueOf(10), testBalancesDatabaseAccessorsHolder.primaryAccessor.loadWallets()["test"]?.balances!!["BTC"]?.balance) + } + + @Test + fun testSendBalanceUpdate() { + balancesService.sendBalanceUpdate(BalanceUpdate("test", "", Date(), + listOf(ClientBalanceUpdate("test", + "BTC", + BigDecimal.valueOf(10), + BigDecimal.valueOf(15), + BigDecimal.valueOf(0), + BigDecimal.valueOf(1))), + "testMessageId")) + + assertEquals(1, balanceUpdateHandlerTest.getCountOfBalanceUpdate()) + } +} \ No newline at end of file From ea2737762083d23e238d72b0e4a36ce5362e25a5 Mon Sep 17 00:00:00 2001 From: papchenko Date: Fri, 21 Dec 2018 12:30:32 +0200 Subject: [PATCH 08/16] LWDEV-9478 fix tests --- .../balance/util/TestBalanceHolderWrapper.kt | 40 ++++++------------- .../engine/config/TestApplicationContext.kt | 8 ++-- .../performance/AbstractPerformanceTest.kt | 2 +- ...hTransferOperationBusinessValidatorTest.kt | 10 ++--- .../ReservedVolumesRecalculatorTest.kt | 4 +- 5 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt index 87b099e15..fd28cfef9 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/util/TestBalanceHolderWrapper.kt @@ -1,40 +1,26 @@ package com.lykke.matching.engine.balance.util -import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory -import com.lykke.matching.engine.daos.WalletOperation -import com.lykke.matching.engine.database.PersistenceManager -import com.lykke.matching.engine.database.common.entity.PersistenceData +import com.lykke.matching.engine.daos.wallet.Wallet import com.lykke.matching.engine.holders.BalancesHolder -import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest -import org.apache.log4j.Logger +import com.lykke.matching.engine.services.BalancesService import org.springframework.beans.factory.annotation.Autowired import java.math.BigDecimal -class TestBalanceHolderWrapper @Autowired constructor(private val balanceUpdateHandlerTest: BalanceUpdateHandlerTest, - private val balancesHolder: BalancesHolder, - private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, - private val persistenceManager: PersistenceManager) { +class TestBalanceHolderWrapper @Autowired constructor(private val balancesService: BalancesService, + private val balancesHolder: BalancesHolder) { - companion object { - val logger = Logger.getLogger(TestBalanceHolderWrapper::class.java.name) - } + fun updateBalance(clientId: String, assetId: String, balance: Double) { + val wallet = balancesHolder.wallets[clientId] ?: Wallet(clientId) + wallet.setBalance(assetId, BigDecimal.valueOf(balance) ) - fun updateBalance(clientId: String, assetId: String, balance: Double, validate: Boolean = false) { - val walletProcessor = walletOperationsProcessorFactory.create(logger, validate) - val currentBalance = balancesHolder.getBalance(clientId, assetId) - walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.valueOf(balance).minus(currentBalance)))) - .apply() - persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), null, null, null, null)) - balanceUpdateHandlerTest.clear() + balancesService.insertOrUpdateWallets(listOf(wallet), null) } - fun updateReservedBalance(clientId: String, assetId: String, reservedBalance: Double, validate: Boolean = false) { - val walletProcessor = walletOperationsProcessorFactory.create(logger, validate) - val currentReservedBalance = balancesHolder.getReservedBalance(clientId, assetId) + fun updateReservedBalance(clientId: String, assetId: String, reservedBalance: Double) { + val wallet = balancesHolder.wallets[clientId] ?: Wallet(clientId) + wallet.setReservedBalance(assetId, BigDecimal.valueOf(reservedBalance) ) + + balancesService.insertOrUpdateWallets(listOf(wallet), null) - walletProcessor.preProcess(listOf(WalletOperation(clientId, assetId, BigDecimal.ZERO, BigDecimal.valueOf(reservedBalance).minus(currentReservedBalance)))) - .apply() - persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), null, null, null, null)) - balanceUpdateHandlerTest.clear() } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index a38c919f8..4ffe094c9 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -192,11 +192,9 @@ open class TestApplicationContext { } @Bean - open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, - balancesHolder: BalancesHolder, - persistenceManager: PersistenceManager, - walletOperationsProcessorFactory: WalletOperationsProcessorFactory): TestBalanceHolderWrapper { - return TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, walletOperationsProcessorFactory, persistenceManager) + open fun testBalanceHolderWrapper(balancesHolder: BalancesHolder, + balancesService: BalancesService): TestBalanceHolderWrapper { + return TestBalanceHolderWrapper(balancesService, balancesHolder) } @Bean diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index 3c99999f5..45196c203 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -159,7 +159,7 @@ abstract class AbstractPerformanceTest { balancesHolder = BalancesHolder(balancesDatabaseAccessorsHolder) balancesService = BalancesServiceImpl(balancesHolder, persistenceManager, balanceUpdateQueue) - testBalanceHolderWrapper = TestBalanceHolderWrapper(BalanceUpdateHandlerTest(balanceUpdateQueue), balancesHolder, walletOperationsProcessorFactory, persistenceManager) + testBalanceHolderWrapper = TestBalanceHolderWrapper(balancesService, balancesHolder) assetPairsCache = AssetPairsCache(testDictionariesDatabaseAccessor) assetsPairsHolder = AssetsPairsHolder(assetPairsCache) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt index cc4ae2109..19d5a4151 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/validator/business/CashTransferOperationBusinessValidatorTest.kt @@ -6,14 +6,13 @@ import com.lykke.matching.engine.config.TestApplicationContext import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.context.CashTransferContext import com.lykke.matching.engine.database.BackOfficeDatabaseAccessor -import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.TestBackOfficeDatabaseAccessor import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.incoming.parsers.impl.CashTransferContextParser import com.lykke.matching.engine.messages.MessageType import com.lykke.matching.engine.messages.MessageWrapper import com.lykke.matching.engine.messages.ProtocolMessages -import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest +import com.lykke.matching.engine.services.BalancesService import com.lykke.matching.engine.services.validators.business.CashTransferOperationBusinessValidator import com.lykke.matching.engine.services.validators.impl.ValidationException import junit.framework.Assert @@ -56,10 +55,9 @@ class CashTransferOperationBusinessValidatorTest { @Bean @Primary - open fun testBalanceHolderWrapper(balanceUpdateHandlerTest: BalanceUpdateHandlerTest, balancesHolder: BalancesHolder, - walletOperationsProcessorFactory: WalletOperationsProcessorFactory, - persistenceManager: PersistenceManager): TestBalanceHolderWrapper { - val testBalanceHolderWrapper = TestBalanceHolderWrapper(balanceUpdateHandlerTest, balancesHolder, walletOperationsProcessorFactory, persistenceManager) + open fun testBalanceHolderWrapper(balancesService: BalancesService, + balancesHolder: BalancesHolder): TestBalanceHolderWrapper { + val testBalanceHolderWrapper = TestBalanceHolderWrapper(balancesService, balancesHolder) testBalanceHolderWrapper.updateBalance(CLIENT_NAME1, ASSET_ID, 100.0) testBalanceHolderWrapper.updateReservedBalance(CLIENT_NAME1, ASSET_ID, 50.0) return testBalanceHolderWrapper diff --git a/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt b/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt index b86525398..592eed62b 100644 --- a/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculatorTest.kt @@ -103,10 +103,10 @@ class ReservedVolumesRecalculatorTest { testOrderBookWrapper.addStopLimitOrder(buildLimitOrder(uid = "4", clientId = "Client2", assetId = "BTCUSD", type = LimitOrderType.STOP_LIMIT, volume = 0.1, lowerLimitPrice = 10000.0, lowerPrice = 10900.0)) testBalanceHolderWrapper.updateBalance("trustedClient", "BTC", 10.0) - testBalanceHolderWrapper.updateReservedBalance("trustedClient", "BTC", 2.0, false) + testBalanceHolderWrapper.updateReservedBalance("trustedClient", "BTC", 2.0) // negative reserved balance testBalanceHolderWrapper.updateBalance("trustedClient2", "BTC", 1.0) - testBalanceHolderWrapper.updateReservedBalance("trustedClient2", "BTC", -0.001, false) + testBalanceHolderWrapper.updateReservedBalance("trustedClient2", "BTC", -0.001) testBalanceHolderWrapper.updateBalance("Client3", "BTC", 0.0) testBalanceHolderWrapper.updateReservedBalance("Client3", "BTC", -0.001) From 4930d30cd72d2a3bc1a6b579dbae5f8f62fcf3fb Mon Sep 17 00:00:00 2001 From: papchenko Date: Mon, 14 Jan 2019 19:03:09 +0200 Subject: [PATCH 09/16] LWDEV-9478 merge fixes --- .../engine/balance/WalletOperationsProcessorFactory.kt | 1 - .../engine/services/CashInOutOperationService.kt | 4 +++- .../engine/services/CashTransferOperationService.kt | 6 ++++-- .../engine/balance/WalletOperationsProcessorTest.kt | 7 ++----- .../matching/engine/config/TestApplicationContext.kt | 9 +++++---- .../com/lykke/matching/engine/fee/FeeProcessorTest.kt | 5 +++-- .../engine/services/MultiLimitOrderServiceTest.kt | 1 - 7 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt index 559852ac0..de5460536 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt @@ -18,7 +18,6 @@ class WalletOperationsProcessorFactory(private val currentTransactionBalancesHol currentTransactionBalancesHolderFactory.create(), applicationSettingsHolder, assetsHolder, - validate, logger) } } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt index 12eec6c90..c520c3ab0 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt @@ -9,6 +9,7 @@ import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.fee.FeeException import com.lykke.matching.engine.fee.FeeProcessor +import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.holders.MessageSequenceNumberHolder import com.lykke.matching.engine.messages.MessageStatus import com.lykke.matching.engine.messages.MessageStatus.INVALID_FEE @@ -30,7 +31,8 @@ import java.util.* import java.util.concurrent.BlockingQueue @Service -class CashInOutOperationService(private val rabbitCashInOutQueue: BlockingQueue, +class CashInOutOperationService(private val balancesHolder: BalancesHolder, + private val rabbitCashInOutQueue: BlockingQueue, private val feeProcessor: FeeProcessor, private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val cashInOutOperationBusinessValidator: CashInOutOperationBusinessValidator, diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt index 5ee68dcef..6d2da28e6 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt @@ -12,6 +12,7 @@ import com.lykke.matching.engine.exception.PersistenceException import com.lykke.matching.engine.fee.FeeException import com.lykke.matching.engine.fee.FeeProcessor import com.lykke.matching.engine.fee.singleFeeTransfer +import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.holders.MessageSequenceNumberHolder import com.lykke.matching.engine.messages.MessageStatus import com.lykke.matching.engine.messages.MessageStatus.INVALID_FEE @@ -36,7 +37,8 @@ import java.util.LinkedList import java.util.concurrent.BlockingQueue @Service -class CashTransferOperationService(private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, +class CashTransferOperationService(private val balancesHolder: BalancesHolder, + private val walletOperationsProcessorFactory: WalletOperationsProcessorFactory, private val notificationQueue: BlockingQueue, private val dbTransferOperationQueue: BlockingQueue, private val feeProcessor: FeeProcessor, @@ -84,7 +86,7 @@ class CashTransferOperationService(private val walletOperationsProcessorFactory: return } dbTransferOperationQueue.put(transferOperation) - val fee = if(transferOperation.fees == null || transferOperation.fees.isEmpty()) null else transferOperation.fees.first() + val fee = if (transferOperation.fees == null || transferOperation.fees.isEmpty()) null else transferOperation.fees.first() notificationQueue.put(CashTransferOperation(transferOperation.externalId, transferOperation.fromClientId, diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt index 57551a020..c3e841d25 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt @@ -50,9 +50,6 @@ class WalletOperationsProcessorTest : AbstractTest() { @Autowired private lateinit var walletOperationsProcessorFactory: WalletOperationsProcessorFactory - @Autowired - private lateinit var settingsDatabaseAccessor: TestSettingsDatabaseAccessor - @Test fun testPreProcessWalletOperations() { testBalanceHolderWrapper.updateBalance("Client1", "BTC", 1.0) @@ -157,7 +154,7 @@ class WalletOperationsProcessorTest : AbstractTest() { testBalanceHolderWrapper.updateBalance("TrustedClient1", "BTC", 1.0) testBalanceHolderWrapper.updateBalance("TrustedClient2", "EUR", 1.0) - val walletOperationsProcessor = balancesHolder.createWalletProcessor(null) + val walletOperationsProcessor = walletOperationsProcessorFactory.create(null) walletOperationsProcessor.preProcess(listOf( WalletOperation("TrustedClient1", "BTC", BigDecimal.ZERO, BigDecimal.valueOf(0.1)), @@ -173,7 +170,7 @@ class WalletOperationsProcessorTest : AbstractTest() { @Test fun testNotChangedBalance() { - val walletOperationsProcessor = balancesHolder.createWalletProcessor(null) + val walletOperationsProcessor = walletOperationsProcessorFactory.create(null) walletOperationsProcessor.preProcess(listOf( WalletOperation("Client1", "BTC", BigDecimal.valueOf(0.1), BigDecimal.valueOf(0.1)), diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index 311911b8d..45e9b2d4f 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -253,14 +253,15 @@ open class TestApplicationContext { } @Bean - open fun cashInOutOperationService(walletOperationsProcessorFactory: WalletOperationsProcessorFactory, + open fun cashInOutOperationService(balancesHolder: BalancesHolder, + walletOperationsProcessorFactory: WalletOperationsProcessorFactory, rabbitCashInOutQueue: BlockingQueue, feeProcessor: FeeProcessor, cashInOutOperationBusinessValidator: CashInOutOperationBusinessValidator, messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender, persistenceManager: PersistenceManager): CashInOutOperationService { - return CashInOutOperationService(rabbitCashInOutQueue, feeProcessor, walletOperationsProcessorFactory, + return CashInOutOperationService(balancesHolder, rabbitCashInOutQueue, feeProcessor, walletOperationsProcessorFactory, cashInOutOperationBusinessValidator, messageSequenceNumberHolder, messageSender, persistenceManager) } @@ -548,11 +549,11 @@ open class TestApplicationContext { } @Bean - open fun cashTransferOperationService(walletOperationsProcessorFactory: WalletOperationsProcessorFactory, notification: BlockingQueue, + open fun cashTransferOperationService(balancesHolder: BalancesHolder, walletOperationsProcessorFactory: WalletOperationsProcessorFactory, notification: BlockingQueue, dbTransferOperationQueue: BlockingQueue, feeProcessor: FeeProcessor, cashTransferOperationBusinessValidator: CashTransferOperationBusinessValidator, messageSequenceNumberHolder: MessageSequenceNumberHolder, messageSender: MessageSender, persistenceManager: PersistenceManager): CashTransferOperationService { - return CashTransferOperationService(walletOperationsProcessorFactory, notification, dbTransferOperationQueue, feeProcessor, + return CashTransferOperationService(balancesHolder, walletOperationsProcessorFactory, notification, dbTransferOperationQueue, feeProcessor, cashTransferOperationBusinessValidator, messageSequenceNumberHolder, messageSender, persistenceManager) } diff --git a/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt index de7a2f2dc..9c91744b8 100644 --- a/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt @@ -1,6 +1,7 @@ package com.lykke.matching.engine.fee import com.lykke.matching.engine.balance.BalancesGetter +import com.lykke.matching.engine.balance.WalletOperationsProcessorFactory import com.lykke.matching.engine.balance.util.TestBalanceHolderWrapper import com.lykke.matching.engine.config.TestApplicationContext import com.lykke.matching.engine.daos.Asset @@ -44,7 +45,7 @@ class FeeProcessorTest { private lateinit var feeProcessor: FeeProcessor @Autowired - lateinit var balancesHolder: BalancesHolder + lateinit var walletOperationsProcessorFactory: WalletOperationsProcessorFactory @Autowired lateinit var testBalanceHolderWrapper: TestBalanceHolderWrapper @@ -605,7 +606,7 @@ class FeeProcessorTest { } private fun createBalancesGetter(): BalancesGetter { - return balancesHolder.createWalletProcessor(null) + return walletOperationsProcessorFactory.create(null) } } diff --git a/src/test/kotlin/com/lykke/matching/engine/services/MultiLimitOrderServiceTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/MultiLimitOrderServiceTest.kt index 6782f05b7..ad57d783a 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/MultiLimitOrderServiceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/MultiLimitOrderServiceTest.kt @@ -28,7 +28,6 @@ import org.junit.runner.RunWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.TestConfiguration -import org.springframework.context.ApplicationEventPublisher import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Primary import org.springframework.test.annotation.DirtiesContext From 97bf4f98db530a3edbbcadb984d84279aa1dd4c9 Mon Sep 17 00:00:00 2001 From: papchenko Date: Mon, 8 Apr 2019 09:45:36 +0300 Subject: [PATCH 10/16] LWDEV-9478 merge fixes --- .../engine/balance/WalletOperationsProcessorFactory.kt | 2 +- .../com/lykke/matching/engine/services/BalancesServiceImpl.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt index de5460536..388e843e5 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt @@ -4,7 +4,7 @@ import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolderFactory import com.lykke.matching.engine.services.BalancesService -import org.apache.log4j.Logger +import org.slf4j.Logger import org.springframework.stereotype.Component @Component diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt index 1299da030..9cca867e2 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt @@ -7,7 +7,7 @@ import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.holders.BalancesHolder import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.utils.logging.MetricsLogger -import org.apache.log4j.Logger +import org.slf4j.LoggerFactory import org.springframework.stereotype.Service import java.util.concurrent.BlockingQueue @@ -16,7 +16,7 @@ class BalancesServiceImpl(private val balancesHolder: BalancesHolder, private val persistenceManager: PersistenceManager, private val balanceUpdateQueue: BlockingQueue): BalancesService { private companion object { - val LOGGER = Logger.getLogger(BalancesServiceImpl::class.java.name) + val LOGGER = LoggerFactory.getLogger(BalancesServiceImpl::class.java.name) val METRICS_LOGGER = MetricsLogger.getLogger() } From ed59aa2a70b074d5dde9fd292e7d0a6ce097ae26 Mon Sep 17 00:00:00 2001 From: papchenko Date: Mon, 8 Apr 2019 11:26:27 +0300 Subject: [PATCH 11/16] LWDEV-9478 merge fixes --- .../matching/engine/services/CashTransferOperationService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt index b8b5db417..30423b658 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt @@ -121,7 +121,7 @@ class CashTransferOperationService(private val balancesHolder: BalancesHolder, val fees = feeProcessor.processFee(operation.fees, receiptOperation, operations, balancesGetter = balancesHolder) val walletProcessor = walletOperationsProcessorFactory.create(LOGGER) - walletProcessor.preProcess(operations) + walletProcessor.preProcess(operations, true) val sequenceNumber = messageSequenceNumberHolder.getNewValue() val updated = persistenceManager.persist(PersistenceData(walletProcessor.persistenceData(), From ef3a087716a200bd58259dbe2a281e4903ce195d Mon Sep 17 00:00:00 2001 From: papchenko Date: Thu, 11 Apr 2019 10:40:53 +0300 Subject: [PATCH 12/16] LWDEV-9478 fix logs --- src/dist/cfg/log4j2.xml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/dist/cfg/log4j2.xml b/src/dist/cfg/log4j2.xml index 226fec133..7c3e2c424 100644 --- a/src/dist/cfg/log4j2.xml +++ b/src/dist/cfg/log4j2.xml @@ -344,6 +344,24 @@ + + + + + + + + + + + + + + + @@ -541,6 +559,11 @@ + + + + # Errors logger From fd928b3666f9365e9c95ff966f46d458bbea6b21 Mon Sep 17 00:00:00 2001 From: papchenko Date: Tue, 16 Apr 2019 14:27:27 +0300 Subject: [PATCH 13/16] LWDEV-9478 fixes --- .../WalletOperationsProcessorFactory.kt | 2 +- .../matching/engine/holders/BalancesHolder.kt | 4 --- .../matching/engine/fee/FeeProcessorTest.kt | 32 ++++++++----------- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt index 388e843e5..aaa1c9a3f 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt @@ -12,7 +12,7 @@ class WalletOperationsProcessorFactory(private val currentTransactionBalancesHol private val applicationSettingsHolder: ApplicationSettingsHolder, private val assetsHolder: AssetsHolder, private val balancesService: BalancesService) { - fun create(logger: Logger?, validate: Boolean = true): WalletOperationsProcessor { + fun create(logger: Logger?): WalletOperationsProcessor { return WalletOperationsProcessor(balancesService, currentTransactionBalancesHolderFactory.create(), diff --git a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt index 051ecb7cc..8725482e4 100644 --- a/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt +++ b/src/main/kotlin/com/lykke/matching/engine/holders/BalancesHolder.kt @@ -10,10 +10,6 @@ import java.math.BigDecimal @Component class BalancesHolder(private val balancesDbAccessorsHolder: BalancesDatabaseAccessorsHolder): BalancesGetter { - companion object { - private val LOGGER = LoggerFactory.getLogger(BalancesHolder::class.java.name) - } - lateinit var wallets: MutableMap var initialClientsCount = 0 var initialBalancesCount = 0 diff --git a/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt index 9c91744b8..76647dd7b 100644 --- a/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/fee/FeeProcessorTest.kt @@ -48,7 +48,7 @@ class FeeProcessorTest { lateinit var walletOperationsProcessorFactory: WalletOperationsProcessorFactory @Autowired - lateinit var testBalanceHolderWrapper: TestBalanceHolderWrapper + lateinit var testBalanceHolderWrapper: TestBalanceHolderWrapper @Autowired lateinit var testBackOfficeDatabaseAccessor: TestBackOfficeDatabaseAccessor @@ -60,10 +60,19 @@ class FeeProcessorTest { open fun testBackOfficeDatabaseAccessor(): TestBackOfficeDatabaseAccessor { val testBackOfficeDatabaseAccessor = TestBackOfficeDatabaseAccessor() testBackOfficeDatabaseAccessor.addAsset(Asset("USD", 2)) - testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 4)) + testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 2)) + testBackOfficeDatabaseAccessor.addAsset(Asset("CHF", 4)) return testBackOfficeDatabaseAccessor } + + @Bean + @Primary + fun testDictionaryDatabaseAccessor(): TestDictionariesDatabaseAccessor { + val testDictionariesDatabaseAccessor = TestDictionariesDatabaseAccessor() + testDictionariesDatabaseAccessor.addAssetPair(AssetPair("EURUSD", "EUR", "USD", 5)) + return testDictionariesDatabaseAccessor + } } @Before @@ -76,9 +85,6 @@ class FeeProcessorTest { fun testNoPercentageFee() { testBalanceHolderWrapper.updateBalance("Client2", "EUR", 10.0) - testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 2)) - testDictionariesDatabaseAccessor.addAssetPair(AssetPair("EURUSD", "EUR", "USD", 5)) - val operations = LinkedList() operations.add(WalletOperation("Client1", "USD", BigDecimal.valueOf(-10.0))) operations.add(WalletOperation("Client2", "USD", BigDecimal.valueOf(10.0))) @@ -147,9 +153,6 @@ class FeeProcessorTest { fun testNoAbsoluteFee() { testBalanceHolderWrapper.updateBalance("Client2", "EUR", 0.09) - testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 2)) - testDictionariesDatabaseAccessor.addAssetPair(AssetPair("EURUSD", "EUR", "USD", 5)) - val operations = LinkedList() operations.add(WalletOperation("Client1", "USD", BigDecimal.valueOf(-0.5))) operations.add(WalletOperation("Client2", "USD", BigDecimal.valueOf(0.5))) @@ -173,9 +176,6 @@ class FeeProcessorTest { @Test fun testAbsoluteFeeCashout() { - testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 2)) - testDictionariesDatabaseAccessor.addAssetPair(AssetPair("EURUSD", "EUR", "USD", 5)) - val operations = LinkedList() operations.add(WalletOperation("Client1", "USD", BigDecimal.valueOf(-0.5))) val receiptOperation = operations[0] @@ -192,9 +192,6 @@ class FeeProcessorTest { @Test fun testPercentFeeCashout() { - testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 2)) - testDictionariesDatabaseAccessor.addAssetPair(AssetPair("EURUSD", "EUR", "USD", 5)) - val operations = LinkedList() operations.add(WalletOperation("Client1", "USD", BigDecimal.valueOf(-0.5))) val receiptOperation = operations[0] @@ -211,19 +208,18 @@ class FeeProcessorTest { @Test fun testAnotherAssetFee() { - testBalanceHolderWrapper.updateBalance("Client2", "EUR", 0.6543) - testBackOfficeDatabaseAccessor.addAsset(Asset("EUR", 4)) + testBalanceHolderWrapper.updateBalance("Client2", "CHF", 0.6543) val operations = LinkedList() operations.add(WalletOperation("Client1", "USD", BigDecimal.valueOf(-0.5))) operations.add(WalletOperation("Client2", "USD", BigDecimal.valueOf(0.5))) val receiptOperation = operations[1] - val feeInstructions = buildFeeInstructions(type = FeeType.CLIENT_FEE, size = 0.6543, sizeType = FeeSizeType.ABSOLUTE, targetClientId = "Client3", assetIds = listOf("EUR")) + val feeInstructions = buildFeeInstructions(type = FeeType.CLIENT_FEE, size = 0.6543, sizeType = FeeSizeType.ABSOLUTE, targetClientId = "Client3", assetIds = listOf("CHF")) val fees = feeProcessor.processFee(feeInstructions, receiptOperation, operations, balancesGetter = createBalancesGetter()) assertEquals(1, fees.size) assertEquals(BigDecimal.valueOf(0.6543), fees.first().transfer!!.volume) - assertEquals("EUR", fees.first().transfer!!.asset) + assertEquals("CHF", fees.first().transfer!!.asset) assertEquals(4, operations.size) } From 344aeeba0e9761d2822d199a52b13f1c21aba4f0 Mon Sep 17 00:00:00 2001 From: papchenko Date: Tue, 16 Apr 2019 14:38:28 +0300 Subject: [PATCH 14/16] LWDEV-9478 fixes --- .../kotlin/com/lykke/matching/engine/services/RoundingTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt index 227196845..2f9718f9c 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/RoundingTest.kt @@ -340,7 +340,7 @@ class RoundingTest : AbstractTest() { fun testNotStraightBuyEURJPY() { testOrderBookWrapper.addLimitOrder(buildLimitOrder(assetId = "EURJPY", price = 116.356, volume = 1000.0, clientId = "Client3")) testBalanceHolderWrapper.updateBalance("Client3", "JPY", 1000.0) - testBalanceHolderWrapper.updateBalance("Client4", "EUR", 0.0) + testBalanceHolderWrapper.updateBalance("Client4", "EUR", 0.00999999999999999) initServices() marketOrderService.processMessage(buildMarketOrderWrapper(buildMarketOrder(clientId = "Client4", assetId = "EURJPY", volume = 1.16, straight = false))) From 715c789fdf1d600bace6a1e9899a697a36a0ea6d Mon Sep 17 00:00:00 2001 From: papchenko Date: Wed, 17 Apr 2019 15:50:44 +0300 Subject: [PATCH 15/16] LWDEV-9478 remove send notifications from wallets processor --- src/dist/cfg/log4j2.xml | 5 +++ .../balance/WalletOperationsProcessor.kt | 6 --- .../outgoing/messages/CashInOutEventData.kt | 3 +- .../messages/CashTransferEventData.kt | 3 +- .../senders/impl/OldFormatBalancesSender.kt | 12 ++++++ .../impl/specialized/CashInOutEventSender.kt | 2 +- .../specialized/CashInOutOldEventSender.kt | 38 +++++++++++++++---- .../specialized/CashTransferEventSender.kt | 2 +- .../specialized/CashTransferOldEventSender.kt | 22 +++++++---- .../OldFormatExecutionEventSender.kt | 13 ++++--- .../engine/services/BalancesService.kt | 1 - .../engine/services/BalancesServiceImpl.kt | 12 +----- .../services/CashInOutOperationService.kt | 2 +- .../services/CashTransferOperationService.kt | 2 +- .../ReservedCashInOutOperationService.kt | 11 +++++- .../balance/ReservedVolumesRecalculator.kt | 11 ++++-- .../balance/WalletOperationsProcessorTest.kt | 15 ++++++-- .../engine/config/TestApplicationContext.kt | 17 +++++---- .../engine/config/TestExecutionContext.kt | 18 ++++++--- .../performance/AbstractPerformanceTest.kt | 3 +- .../engine/services/BalancesServiceTest.kt | 17 --------- 21 files changed, 125 insertions(+), 90 deletions(-) create mode 100644 src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/OldFormatBalancesSender.kt diff --git a/src/dist/cfg/log4j2.xml b/src/dist/cfg/log4j2.xml index 7c3e2c424..ee832ae31 100644 --- a/src/dist/cfg/log4j2.xml +++ b/src/dist/cfg/log4j2.xml @@ -564,6 +564,11 @@ + + + + # Errors logger diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt index fcc632079..c960eb5ea 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt @@ -111,12 +111,6 @@ class WalletOperationsProcessor(private val balancesService: BalancesService, return currentTransactionBalancesHolder.persistenceData() } - fun sendNotification(id: String, type: String, messageId: String) { - if (clientBalanceUpdatesByClientIdAndAssetId.isNotEmpty()) { - balancesService.sendBalanceUpdate(BalanceUpdate(id, type, Date(), clientBalanceUpdatesByClientIdAndAssetId.values.toList(), messageId)) - } - } - fun getClientBalanceUpdates(): List { return clientBalanceUpdatesByClientIdAndAssetId.values.toList() } diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashInOutEventData.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashInOutEventData.kt index eb35bfac1..b2a5e40d9 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashInOutEventData.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashInOutEventData.kt @@ -1,6 +1,5 @@ package com.lykke.matching.engine.outgoing.messages -import com.lykke.matching.engine.balance.WalletOperationsProcessor import com.lykke.matching.engine.daos.Asset import com.lykke.matching.engine.daos.OutgoingEventData import com.lykke.matching.engine.daos.WalletOperation @@ -12,7 +11,7 @@ class CashInOutEventData(val messageId: String, val sequenceNumber: Long, val now: Date, val timestamp: Date, - val walletProcessor: WalletOperationsProcessor, + val clientBalanceUpdates: List, val walletOperation: WalletOperation, val asset: Asset, val internalFees: List diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashTransferEventData.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashTransferEventData.kt index cf87b28b5..0877fc289 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashTransferEventData.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/messages/CashTransferEventData.kt @@ -1,13 +1,12 @@ package com.lykke.matching.engine.outgoing.messages -import com.lykke.matching.engine.balance.WalletOperationsProcessor import com.lykke.matching.engine.daos.OutgoingEventData import com.lykke.matching.engine.daos.TransferOperation import com.lykke.matching.engine.daos.fee.v2.Fee import java.util.* class CashTransferEventData(val messageId: String, - val walletProcessor: WalletOperationsProcessor, + val clientBalanceUpdates: List, val fees: List, val transferOperation: TransferOperation, val sequenceNumber: Long, diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/OldFormatBalancesSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/OldFormatBalancesSender.kt new file mode 100644 index 000000000..885f89352 --- /dev/null +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/OldFormatBalancesSender.kt @@ -0,0 +1,12 @@ +package com.lykke.matching.engine.outgoing.senders.impl + +import com.lykke.matching.engine.messages.MessageType +import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate + +@Deprecated("Old outgoing messages format is deprecated") +interface OldFormatBalancesSender { + fun sendBalanceUpdate(id: String, + type: MessageType, + messageId: String, + clientBalanceUpdates: List) +} \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutEventSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutEventSender.kt index 079f5258a..8c0d7d01f 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutEventSender.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutEventSender.kt @@ -22,7 +22,7 @@ class CashInOutEventSender(private val messageSender: MessageSender) : Specializ requestId = cashInOutEventData.externalId, date = cashInOutEventData.now, messageType = MessageType.CASH_IN_OUT_OPERATION, - clientBalanceUpdates = cashInOutEventData.walletProcessor.getClientBalanceUpdates(), + clientBalanceUpdates = cashInOutEventData.clientBalanceUpdates, cashInOperation = cashInOutEventData.walletOperation, internalFees = cashInOutEventData.internalFees) diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutOldEventSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutOldEventSender.kt index e8b37f078..dd02ca13f 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutOldEventSender.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashInOutOldEventSender.kt @@ -2,30 +2,43 @@ package com.lykke.matching.engine.outgoing.senders.impl.specialized import com.lykke.matching.engine.daos.OutgoingEventData import com.lykke.matching.engine.messages.MessageType +import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.outgoing.messages.CashOperation import com.lykke.matching.engine.outgoing.messages.CashInOutEventData +import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate import com.lykke.matching.engine.outgoing.senders.SpecializedEventSender +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender +import com.lykke.matching.engine.services.BalancesServiceImpl import com.lykke.matching.engine.utils.NumberUtils +import org.apache.juli.logging.LogFactory import org.springframework.stereotype.Component +import java.util.* import java.util.concurrent.BlockingQueue @Deprecated("Old format of outgoing message is deprecated") @Component -class CashInOutOldEventSender(private val rabbitCashInOutQueue: BlockingQueue) : SpecializedEventSender { +class CashInOutOldEventSender(private val rabbitCashInOutQueue: BlockingQueue, + private val balanceUpdateQueue: BlockingQueue) : SpecializedEventSender, + OldFormatBalancesSender { + + private companion object { + val LOGGER = LogFactory.getLog(CashInOutOldEventSender::class.java) + } + override fun getEventClass(): Class { return CashInOutEventData::class.java } override fun sendEvent(event: OutgoingEventData) { val cashInOutEventData = event as CashInOutEventData - cashInOutEventData - .walletProcessor - .sendNotification(id = cashInOutEventData.externalId, - type = MessageType.CASH_IN_OUT_OPERATION.name, - messageId = cashInOutEventData.messageId) + + sendBalanceUpdate(cashInOutEventData.externalId, + MessageType.CASH_IN_OUT_OPERATION, + cashInOutEventData.messageId, + cashInOutEventData.clientBalanceUpdates) rabbitCashInOutQueue.put(CashOperation( - id = cashInOutEventData.externalId, + id = cashInOutEventData.externalId, clientId = cashInOutEventData.walletOperation.clientId, dateTime = cashInOutEventData.timestamp, volume = NumberUtils.setScaleRoundHalfUp(cashInOutEventData.walletOperation.amount, cashInOutEventData.asset.accuracy).toPlainString(), @@ -34,4 +47,15 @@ class CashInOutOldEventSender(private val rabbitCashInOutQueue: BlockingQueue) { + if (clientBalanceUpdates.isNotEmpty()) { + val balanceUpdate = BalanceUpdate(id, type.name, Date(), clientBalanceUpdates, messageId) + LOGGER.info(balanceUpdate.toString()) + balanceUpdateQueue.put(balanceUpdate) + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferEventSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferEventSender.kt index 195f7720e..655a5f529 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferEventSender.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferEventSender.kt @@ -21,7 +21,7 @@ class CashTransferEventSender(val messageSender: MessageSender): SpecializedEven cashTransferEventData.transferOperation.externalId, cashTransferEventData.now, MessageType.CASH_TRANSFER_OPERATION, - cashTransferEventData.walletProcessor.getClientBalanceUpdates(), + cashTransferEventData.clientBalanceUpdates, cashTransferEventData.transferOperation, cashTransferEventData.fees) diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferOldEventSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferOldEventSender.kt index e9f4c33ab..8ab8d6749 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferOldEventSender.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/CashTransferOldEventSender.kt @@ -6,7 +6,9 @@ import com.lykke.matching.engine.fee.singleFeeTransfer import com.lykke.matching.engine.messages.MessageType import com.lykke.matching.engine.outgoing.messages.CashTransferEventData import com.lykke.matching.engine.outgoing.messages.CashTransferOperation +import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate import com.lykke.matching.engine.outgoing.senders.SpecializedEventSender +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.utils.NumberUtils import org.springframework.stereotype.Component import org.springframework.util.CollectionUtils @@ -14,7 +16,8 @@ import java.util.concurrent.BlockingQueue @Component @Deprecated("Old format of outgoing message is deprecated") -class CashTransferOldEventSender(private val notificationQueue: BlockingQueue) : SpecializedEventSender { +class CashTransferOldEventSender(private val notificationQueue: BlockingQueue, + private val oldFormatBalancesSender: OldFormatBalancesSender) : SpecializedEventSender { override fun getEventClass(): Class { return CashTransferEventData::class.java } @@ -23,7 +26,9 @@ class CashTransferOldEventSender(private val notificationQueue: BlockingQueue) { + oldFormatBalancesSender.sendBalanceUpdate(externalId, + MessageType.CASH_TRANSFER_OPERATION, + messageId, + clientBalanceUpdates) } } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/OldFormatExecutionEventSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/OldFormatExecutionEventSender.kt index 319f9020a..0ece2e8c4 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/OldFormatExecutionEventSender.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/OldFormatExecutionEventSender.kt @@ -6,6 +6,7 @@ import com.lykke.matching.engine.order.transaction.ExecutionContext import com.lykke.matching.engine.outgoing.messages.LimitOrdersReport import com.lykke.matching.engine.outgoing.messages.MarketOrderWithTrades import com.lykke.matching.engine.outgoing.senders.SpecializedEventSender +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.utils.event.isThereClientEvent import com.lykke.matching.engine.utils.event.isThereTrustedClientEvent import org.springframework.stereotype.Component @@ -15,7 +16,8 @@ import java.util.concurrent.BlockingQueue @Component class OldFormatExecutionEventSender(private val clientLimitOrdersQueue: BlockingQueue, private val trustedClientsLimitOrdersQueue: BlockingQueue, - private val rabbitSwapQueue: BlockingQueue) : SpecializedEventSender { + private val rabbitSwapQueue: BlockingQueue, + private val oldFormatBalancesSender: OldFormatBalancesSender) : SpecializedEventSender { override fun getEventClass(): Class { return ExecutionData::class.java @@ -30,11 +32,10 @@ class OldFormatExecutionEventSender(private val clientLimitOrdersQueue: Blocking } private fun sendBalanceUpdateEvent(executionContext: ExecutionContext) { - executionContext - .walletOperationsProcessor - .sendNotification(id = executionContext.requestId, - type = executionContext.messageType.name, - messageId = executionContext.messageId) + oldFormatBalancesSender.sendBalanceUpdate(executionContext.requestId, + executionContext.messageType, + executionContext.messageId, + executionContext.walletOperationsProcessor.getClientBalanceUpdates()) } private fun sendTrustedClientsExecutionEventIfNeeded(executionContext: ExecutionContext) { diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt index 8de20c0c5..4c4fb740c 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesService.kt @@ -5,5 +5,4 @@ import com.lykke.matching.engine.outgoing.messages.BalanceUpdate interface BalancesService { fun insertOrUpdateWallets(wallets: Collection, messageSequenceNumber: Long?): Boolean - fun sendBalanceUpdate(balanceUpdate: BalanceUpdate) } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt index 9cca867e2..d9f9c44a7 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/BalancesServiceImpl.kt @@ -5,16 +5,13 @@ import com.lykke.matching.engine.database.PersistenceManager import com.lykke.matching.engine.database.common.entity.BalancesData import com.lykke.matching.engine.database.common.entity.PersistenceData import com.lykke.matching.engine.holders.BalancesHolder -import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.utils.logging.MetricsLogger import org.slf4j.LoggerFactory import org.springframework.stereotype.Service -import java.util.concurrent.BlockingQueue @Service class BalancesServiceImpl(private val balancesHolder: BalancesHolder, - private val persistenceManager: PersistenceManager, - private val balanceUpdateQueue: BlockingQueue): BalancesService { + private val persistenceManager: PersistenceManager): BalancesService { private companion object { val LOGGER = LoggerFactory.getLogger(BalancesServiceImpl::class.java.name) val METRICS_LOGGER = MetricsLogger.getLogger() @@ -41,11 +38,4 @@ class BalancesServiceImpl(private val balancesHolder: BalancesHolder, balancesHolder.setWallets(wallets) return true } - - override fun sendBalanceUpdate(balanceUpdate: BalanceUpdate) { - if (balanceUpdate.balances.isNotEmpty()) { - LOGGER.info(balanceUpdate.toString()) - balanceUpdateQueue.put(balanceUpdate) - } - } } \ No newline at end of file diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt index f1ffecfac..bace34983 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashInOutOperationService.kt @@ -101,7 +101,7 @@ class CashInOutOperationService(private val balancesHolder: BalancesHolder, sequenceNumber, now, cashInOutOperation.dateTime, - walletProcessor, + walletProcessor.getClientBalanceUpdates(), walletOperation, asset, fees)) diff --git a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt index ee803fc87..05a5afeea 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/CashTransferOperationService.kt @@ -116,7 +116,7 @@ class CashTransferOperationService(private val balancesHolder: BalancesHolder, } walletProcessor.apply() outgoingEventProcessor.submitCashTransferEvent(CashTransferEventData(cashTransferContext.messageId, - walletProcessor, + walletProcessor.getClientBalanceUpdates(), fees, operation, sequenceNumber, diff --git a/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt b/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt index 826c3aae8..da4ce5c88 100644 --- a/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt +++ b/src/main/kotlin/com/lykke/matching/engine/services/ReservedCashInOutOperationService.kt @@ -13,6 +13,7 @@ import com.lykke.matching.engine.messages.MessageType import com.lykke.matching.engine.messages.MessageWrapper import com.lykke.matching.engine.messages.ProtocolMessages import com.lykke.matching.engine.outgoing.messages.ReservedCashOperation +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.services.validators.ReservedCashInOutOperationValidator import com.lykke.matching.engine.services.validators.impl.ValidationException import com.lykke.matching.engine.utils.NumberUtils @@ -32,7 +33,8 @@ class ReservedCashInOutOperationService @Autowired constructor (private val asse private val reservedCashInOutOperationValidator: ReservedCashInOutOperationValidator, private val messageProcessingStatusHolder: MessageProcessingStatusHolder, private val persistenceManager: PersistenceManager, - private val uuidHolder: UUIDHolder) : AbstractService { + private val uuidHolder: UUIDHolder, + private val oldFormatBalancesSender: OldFormatBalancesSender) : AbstractService { companion object { private val LOGGER = LoggerFactory.getLogger(ReservedCashInOutOperationService::class.java.name) @@ -88,7 +90,12 @@ class ReservedCashInOutOperationService @Autowired constructor (private val asse LOGGER.info("Reserved cash in/out operation (${message.id}) for client ${message.clientId} asset ${message.assetId}, volume: ${NumberUtils.roundForPrint(message.reservedVolume)}: unable to save balance") return } - walletProcessor.apply().sendNotification(message.id, MessageType.RESERVED_CASH_IN_OUT_OPERATION.name, messageWrapper.messageId!!) + + walletProcessor.apply() + oldFormatBalancesSender.sendBalanceUpdate(message.id, + MessageType.RESERVED_CASH_IN_OUT_OPERATION, + messageWrapper.messageId!!, + walletProcessor.getClientBalanceUpdates()) reservedCashOperationQueue.put(ReservedCashOperation(message.id, operation.clientId, diff --git a/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt b/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt index 7be77a23c..5b697f335 100644 --- a/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt +++ b/src/main/kotlin/com/lykke/matching/engine/utils/balance/ReservedVolumesRecalculator.kt @@ -14,10 +14,10 @@ import com.lykke.matching.engine.holders.MessageSequenceNumberHolder import com.lykke.matching.engine.holders.OrdersDatabaseAccessorsHolder import com.lykke.matching.engine.holders.StopOrdersDatabaseAccessorsHolder import com.lykke.matching.engine.messages.MessageType -import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate import com.lykke.matching.engine.outgoing.messages.v2.builders.EventFactory import com.lykke.matching.engine.outgoing.messages.v2.events.Event +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.services.BalancesService import com.lykke.matching.engine.services.MessageSender import com.lykke.matching.engine.utils.NumberUtils @@ -46,7 +46,8 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa @Value("#{Config.me.correctReservedVolumes}") private val correctReservedVolumes: Boolean, private val messageSequenceNumberHolder: MessageSequenceNumberHolder, private val messageSender: MessageSender, - private val balancesService: BalancesService) : ApplicationRunner { + private val balancesService: BalancesService, + private val oldFormatBalancesSender: OldFormatBalancesSender) : ApplicationRunner { override fun run(args: ApplicationArguments?) { correctReservedVolumesIfNeed() } @@ -190,9 +191,11 @@ class ReservedVolumesRecalculator @Autowired constructor(private val orderBookDa } reservedVolumesDatabaseAccessor.addCorrectionsInfo(corrections) - balancesService.sendBalanceUpdate(BalanceUpdate(operationId, MessageType.LIMIT_ORDER.name, now, balanceUpdates, operationId)) + oldFormatBalancesSender.sendBalanceUpdate(id = operationId, + messageId = operationId, + clientBalanceUpdates = balanceUpdates, + type = MessageType.LIMIT_ORDER) cashInOutEvents.forEach { messageSender.sendMessage(it) } - } LOGGER.info("Reserved volume recalculation finished") } diff --git a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt index 2b82fcfe9..66680b3a3 100644 --- a/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorTest.kt @@ -8,8 +8,9 @@ import com.lykke.matching.engine.daos.setting.AvailableSettingGroup import com.lykke.matching.engine.database.BackOfficeDatabaseAccessor import com.lykke.matching.engine.database.TestBackOfficeDatabaseAccessor import com.lykke.matching.engine.database.common.entity.PersistenceData -import com.lykke.matching.engine.database.TestSettingsDatabaseAccessor +import com.lykke.matching.engine.messages.MessageType import com.lykke.matching.engine.outgoing.messages.BalanceUpdate +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import org.junit.Test import org.junit.runner.RunWith import org.springframework.boot.test.context.SpringBootTest @@ -48,6 +49,9 @@ class WalletOperationsProcessorTest : AbstractTest() { @Autowired private lateinit var walletOperationsProcessorFactory: WalletOperationsProcessorFactory + @Autowired + private lateinit var oldFormatBalancesSender: OldFormatBalancesSender + @Test fun testPreProcessWalletOperations() { testBalanceHolderWrapper.updateBalance("Client1", "BTC", 1.0) @@ -77,7 +81,10 @@ class WalletOperationsProcessorTest : AbstractTest() { ) } assertTrue(persistenceManager.persist(PersistenceData( walletOperationsProcessor.persistenceData(), null, null, null, null))) - walletOperationsProcessor.apply().sendNotification("id", "type", "test") + walletOperationsProcessor.apply() + + oldFormatBalancesSender.sendBalanceUpdate("id", MessageType.CASH_IN_OUT_OPERATION, "test", + walletOperationsProcessor.getClientBalanceUpdates()) assertBalance("Client1", "BTC", 0.5, 0.0) assertBalance("Client2", "ETH", 3.0, 0.3) @@ -87,7 +94,7 @@ class WalletOperationsProcessorTest : AbstractTest() { val balanceUpdate = balanceUpdateHandlerTest.balanceUpdateQueue.poll() as BalanceUpdate assertEquals(2, balanceUpdate.balances.size) assertEquals("id", balanceUpdate.id) - assertEquals("type", balanceUpdate.type) + assertEquals(MessageType.CASH_IN_OUT_OPERATION.name, balanceUpdate.type) val clientBalanceUpdate1 = balanceUpdate.balances.first { it.id == "Client1" } assertNotNull(clientBalanceUpdate1) @@ -118,7 +125,7 @@ class WalletOperationsProcessorTest : AbstractTest() { ), true) assertTrue(persistenceManager.persist(PersistenceData(walletOperationsProcessor.persistenceData(), null, null, null, null))) - walletOperationsProcessor.apply().sendNotification("id", "type","test") + walletOperationsProcessor.apply() assertBalance("Client1", "BTC", 0.0, -0.1) } diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index f0cf653f5..1b5ef28c4 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -41,6 +41,7 @@ import com.lykke.matching.engine.outgoing.messages.v2.events.Event import com.lykke.matching.engine.outgoing.messages.v2.events.ExecutionEvent import com.lykke.matching.engine.outgoing.senders.OutgoingEventProcessor import com.lykke.matching.engine.outgoing.senders.SpecializedEventSender +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.services.CashInOutOperationService import com.lykke.matching.engine.services.CashTransferOperationService import com.lykke.matching.engine.services.GenericLimitOrderService @@ -149,12 +150,12 @@ open class TestApplicationContext { balancesHolder: BalancesHolder, balancesService: BalancesService, applicationSettingsHolder: ApplicationSettingsHolder, messageSequenceNumberHolder: MessageSequenceNumberHolder, - messageSender: MessageSender): ReservedVolumesRecalculator { - + messageSender: MessageSender, + oldFormatBalancesSender: OldFormatBalancesSender): ReservedVolumesRecalculator { return ReservedVolumesRecalculator(testOrderDatabaseAccessorHolder, stopOrdersDatabaseAccessorsHolder, testReservedVolumesDatabaseAccessor, assetHolder, assetsPairsHolder, balancesHolder, applicationSettingsHolder, - false, messageSequenceNumberHolder, messageSender, balancesService) + false, messageSequenceNumberHolder, messageSender, balancesService, oldFormatBalancesSender) } @Bean @@ -311,9 +312,10 @@ open class TestApplicationContext { reservedCashInOutOperationValidator: ReservedCashInOutOperationValidator, messageProcessingStatusHolder: MessageProcessingStatusHolder, persistenceManager: PersistenceManager, - uuidHolder: UUIDHolder): ReservedCashInOutOperationService { + uuidHolder: UUIDHolder, + oldFormatBalancesSender: OldFormatBalancesSender): ReservedCashInOutOperationService { return ReservedCashInOutOperationService(assetsHolder, walletOperationsProcessorFactory, reservedCashOperationQueue, - reservedCashInOutOperationValidator, messageProcessingStatusHolder, persistenceManager, uuidHolder) + reservedCashInOutOperationValidator, messageProcessingStatusHolder, persistenceManager, uuidHolder, oldFormatBalancesSender) } @Bean @@ -729,8 +731,7 @@ open class TestApplicationContext { @Bean open fun balancesService(balancesHolder: BalancesHolder, - persistenceManager: PersistenceManager, - balanceUpdateQueue: BlockingQueue): BalancesService { - return BalancesServiceImpl(balancesHolder, persistenceManager, balanceUpdateQueue) + persistenceManager: PersistenceManager): BalancesService { + return BalancesServiceImpl(balancesHolder, persistenceManager) } } \ No newline at end of file diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt index 138618bde..70ae0fd67 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt @@ -26,6 +26,7 @@ import com.lykke.matching.engine.order.process.common.LimitOrdersCancellerImpl import com.lykke.matching.engine.order.process.common.MatchingResultHandlingHelper import com.lykke.matching.engine.order.transaction.ExecutionContextFactory import com.lykke.matching.engine.order.transaction.ExecutionEventsSequenceNumbersGenerator +import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.outgoing.messages.CashInOutEventData import com.lykke.matching.engine.outgoing.messages.CashOperation import com.lykke.matching.engine.outgoing.messages.CashTransferEventData @@ -35,6 +36,7 @@ import com.lykke.matching.engine.outgoing.messages.CashTransferOperation import com.lykke.matching.engine.outgoing.messages.OrderBook import com.lykke.matching.engine.outgoing.senders.OutgoingEventProcessor import com.lykke.matching.engine.outgoing.senders.SpecializedEventSender +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.outgoing.senders.impl.specialized.CashInOutEventSender import com.lykke.matching.engine.outgoing.senders.impl.specialized.CashInOutOldEventSender import com.lykke.matching.engine.outgoing.senders.impl.OutgoingEventProcessorImpl @@ -101,8 +103,9 @@ open class TestExecutionContext { } @Bean - open fun cashTransferOldSender(notificationQueue: BlockingQueue): SpecializedEventSender { - return CashTransferOldEventSender(notificationQueue) + open fun cashTransferOldSender(notificationQueue: BlockingQueue, + oldFormatBalancesSender: OldFormatBalancesSender): SpecializedEventSender { + return CashTransferOldEventSender(notificationQueue, oldFormatBalancesSender) } @Bean @@ -122,11 +125,13 @@ open class TestExecutionContext { @Bean open fun specializedOldExecutionEventSender(clientLimitOrdersQueue: BlockingQueue, trustedClientsLimitOrdersQueue: BlockingQueue, - rabbitSwapQueue: BlockingQueue): SpecializedEventSender { + rabbitSwapQueue: BlockingQueue, + oldFormatBalancesSender: OldFormatBalancesSender): SpecializedEventSender { return OldFormatExecutionEventSender( clientLimitOrdersQueue, trustedClientsLimitOrdersQueue, - rabbitSwapQueue) + rabbitSwapQueue, + oldFormatBalancesSender) } @Bean @@ -135,8 +140,9 @@ open class TestExecutionContext { } @Bean - open fun specializedCashInOutOldEventSender(rabbitCashInOutQueue: BlockingQueue): SpecializedEventSender { - return CashInOutOldEventSender(rabbitCashInOutQueue) + open fun specializedCashInOutOldEventSender(rabbitCashInOutQueue: BlockingQueue, + balanceUpdateQueue: BlockingQueue): CashInOutOldEventSender { + return CashInOutOldEventSender(rabbitCashInOutQueue, balanceUpdateQueue) } @Bean diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index b0d7fc1a3..a7a38754f 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -26,7 +26,6 @@ import com.lykke.matching.engine.holders.TestUUIDHolder import com.lykke.matching.engine.incoming.parsers.impl.LimitOrderCancelOperationContextParser import com.lykke.matching.engine.incoming.parsers.impl.LimitOrderMassCancelOperationContextParser import com.lykke.matching.engine.matching.MatchingEngine -import com.lykke.matching.engine.notification.BalanceUpdateHandlerTest import com.lykke.matching.engine.order.ExecutionDataApplyService import com.lykke.matching.engine.order.ExecutionPersistenceService import com.lykke.matching.engine.order.ExpiryOrdersQueue @@ -168,7 +167,7 @@ abstract class AbstractPerformanceTest { ordersDatabaseAccessorsHolder, stopOrdersDatabaseAccessorsHolder) balancesHolder = BalancesHolder(balancesDatabaseAccessorsHolder) - balancesService = BalancesServiceImpl(balancesHolder, persistenceManager, balanceUpdateQueue) + balancesService = BalancesServiceImpl(balancesHolder, persistenceManager) testBalanceHolderWrapper = TestBalanceHolderWrapper(balancesService, balancesHolder) assetPairsCache = AssetPairsCache(testDictionariesDatabaseAccessor) diff --git a/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt b/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt index 6d898a7a0..5100db635 100644 --- a/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/services/BalancesServiceTest.kt @@ -33,9 +33,6 @@ class BalancesServiceTest { @Autowired private lateinit var testBalancesDatabaseAccessorsHolder: BalancesDatabaseAccessorsHolder - @Autowired - private lateinit var balanceUpdateHandlerTest: BalanceUpdateHandlerTest - @Test fun testInsertOrUpdateWallets() { balancesService.insertOrUpdateWallets(listOf(Wallet("test", listOf(AssetBalance("test", "BTC", BigDecimal.valueOf(10))))), null) @@ -44,18 +41,4 @@ class BalancesServiceTest { assertEquals(BigDecimal.valueOf(10), balancesHolder.getBalance("test", "BTC")) assertEquals(BigDecimal.valueOf(10), testBalancesDatabaseAccessorsHolder.primaryAccessor.loadWallets()["test"]?.balances!!["BTC"]?.balance) } - - @Test - fun testSendBalanceUpdate() { - balancesService.sendBalanceUpdate(BalanceUpdate("test", "", Date(), - listOf(ClientBalanceUpdate("test", - "BTC", - BigDecimal.valueOf(10), - BigDecimal.valueOf(15), - BigDecimal.valueOf(0), - BigDecimal.valueOf(1))), - "testMessageId")) - - assertEquals(1, balanceUpdateHandlerTest.getCountOfBalanceUpdate()) - } } \ No newline at end of file From e61bfbeb06f0c4d755ca27a9d50108e3126af01c Mon Sep 17 00:00:00 2001 From: papchenko Date: Fri, 26 Apr 2019 17:27:49 +0300 Subject: [PATCH 16/16] LWDEV-9478 merge fixes --- .../engine/balance/WalletOperationsProcessor.kt | 10 +++------- .../engine/balance/WalletOperationsProcessorFactory.kt | 6 ++---- .../specialized/ReservedCashInOutOldEventSender.kt | 9 +++++++-- .../matching/engine/config/TestApplicationContext.kt | 5 ++--- .../matching/engine/config/TestExecutionContext.kt | 5 +++-- .../engine/performance/AbstractPerformanceTest.kt | 2 +- 6 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt index a7e3e16c6..6fb6d3cfc 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessor.kt @@ -6,20 +6,16 @@ import com.lykke.matching.engine.daos.wallet.Wallet import com.lykke.matching.engine.database.common.entity.BalancesData import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder -import com.lykke.matching.engine.outgoing.messages.BalanceUpdate import com.lykke.matching.engine.outgoing.messages.ClientBalanceUpdate import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolder import com.lykke.matching.engine.order.transaction.WalletAssetBalance -import com.lykke.matching.engine.services.BalancesService import com.lykke.matching.engine.utils.NumberUtils import com.lykke.utils.logging.MetricsLogger import org.slf4j.Logger import org.slf4j.LoggerFactory import java.math.BigDecimal -import java.util.Date -class WalletOperationsProcessor(private val balancesService: BalancesService, - private val currentTransactionBalancesHolder: CurrentTransactionBalancesHolder, +class WalletOperationsProcessor(private val currentTransactionBalancesHolder: CurrentTransactionBalancesHolder, private val applicationSettingsHolder: ApplicationSettingsHolder, private val assetsHolder: AssetsHolder, private val logger: Logger?) : BalancesGetter { @@ -55,14 +51,14 @@ class WalletOperationsProcessor(private val balancesService: BalancesService, changedAssetBalance.reserved } - validateChangedAssetBalances(changedAssetBalances, forceApply) + validateChangedAssetBalances(changedAssetBalances, allowInvalidBalance) changedAssetBalances.forEach { processChangedAssetBalance(it.value) } return this } - private fun validateChangedAssetBalances(changedAssetBalances: HashMap, forceApply: Boolean) { + private fun validateChangedAssetBalances(changedAssetBalances: HashMap, allowInvalidBalance: Boolean) { try { changedAssetBalances.values.forEach { validateBalanceChange(it) } } catch (e: BalanceException) { diff --git a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt index aaa1c9a3f..a1f6802d4 100644 --- a/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt +++ b/src/main/kotlin/com/lykke/matching/engine/balance/WalletOperationsProcessorFactory.kt @@ -3,18 +3,16 @@ package com.lykke.matching.engine.balance import com.lykke.matching.engine.holders.ApplicationSettingsHolder import com.lykke.matching.engine.holders.AssetsHolder import com.lykke.matching.engine.order.transaction.CurrentTransactionBalancesHolderFactory -import com.lykke.matching.engine.services.BalancesService import org.slf4j.Logger import org.springframework.stereotype.Component @Component class WalletOperationsProcessorFactory(private val currentTransactionBalancesHolderFactory: CurrentTransactionBalancesHolderFactory, private val applicationSettingsHolder: ApplicationSettingsHolder, - private val assetsHolder: AssetsHolder, - private val balancesService: BalancesService) { + private val assetsHolder: AssetsHolder) { fun create(logger: Logger?): WalletOperationsProcessor { - return WalletOperationsProcessor(balancesService, + return WalletOperationsProcessor( currentTransactionBalancesHolderFactory.create(), applicationSettingsHolder, assetsHolder, diff --git a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/ReservedCashInOutOldEventSender.kt b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/ReservedCashInOutOldEventSender.kt index 353243cf9..35ed0eb33 100644 --- a/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/ReservedCashInOutOldEventSender.kt +++ b/src/main/kotlin/com/lykke/matching/engine/outgoing/senders/impl/specialized/ReservedCashInOutOldEventSender.kt @@ -4,20 +4,25 @@ import com.lykke.matching.engine.messages.MessageType import com.lykke.matching.engine.outgoing.messages.ReservedCashInOutEventData import com.lykke.matching.engine.outgoing.messages.ReservedCashOperation import com.lykke.matching.engine.outgoing.senders.SpecializedEventSender +import com.lykke.matching.engine.outgoing.senders.impl.OldFormatBalancesSender import com.lykke.matching.engine.utils.NumberUtils import org.springframework.stereotype.Component import java.util.concurrent.BlockingQueue @Deprecated("Old format of outgoing message is deprecated") @Component -class ReservedCashInOutOldEventSender(private val reservedCashOperationQueue: BlockingQueue) : SpecializedEventSender { +class ReservedCashInOutOldEventSender(private val reservedCashOperationQueue: BlockingQueue, + private val oldFormatBalancesSender: OldFormatBalancesSender) : SpecializedEventSender { override fun getEventClass(): Class { return ReservedCashInOutEventData::class.java } override fun sendEvent(event: ReservedCashInOutEventData) { - event.walletOperationsProcessor.sendNotification(event.requestId, MessageType.RESERVED_CASH_IN_OUT_OPERATION.name, event.messageId) + oldFormatBalancesSender.sendBalanceUpdate(id = event.requestId, + messageId = event.messageId, + clientBalanceUpdates = event.walletOperationsProcessor.getClientBalanceUpdates(), + type = MessageType.RESERVED_CASH_IN_OUT_OPERATION) reservedCashOperationQueue.put(ReservedCashOperation(event.requestId, event.walletOperation.clientId, diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt index 04f7d0289..7ddaf5f9b 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestApplicationContext.kt @@ -729,9 +729,8 @@ open class TestApplicationContext { @Bean open fun walletOperationsProcessorFactory(currentTransactionBalancesHolderFactory: CurrentTransactionBalancesHolderFactory, applicationSettingsHolder: ApplicationSettingsHolder, - assetsHolder: AssetsHolder, - balancesService: BalancesService): WalletOperationsProcessorFactory { - return WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, applicationSettingsHolder, assetsHolder, balancesService) + assetsHolder: AssetsHolder): WalletOperationsProcessorFactory { + return WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, applicationSettingsHolder, assetsHolder) } @Bean diff --git a/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt b/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt index 148f63b3e..6ef5528dd 100644 --- a/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt +++ b/src/test/kotlin/com/lykke/matching/engine/config/TestExecutionContext.kt @@ -150,9 +150,10 @@ open class TestExecutionContext { } @Bean - open fun specializedReservedCashInOutOldEventSender(reservedCashOperationQueue: BlockingQueue) + open fun specializedReservedCashInOutOldEventSender(reservedCashOperationQueue: BlockingQueue, + oldFormatBalancesSender: OldFormatBalancesSender) : SpecializedEventSender { - return ReservedCashInOutOldEventSender(reservedCashOperationQueue) + return ReservedCashInOutOldEventSender(reservedCashOperationQueue, oldFormatBalancesSender) } @Bean diff --git a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt index 1ec371e44..7dacd9882 100644 --- a/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt +++ b/src/test/kotlin/com/lykke/matching/engine/performance/AbstractPerformanceTest.kt @@ -134,7 +134,7 @@ abstract class AbstractPerformanceTest { val currentTransactionBalancesHolderFactory = CurrentTransactionBalancesHolderFactory(balancesHolder) val walletOperationsProcessorFactory = WalletOperationsProcessorFactory(currentTransactionBalancesHolderFactory, - applicationSettingsHolder, assetsHolder, balancesService) + applicationSettingsHolder, assetsHolder) val outgoingEventData = LinkedBlockingQueue()