2020-03-26 21:05:36 -04:00
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Storage Performance
|
|
|
|
|
|
|
|
Test the performance of various storage functions, in particular when implemented remotely.
|
|
|
|
|
|
|
|
Generally speaking, the starting values should be high enough to "blow up" in terms of execution time if there are performance
|
|
|
|
problems without taking very long if everything is running smoothly. These starting values can then be scaled up for profiling and
|
2020-03-29 21:25:48 -04:00
|
|
|
stress testing as needed.
|
2020-03-26 21:05:36 -04:00
|
|
|
***********************************************************************************************************************************/
|
|
|
|
#include "common/harnessConfig.h"
|
|
|
|
#include "common/harnessFork.h"
|
2020-07-25 08:44:41 -04:00
|
|
|
#include "common/harnessStorage.h"
|
2020-03-26 21:05:36 -04:00
|
|
|
|
2020-03-29 21:25:48 -04:00
|
|
|
#include "common/crypto/hash.h"
|
|
|
|
#include "common/compress/gz/compress.h"
|
|
|
|
#include "common/compress/lz4/compress.h"
|
2021-04-12 16:05:40 -04:00
|
|
|
#include "common/io/filter/filter.h"
|
2020-03-29 21:25:48 -04:00
|
|
|
#include "common/io/filter/sink.h"
|
2020-05-19 14:35:20 -04:00
|
|
|
#include "common/io/bufferRead.h"
|
2020-03-29 21:25:48 -04:00
|
|
|
#include "common/io/bufferWrite.h"
|
2020-08-05 18:25:07 -04:00
|
|
|
#include "common/io/fdRead.h"
|
|
|
|
#include "common/io/fdWrite.h"
|
2020-03-29 21:25:48 -04:00
|
|
|
#include "common/io/io.h"
|
2020-03-30 20:52:57 -04:00
|
|
|
#include "common/type/object.h"
|
2020-03-26 21:05:36 -04:00
|
|
|
#include "protocol/client.h"
|
|
|
|
#include "protocol/server.h"
|
2020-03-29 21:25:48 -04:00
|
|
|
#include "storage/posix/storage.h"
|
2020-03-26 21:05:36 -04:00
|
|
|
#include "storage/remote/protocol.h"
|
|
|
|
|
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Dummy callback functions
|
|
|
|
***********************************************************************************************************************************/
|
|
|
|
static void
|
|
|
|
storageTestDummyInfoListCallback(void *data, const StorageInfo *info)
|
|
|
|
{
|
|
|
|
(void)data;
|
|
|
|
(void)info;
|
|
|
|
|
|
|
|
// Do some work in the mem context to blow up the total time if this is not efficient
|
|
|
|
memResize(memNew(16), 32);
|
|
|
|
}
|
|
|
|
|
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Driver to test storageInfoList
|
|
|
|
***********************************************************************************************************************************/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
STORAGE_COMMON_MEMBER;
|
|
|
|
uint64_t fileTotal;
|
|
|
|
} StorageTestPerfInfoList;
|
|
|
|
|
|
|
|
static bool
|
|
|
|
storageTestPerfInfoList(
|
2020-04-06 16:09:18 -04:00
|
|
|
THIS_VOID, const String *path, StorageInfoLevel level, StorageInfoListCallback callback, void *callbackData,
|
|
|
|
StorageInterfaceInfoListParam param)
|
2020-03-26 21:05:36 -04:00
|
|
|
{
|
|
|
|
THIS(StorageTestPerfInfoList);
|
2020-04-06 16:09:18 -04:00
|
|
|
(void)path; (void)level; (void)param;
|
2020-03-26 21:05:36 -04:00
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
MEM_CONTEXT_TEMP_RESET_BEGIN()
|
|
|
|
{
|
|
|
|
for (uint64_t fileIdx = 0; fileIdx < this->fileTotal; fileIdx++)
|
|
|
|
{
|
2020-07-31 16:18:56 -04:00
|
|
|
callback(callbackData, &(StorageInfo){.exists = true, .name = STRDEF("name")});
|
2020-03-26 21:05:36 -04:00
|
|
|
MEM_CONTEXT_TEMP_RESET(1000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
|
|
|
|
return this->fileTotal != 0;
|
|
|
|
}
|
|
|
|
|
2020-03-29 21:25:48 -04:00
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Test filter to simulate throughput via rate limiting
|
|
|
|
***********************************************************************************************************************************/
|
|
|
|
typedef struct TestIoRate
|
|
|
|
{
|
|
|
|
MemContext *memContext; // Mem context of filter
|
|
|
|
|
|
|
|
uint64_t timeBegin; // Time when filter started processing data in ms
|
|
|
|
uint64_t byteTotal; // Total bytes processed
|
|
|
|
uint64_t bytesPerSec; // Rate in bytes per second to enforce
|
|
|
|
} TestIoRate;
|
|
|
|
|
|
|
|
static void
|
|
|
|
testIoRateProcess(THIS_VOID, const Buffer *input)
|
|
|
|
{
|
|
|
|
THIS(TestIoRate);
|
|
|
|
|
|
|
|
// Determine the elapsed time since the filter began processing data. The begin time is not set in the constructor because an
|
|
|
|
// unknown amount of time can elapse between the filter being created and acually used.
|
|
|
|
uint64_t timeElapsed = 0;
|
|
|
|
|
|
|
|
if (this->timeBegin == 0)
|
|
|
|
this->timeBegin = timeMSec();
|
|
|
|
else
|
|
|
|
timeElapsed = timeMSec() - this->timeBegin;
|
|
|
|
|
|
|
|
// Add buffer used to the byte total
|
|
|
|
this->byteTotal += bufUsed(input);
|
|
|
|
|
|
|
|
// Determine how many ms these bytes should take to go through the filter and sleep if greater than elapsed time
|
2020-05-19 14:35:20 -04:00
|
|
|
uint64_t timeRate = this->byteTotal * MSEC_PER_SEC / this->bytesPerSec;
|
2020-03-29 21:25:48 -04:00
|
|
|
|
|
|
|
if (timeElapsed < timeRate)
|
|
|
|
sleepMSec(timeRate - timeElapsed);
|
|
|
|
}
|
|
|
|
|
|
|
|
static IoFilter *
|
|
|
|
testIoRateNew(uint64_t bytesPerSec)
|
|
|
|
{
|
|
|
|
IoFilter *this = NULL;
|
|
|
|
|
|
|
|
MEM_CONTEXT_NEW_BEGIN("TestIoRate")
|
|
|
|
{
|
|
|
|
TestIoRate *driver = memNew(sizeof(TestIoRate));
|
|
|
|
|
|
|
|
*driver = (TestIoRate)
|
|
|
|
{
|
|
|
|
.memContext = memContextCurrent(),
|
|
|
|
.bytesPerSec = bytesPerSec,
|
|
|
|
};
|
|
|
|
|
2021-05-21 17:36:43 -04:00
|
|
|
this = ioFilterNewP(STRDEF("TestIoRate"), driver, NULL, .in = testIoRateProcess);
|
2020-03-29 21:25:48 -04:00
|
|
|
}
|
|
|
|
MEM_CONTEXT_NEW_END();
|
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2020-03-26 21:05:36 -04:00
|
|
|
/***********************************************************************************************************************************
|
|
|
|
Test Run
|
|
|
|
***********************************************************************************************************************************/
|
|
|
|
void
|
|
|
|
testRun(void)
|
|
|
|
{
|
|
|
|
FUNCTION_HARNESS_VOID();
|
|
|
|
|
|
|
|
// *****************************************************************************************************************************
|
|
|
|
if (testBegin("storageInfoList()"))
|
|
|
|
{
|
|
|
|
// One million files represents a fairly large cluster
|
2021-05-22 09:30:54 -04:00
|
|
|
CHECK(TEST_SCALE <= 2000);
|
|
|
|
uint64_t fileTotal = (uint64_t)1000000 * TEST_SCALE;
|
2020-03-26 21:05:36 -04:00
|
|
|
|
|
|
|
HARNESS_FORK_BEGIN()
|
|
|
|
{
|
|
|
|
HARNESS_FORK_CHILD_BEGIN(0, true)
|
|
|
|
{
|
|
|
|
// Create a basic configuration so the remote storage driver can determine the storage type
|
|
|
|
StringList *argList = strLstNew();
|
|
|
|
strLstAddZ(argList, "--" CFGOPT_STANZA "=test");
|
|
|
|
strLstAddZ(argList, "--" CFGOPT_PROCESS "=0");
|
2021-04-28 11:59:04 -04:00
|
|
|
hrnCfgArgRawStrId(argList, cfgOptRemoteType, protocolStorageTypeRepo);
|
2020-03-26 21:05:36 -04:00
|
|
|
harnessCfgLoadRole(cfgCmdArchivePush, cfgCmdRoleRemote, argList);
|
|
|
|
|
|
|
|
// Create a driver to test remote performance of storageInfoList() and inject it into storageRepo()
|
|
|
|
StorageTestPerfInfoList driver =
|
|
|
|
{
|
|
|
|
.interface = storageInterfaceTestDummy,
|
|
|
|
.fileTotal = fileTotal,
|
|
|
|
};
|
|
|
|
|
|
|
|
driver.interface.infoList = storageTestPerfInfoList;
|
|
|
|
|
2020-11-23 15:55:46 -05:00
|
|
|
storageHelper.storageRepo = memNew(sizeof(Storage *));
|
|
|
|
storageHelper.storageRepo[0] = storageNew(
|
2021-04-23 13:19:47 -04:00
|
|
|
strIdFromZ(stringIdBit6, "test"), STRDEF("/"), 0, 0, false, NULL, &driver, driver.interface);
|
2020-03-26 21:05:36 -04:00
|
|
|
|
|
|
|
// Setup handler for remote storage protocol
|
2021-05-21 17:36:43 -04:00
|
|
|
IoRead *read = ioFdReadNew(STRDEF("storage server read"), HARNESS_FORK_CHILD_READ(), 60000);
|
2020-03-26 21:05:36 -04:00
|
|
|
ioReadOpen(read);
|
2021-05-21 17:36:43 -04:00
|
|
|
IoWrite *write = ioFdWriteNew(STRDEF("storage server write"), HARNESS_FORK_CHILD_WRITE(), 1000);
|
2020-03-26 21:05:36 -04:00
|
|
|
ioWriteOpen(write);
|
|
|
|
|
2021-05-21 17:36:43 -04:00
|
|
|
ProtocolServer *server = protocolServerNew(STRDEF("storage test server"), STRDEF("test"), read, write);
|
2021-03-16 13:09:34 -04:00
|
|
|
|
|
|
|
static const ProtocolServerHandler commandHandler[] = {PROTOCOL_SERVER_HANDLER_STORAGE_REMOTE_LIST};
|
|
|
|
protocolServerProcess(server, NULL, commandHandler, PROTOCOL_SERVER_HANDLER_LIST_SIZE(commandHandler));
|
2020-03-26 21:05:36 -04:00
|
|
|
|
|
|
|
}
|
|
|
|
HARNESS_FORK_CHILD_END();
|
|
|
|
|
|
|
|
HARNESS_FORK_PARENT_BEGIN()
|
|
|
|
{
|
|
|
|
// Create client
|
2021-05-21 17:36:43 -04:00
|
|
|
IoRead *read = ioFdReadNew(STRDEF("storage client read"), HARNESS_FORK_PARENT_READ_PROCESS(0), 60000);
|
2020-03-26 21:05:36 -04:00
|
|
|
ioReadOpen(read);
|
2021-05-21 17:36:43 -04:00
|
|
|
IoWrite *write = ioFdWriteNew(STRDEF("storage client write"), HARNESS_FORK_PARENT_WRITE_PROCESS(0), 1000);
|
2020-03-26 21:05:36 -04:00
|
|
|
ioWriteOpen(write);
|
|
|
|
|
2021-05-21 17:36:43 -04:00
|
|
|
ProtocolClient *client = protocolClientNew(STRDEF("storage test client"), STRDEF("test"), read, write);
|
2020-03-26 21:05:36 -04:00
|
|
|
|
|
|
|
// Create remote storage
|
|
|
|
Storage *storageRemote = storageRemoteNew(
|
|
|
|
STORAGE_MODE_FILE_DEFAULT, STORAGE_MODE_PATH_DEFAULT, false, NULL, client, 1);
|
|
|
|
|
2020-07-31 16:18:56 -04:00
|
|
|
TimeMSec timeBegin = timeMSec();
|
|
|
|
|
2020-03-26 21:05:36 -04:00
|
|
|
// Storage info list
|
|
|
|
TEST_RESULT_VOID(
|
2021-05-22 11:28:56 -04:00
|
|
|
storageInfoListP(storageRemote, NULL, storageTestDummyInfoListCallback, NULL), "list remote files");
|
2020-03-26 21:05:36 -04:00
|
|
|
|
2020-07-31 16:18:56 -04:00
|
|
|
TEST_LOG_FMT("list transferred in %ums", (unsigned int)(timeMSec() - timeBegin));
|
|
|
|
|
2020-03-26 21:05:36 -04:00
|
|
|
// Free client
|
|
|
|
protocolClientFree(client);
|
|
|
|
}
|
|
|
|
HARNESS_FORK_PARENT_END();
|
|
|
|
}
|
|
|
|
HARNESS_FORK_END();
|
|
|
|
}
|
|
|
|
|
2020-03-29 21:25:48 -04:00
|
|
|
// *****************************************************************************************************************************
|
|
|
|
if (testBegin("benchmark filters"))
|
|
|
|
{
|
|
|
|
// 4MB buffers are the current default
|
2020-05-19 14:35:20 -04:00
|
|
|
ioBufferSizeSet(4 * 1024 * 1024);
|
2020-03-29 21:25:48 -04:00
|
|
|
|
|
|
|
// 1MB is a fairly normal table size
|
2021-05-22 09:30:54 -04:00
|
|
|
CHECK(TEST_SCALE <= 1024 * 1024 * 1024);
|
|
|
|
uint64_t blockTotal = (uint64_t)1 * TEST_SCALE;
|
2020-03-29 21:25:48 -04:00
|
|
|
|
|
|
|
// Set iteration
|
|
|
|
unsigned int iteration = 1;
|
|
|
|
|
|
|
|
// Set rate
|
2020-05-19 14:35:20 -04:00
|
|
|
uint64_t rateIn = 0; // MB/s (0 disables)
|
|
|
|
uint64_t rateOut = 0; // MB/s (0 disables)
|
2020-03-29 21:25:48 -04:00
|
|
|
|
|
|
|
// Get the sample pages from disk
|
2021-05-22 09:30:54 -04:00
|
|
|
Buffer *block = storageGetP(storageNewReadP(storagePosixNewP(HRN_PATH_REPO_STR), STRDEF("test/data/filecopy.table.bin")));
|
2020-03-29 21:25:48 -04:00
|
|
|
ASSERT(bufUsed(block) == 1024 * 1024);
|
|
|
|
|
2020-05-19 14:35:20 -04:00
|
|
|
// Build the input buffer
|
2021-01-24 15:15:50 -05:00
|
|
|
Buffer *input = bufNew((size_t)blockTotal * bufSize(block));
|
2020-05-19 14:35:20 -04:00
|
|
|
|
|
|
|
for (unsigned int blockIdx = 0; blockIdx < blockTotal; blockIdx++)
|
|
|
|
memcpy(bufPtr(input) + (blockIdx * bufSize(block)), bufPtr(block), bufSize(block));
|
|
|
|
|
|
|
|
bufUsedSet(input, bufSize(input));
|
|
|
|
|
2020-03-29 21:25:48 -04:00
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_TITLE_FMT(
|
2021-01-24 15:15:50 -05:00
|
|
|
"%u iteration(s) of %zuMiB with %" PRIu64 "MB/s input, %" PRIu64 "MB/s output", iteration,
|
2020-05-19 14:35:20 -04:00
|
|
|
bufUsed(input) / bufUsed(block), rateIn, rateOut);
|
2020-03-29 21:25:48 -04:00
|
|
|
|
|
|
|
#define BENCHMARK_BEGIN() \
|
|
|
|
IoWrite *write = ioBufferWriteNew(bufNew(0)); \
|
|
|
|
|
|
|
|
#define BENCHMARK_FILTER_ADD(filter) \
|
|
|
|
ioFilterGroupAdd(ioWriteFilterGroup(write), filter);
|
|
|
|
|
|
|
|
#define BENCHMARK_END(addTo) \
|
2020-05-19 14:35:20 -04:00
|
|
|
if (rateOut != 0) \
|
|
|
|
ioFilterGroupAdd(ioWriteFilterGroup(write), testIoRateNew(rateOut * 1000 * 1000)); \
|
2020-03-29 21:25:48 -04:00
|
|
|
ioFilterGroupAdd(ioWriteFilterGroup(write), ioSinkNew()); \
|
|
|
|
ioWriteOpen(write); \
|
|
|
|
\
|
2020-05-19 14:35:20 -04:00
|
|
|
IoRead *read = ioBufferReadNew(input); \
|
|
|
|
if (rateIn != 0) \
|
|
|
|
ioFilterGroupAdd(ioReadFilterGroup(read), testIoRateNew(rateIn * 1000 * 1000)); \
|
|
|
|
ioReadOpen(read); \
|
|
|
|
\
|
2020-03-29 21:25:48 -04:00
|
|
|
uint64_t benchMarkBegin = timeMSec(); \
|
|
|
|
\
|
2020-05-19 14:35:20 -04:00
|
|
|
Buffer *buffer = bufNew(ioBufferSize()); \
|
|
|
|
\
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
ioRead(read, buffer); \
|
|
|
|
ioWrite(write, buffer); \
|
|
|
|
bufUsedZero(buffer); \
|
|
|
|
} \
|
|
|
|
while (!ioReadEof(read)); \
|
2020-03-29 21:25:48 -04:00
|
|
|
\
|
2020-05-19 14:35:20 -04:00
|
|
|
ioReadClose(read); \
|
2020-03-29 21:25:48 -04:00
|
|
|
ioWriteClose(write); \
|
|
|
|
\
|
|
|
|
addTo += timeMSec() - benchMarkBegin;
|
|
|
|
|
|
|
|
// Start totals to 1ms just in case something takes 0ms to run
|
|
|
|
uint64_t copyTotal = 1;
|
2020-05-18 19:02:11 -04:00
|
|
|
uint64_t md5Total = 1;
|
2020-03-29 21:25:48 -04:00
|
|
|
uint64_t sha1Total = 1;
|
|
|
|
uint64_t sha256Total = 1;
|
|
|
|
uint64_t gzip6Total = 1;
|
2021-01-24 15:18:02 -05:00
|
|
|
|
|
|
|
#ifdef HAVE_LIBLZ4
|
2020-03-29 21:25:48 -04:00
|
|
|
uint64_t lz41Total = 1;
|
2021-01-24 15:18:02 -05:00
|
|
|
#endif // HAVE_LIBLZ4
|
2020-03-29 21:25:48 -04:00
|
|
|
|
|
|
|
for (unsigned int idx = 0; idx < iteration; idx++)
|
|
|
|
{
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_LOG_FMT("copy iteration %u", idx + 1);
|
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
BENCHMARK_BEGIN();
|
|
|
|
BENCHMARK_END(copyTotal);
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
|
2020-05-18 19:02:11 -04:00
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_LOG_FMT("md5 iteration %u", idx + 1);
|
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
BENCHMARK_BEGIN();
|
|
|
|
BENCHMARK_FILTER_ADD(cryptoHashNew(HASH_TYPE_MD5_STR));
|
|
|
|
BENCHMARK_END(md5Total);
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
|
2020-03-29 21:25:48 -04:00
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_LOG_FMT("sha1 iteration %u", idx + 1);
|
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
BENCHMARK_BEGIN();
|
|
|
|
BENCHMARK_FILTER_ADD(cryptoHashNew(HASH_TYPE_SHA1_STR));
|
|
|
|
BENCHMARK_END(sha1Total);
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_LOG_FMT("sha256 iteration %u", idx + 1);
|
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
BENCHMARK_BEGIN();
|
|
|
|
BENCHMARK_FILTER_ADD(cryptoHashNew(HASH_TYPE_SHA256_STR));
|
|
|
|
BENCHMARK_END(sha256Total);
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_LOG_FMT("gzip -6 iteration %u", idx + 1);
|
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
BENCHMARK_BEGIN();
|
|
|
|
BENCHMARK_FILTER_ADD(gzCompressNew(6));
|
|
|
|
BENCHMARK_END(gzip6Total);
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
2021-01-24 15:18:02 -05:00
|
|
|
#ifdef HAVE_LIBLZ4
|
2020-03-29 21:25:48 -04:00
|
|
|
TEST_LOG_FMT("lz4 -1 iteration %u", idx + 1);
|
|
|
|
|
|
|
|
MEM_CONTEXT_TEMP_BEGIN()
|
|
|
|
{
|
|
|
|
BENCHMARK_BEGIN();
|
|
|
|
BENCHMARK_FILTER_ADD(lz4CompressNew(1));
|
|
|
|
BENCHMARK_END(lz41Total);
|
|
|
|
}
|
|
|
|
MEM_CONTEXT_TEMP_END();
|
2021-01-24 15:18:02 -05:00
|
|
|
#endif // HAVE_LIBLZ4
|
2020-03-29 21:25:48 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
|
|
TEST_TITLE("results");
|
|
|
|
|
2020-05-19 14:35:20 -04:00
|
|
|
#define TEST_RESULT(name, total) \
|
|
|
|
TEST_LOG_FMT( \
|
|
|
|
"%s time %" PRIu64"ms, avg time %" PRIu64"ms, avg throughput: %" PRIu64 "MB/s", name, total, total / iteration, \
|
|
|
|
iteration * blockTotal * 1024 * 1024 * 1000 / total / 1000000);
|
|
|
|
|
|
|
|
TEST_RESULT("copy", copyTotal);
|
|
|
|
TEST_RESULT("md5", md5Total);
|
|
|
|
TEST_RESULT("sha1", sha1Total);
|
|
|
|
TEST_RESULT("sha256", sha256Total);
|
|
|
|
TEST_RESULT("gzip -6", gzip6Total);
|
2021-01-24 15:18:02 -05:00
|
|
|
|
|
|
|
#ifdef HAVE_LIBLZ4
|
2020-05-19 14:35:20 -04:00
|
|
|
TEST_RESULT("lz4 -1", lz41Total);
|
2021-01-24 15:18:02 -05:00
|
|
|
#endif // HAVE_LIBLZ4
|
2020-03-29 21:25:48 -04:00
|
|
|
}
|
|
|
|
|
2021-03-10 18:42:22 -05:00
|
|
|
FUNCTION_HARNESS_RETURN_VOID();
|
2020-03-26 21:05:36 -04:00
|
|
|
}
|