forked from Qortal/qortal
Added defrag (repository maintenance) tests.
This commit is contained in:
parent
49749a0bc7
commit
53cd967541
@ -3,9 +3,12 @@ package org.qortal.test;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.qortal.account.Account;
|
||||
import org.qortal.account.PublicKeyAccount;
|
||||
import org.qortal.asset.Asset;
|
||||
import org.qortal.crosschain.BitcoinACCTv1;
|
||||
import org.qortal.crypto.Crypto;
|
||||
import org.qortal.data.account.AccountBalanceData;
|
||||
import org.qortal.data.account.AccountData;
|
||||
import org.qortal.repository.DataException;
|
||||
import org.qortal.repository.Repository;
|
||||
import org.qortal.repository.RepositoryManager;
|
||||
@ -22,6 +25,7 @@ import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
@ -440,6 +444,119 @@ public class RepositoryTests extends Common {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefrag() throws DataException {
|
||||
try (final HSQLDBRepository hsqldb = (HSQLDBRepository) RepositoryManager.getRepository()) {
|
||||
|
||||
this.populateWithRandomData(hsqldb);
|
||||
|
||||
hsqldb.performPeriodicMaintenance();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDefragOnDisk() throws DataException {
|
||||
Common.useSettingsAndDb(testSettingsFilename, false);
|
||||
|
||||
try (final HSQLDBRepository hsqldb = (HSQLDBRepository) RepositoryManager.getRepository()) {
|
||||
|
||||
this.populateWithRandomData(hsqldb);
|
||||
|
||||
hsqldb.performPeriodicMaintenance();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleDefrags() throws DataException {
|
||||
// Mint some more blocks to populate the database
|
||||
try (final HSQLDBRepository hsqldb = (HSQLDBRepository) RepositoryManager.getRepository()) {
|
||||
|
||||
this.populateWithRandomData(hsqldb);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
hsqldb.performPeriodicMaintenance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleDefragsOnDisk() throws DataException {
|
||||
Common.useSettingsAndDb(testSettingsFilename, false);
|
||||
|
||||
// Mint some more blocks to populate the database
|
||||
try (final HSQLDBRepository hsqldb = (HSQLDBRepository) RepositoryManager.getRepository()) {
|
||||
|
||||
this.populateWithRandomData(hsqldb);
|
||||
|
||||
for (int i = 0; i < 10; i++) {
|
||||
hsqldb.performPeriodicMaintenance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleDefragsWithDifferentData() throws DataException {
|
||||
for (int i=0; i<10; i++) {
|
||||
try (final HSQLDBRepository hsqldb = (HSQLDBRepository) RepositoryManager.getRepository()) {
|
||||
|
||||
this.populateWithRandomData(hsqldb);
|
||||
hsqldb.performPeriodicMaintenance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultipleDefragsOnDiskWithDifferentData() throws DataException {
|
||||
Common.useSettingsAndDb(testSettingsFilename, false);
|
||||
|
||||
for (int i=0; i<10; i++) {
|
||||
try (final HSQLDBRepository hsqldb = (HSQLDBRepository) RepositoryManager.getRepository()) {
|
||||
|
||||
this.populateWithRandomData(hsqldb);
|
||||
hsqldb.performPeriodicMaintenance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void populateWithRandomData(HSQLDBRepository repository) throws DataException {
|
||||
Random random = new Random();
|
||||
|
||||
System.out.println("Creating random accounts...");
|
||||
|
||||
// Generate some random accounts
|
||||
List<Account> accounts = new ArrayList<>();
|
||||
for (int ai = 0; ai < 20; ++ai) {
|
||||
byte[] publicKey = new byte[32];
|
||||
random.nextBytes(publicKey);
|
||||
|
||||
PublicKeyAccount account = new PublicKeyAccount(repository, publicKey);
|
||||
accounts.add(account);
|
||||
|
||||
AccountData accountData = new AccountData(account.getAddress());
|
||||
repository.getAccountRepository().ensureAccount(accountData);
|
||||
}
|
||||
repository.saveChanges();
|
||||
|
||||
System.out.println("Creating random balances...");
|
||||
|
||||
// Fill with lots of random balances
|
||||
for (int i = 0; i < 100000; ++i) {
|
||||
Account account = accounts.get(random.nextInt(accounts.size()));
|
||||
int assetId = random.nextInt(2);
|
||||
long balance = random.nextInt(100000);
|
||||
|
||||
AccountBalanceData accountBalanceData = new AccountBalanceData(account.getAddress(), assetId, balance);
|
||||
repository.getAccountRepository().save(accountBalanceData);
|
||||
|
||||
// Maybe mint a block to change height
|
||||
if (i > 0 && (i % 1000) == 0)
|
||||
BlockUtils.mintBlock(repository);
|
||||
}
|
||||
repository.saveChanges();
|
||||
}
|
||||
|
||||
public static void hsqldbSleep(int millis) throws SQLException {
|
||||
System.out.println(String.format("HSQLDB sleep() thread ID: %s", Thread.currentThread().getId()));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user