aboutsummaryrefslogtreecommitdiffstats
path: root/memfilepersistence/src/tests/spi/memfiletestutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'memfilepersistence/src/tests/spi/memfiletestutils.cpp')
-rw-r--r--memfilepersistence/src/tests/spi/memfiletestutils.cpp455
1 files changed, 0 insertions, 455 deletions
diff --git a/memfilepersistence/src/tests/spi/memfiletestutils.cpp b/memfilepersistence/src/tests/spi/memfiletestutils.cpp
deleted file mode 100644
index 9571d880e9f..00000000000
--- a/memfilepersistence/src/tests/spi/memfiletestutils.cpp
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-
-#include <vespa/document/datatype/documenttype.h>
-#include <vespa/memfilepersistence/spi/memfilepersistenceprovider.h>
-#include <tests/spi/memfiletestutils.h>
-#include <tests/spi/simulatedfailurefile.h>
-#include <vespa/memfilepersistence/memfile/memfilecache.h>
-#include <vespa/document/update/assignvalueupdate.h>
-#include <vespa/document/repo/documenttyperepo.h>
-#include <vespa/document/test/make_bucket_space.h>
-#include <vespa/persistence/spi/test.h>
-#include <vespa/vespalib/objects/nbostream.h>
-#include <vespa/vespalib/util/exceptions.h>
-#include <sys/time.h>
-
-using document::DocumentType;
-using document::test::makeBucketSpace;
-using storage::spi::test::makeSpiBucket;
-
-namespace storage {
-namespace memfile {
-
-namespace {
- spi::LoadType defaultLoadType(0, "default");
-}
-
-namespace {
- vdstestlib::DirConfig initialize(uint32_t numDisks) {
- system(vespalib::make_string("rm -rf vdsroot").c_str());
- for (uint32_t i = 0; i < numDisks; i++) {
- system(vespalib::make_string("mkdir -p vdsroot/disks/d%d", i).c_str());
- }
- vdstestlib::DirConfig config(getStandardConfig(true));
- return config;
- }
-
- template<typename T>
- struct ConfigReader : public T::Subscriber
- {
- T config;
-
- ConfigReader(const std::string& configId) {
- T::subscribe(configId, *this);
- }
- void configure(const T& c) { config = c; }
- };
-}
-
-MemFileTestEnvironment::MemFileTestEnvironment(
- uint32_t numDisks,
- framework::ComponentRegister& reg,
- const document::DocumentTypeRepo& repo)
- : _config(initialize(numDisks)),
- _provider(reg, _config.getConfigId())
-{
- _provider.setDocumentRepo(repo);
- _provider.getPartitionStates();
-}
-
-MemFileTestUtils::MemFileTestUtils()
-{
-}
-
-MemFileTestUtils::~MemFileTestUtils()
-{
-}
-
-void
-MemFileTestUtils::setupDisks(uint32_t numDisks) {
- tearDown();
- _componentRegister.reset(
- new framework::defaultimplementation::ComponentRegisterImpl);
- _clock.reset(new FakeClock);
- _componentRegister->setClock(*_clock);
- _env.reset(new MemFileTestEnvironment(numDisks,
- *_componentRegister,
- *getTypeRepo()));
-}
-
-Environment&
-MemFileTestUtils::env()
-{
- return static_cast<MemFilePersistenceProvider&>(
- getPersistenceProvider()).getEnvironment();
-}
-
-MemFilePersistenceProvider&
-MemFileTestUtils::getPersistenceProvider()
-{
- return _env->_provider;
-}
-
-MemFilePersistenceThreadMetrics&
-MemFileTestUtils::getMetrics()
-{
- return getPersistenceProvider().getMetrics();
-}
-
-std::string
-MemFileTestUtils::getMemFileStatus(const document::BucketId& id,
- uint32_t disk)
-{
- MemFilePtr file(getMemFile(id, disk));
- std::ostringstream ost;
- ost << id << ": " << file->getSlotCount() << "," << file->getDisk();
- return ost.str();
-}
-
-std::string
-MemFileTestUtils::getModifiedBuckets()
-{
- spi::BucketIdListResult result(
- getPersistenceProvider().getModifiedBuckets(makeBucketSpace()));
- const spi::BucketIdListResult::List& list(result.getList());
- std::ostringstream ss;
- for (size_t i = 0; i < list.size(); ++i) {
- if (i != 0) {
- ss << ",";
- }
- ss << std::hex << list[i].getId();
- }
- return ss.str();
-}
-
-MemFilePtr
-MemFileTestUtils::getMemFile(const document::BucketId& id, uint16_t disk)
-{
- return env()._cache.get(id, env(), env().getDirectory(disk));
-}
-
-spi::Result
-MemFileTestUtils::flush(const document::BucketId& id, uint16_t disk)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- return getPersistenceProvider().flush(
- makeSpiBucket(id, spi::PartitionId(disk)), context);
-}
-
-document::Document::SP
-MemFileTestUtils::doPutOnDisk(
- uint16_t disk,
- uint32_t location,
- Timestamp timestamp,
- uint32_t minSize,
- uint32_t maxSize)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- document::Document::SP doc(createRandomDocumentAtLocation(
- location, timestamp.getTime(), minSize, maxSize));
- getPersistenceProvider().put(
- makeSpiBucket(document::BucketId(16, location), spi::PartitionId(disk)),
- spi::Timestamp(timestamp.getTime()),
- doc,
- context);
- return doc;
-}
-
-bool
-MemFileTestUtils::doRemoveOnDisk(
- uint16_t disk,
- const document::BucketId& bucketId,
- const document::DocumentId& docId,
- Timestamp timestamp,
- OperationHandler::RemoveType persistRemove)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- if (persistRemove == OperationHandler::PERSIST_REMOVE_IF_FOUND) {
- spi::RemoveResult result = getPersistenceProvider().removeIfFound(
- makeSpiBucket(bucketId, spi::PartitionId(disk)),
- spi::Timestamp(timestamp.getTime()),
- docId,
- context);
- return result.wasFound();
- }
- spi::RemoveResult result = getPersistenceProvider().remove(
- makeSpiBucket(bucketId, spi::PartitionId(disk)),
- spi::Timestamp(timestamp.getTime()),
- docId,
- context);
-
- return result.wasFound();
-}
-
-bool
-MemFileTestUtils::doUnrevertableRemoveOnDisk(
- uint16_t disk,
- const document::BucketId& bucketId,
- const DocumentId& docId,
- Timestamp timestamp)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- spi::RemoveResult result =
- getPersistenceProvider().remove(
- makeSpiBucket(bucketId, spi::PartitionId(disk)),
- spi::Timestamp(timestamp.getTime()),
- docId, context);
-
- return result.wasFound();
-}
-
-spi::GetResult
-MemFileTestUtils::doGetOnDisk(
- uint16_t disk,
- const document::BucketId& bucketId,
- const document::DocumentId& docId,
- const document::FieldSet& fields)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- return getPersistenceProvider().get(
- makeSpiBucket(bucketId, spi::PartitionId(disk)),
- fields, docId, context);
-}
-
-document::DocumentUpdate::SP
-MemFileTestUtils::createBodyUpdate(
- const document::DocumentId& docId,
- const document::FieldValue& updateValue)
-{
- const DocumentType*
- docType(getTypeRepo()->getDocumentType("testdoctype1"));
- document::DocumentUpdate::SP update(
- new document::DocumentUpdate(*docType, docId));
- std::shared_ptr<document::AssignValueUpdate> assignUpdate(
- new document::AssignValueUpdate(updateValue));
- document::FieldUpdate fieldUpdate(docType->getField("content"));
- fieldUpdate.addUpdate(*assignUpdate);
- update->addUpdate(fieldUpdate);
- return update;
-}
-
-document::DocumentUpdate::SP
-MemFileTestUtils::createHeaderUpdate(
- const document::DocumentId& docId,
- const document::FieldValue& updateValue)
-{
- const DocumentType*
- docType(getTypeRepo()->getDocumentType("testdoctype1"));
- document::DocumentUpdate::SP update(
- new document::DocumentUpdate(*docType, docId));
- std::shared_ptr<document::AssignValueUpdate> assignUpdate(
- new document::AssignValueUpdate(updateValue));
- document::FieldUpdate fieldUpdate(docType->getField("headerval"));
- fieldUpdate.addUpdate(*assignUpdate);
- update->addUpdate(fieldUpdate);
- return update;
-}
-
-void
-MemFileTestUtils::doPut(const document::Document::SP& doc,
- Timestamp time,
- uint16_t disk,
- uint16_t usedBits)
-{
- document::BucketId bucket(
- getBucketIdFactory().getBucketId(doc->getId()));
- bucket.setUsedBits(usedBits);
- doPut(doc, bucket, time, disk);
-}
-
-void
-MemFileTestUtils::doPut(const document::Document::SP& doc,
- document::BucketId bid,
- Timestamp time,
- uint16_t disk)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- getPersistenceProvider().put(makeSpiBucket(bid, spi::PartitionId(disk)),
- spi::Timestamp(time.getTime()), doc, context);
-}
-
-spi::UpdateResult
-MemFileTestUtils::doUpdate(document::BucketId bid,
- const document::DocumentUpdate::SP& update,
- Timestamp time,
- uint16_t disk)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- return getPersistenceProvider().update(
- makeSpiBucket(bid, spi::PartitionId(disk)),
- spi::Timestamp(time.getTime()), update, context);
-}
-
-void
-MemFileTestUtils::doRemove(const document::DocumentId& id, Timestamp time,
- uint16_t disk, bool unrevertableRemove,
- uint16_t usedBits)
-{
- spi::Context context(defaultLoadType, spi::Priority(0),
- spi::Trace::TraceLevel(0));
- document::BucketId bucket(getBucketIdFactory().getBucketId(id));
- bucket.setUsedBits(usedBits);
-
- if (unrevertableRemove) {
- getPersistenceProvider().remove(
- makeSpiBucket(bucket, spi::PartitionId(disk)),
- spi::Timestamp(time.getTime()),
- id, context);
- } else {
- spi::RemoveResult result = getPersistenceProvider().removeIfFound(
- makeSpiBucket(bucket, spi::PartitionId(disk)),
- spi::Timestamp(time.getTime()),
- id, context);
-
- if (!result.wasFound()) {
- throw vespalib::IllegalStateException(
- "Attempted to remove non-existing doc " + id.toString(),
- VESPA_STRLOC);
- }
- }
-}
-
-void
-MemFileTestUtils::copyHeader(document::Document& dest,
- const document::Document& src)
-{
- // FIXME(vekterli): temporary solution while we don't have
- // fieldset pruning functionality in Document.
- //dest.setHeaderPtr(src.getHeaderPtr());
- vespalib::nbostream originalBodyStream;
- dest.serializeBody(originalBodyStream);
-
- vespalib::nbostream headerStream;
- src.serializeHeader(headerStream);
- document::ByteBuffer hbuf(headerStream.peek(), headerStream.size());
- dest.deserializeHeader(*getTypeRepo(), hbuf);
- // deserializeHeader clears fields struct, so have to re-set body
- document::ByteBuffer bbuf(originalBodyStream.peek(),
- originalBodyStream.size());
- dest.deserializeBody(*getTypeRepo(), bbuf);
-}
-
-void
-MemFileTestUtils::copyBody(document::Document& dest,
- const document::Document& src)
-{
- // FIXME(vekterli): temporary solution while we don't have
- // fieldset pruning functionality in Document.
- //dest.setBodyPtr(src.getBodyPtr());
- vespalib::nbostream stream;
- src.serializeBody(stream);
- document::ByteBuffer buf(stream.peek(), stream.size());
- dest.deserializeBody(*getTypeRepo(), buf);
-}
-
-void
-MemFileTestUtils::clearBody(document::Document& doc)
-{
- // FIXME(vekterli): temporary solution while we don't have
- // fieldset pruning functionality in Document.
- //doc->getBody().clear();
- vespalib::nbostream stream;
- doc.serializeHeader(stream);
- doc.deserialize(*getTypeRepo(), stream);
-}
-
-void
-MemFileTestUtils::createTestBucket(const document::BucketId& bucket,
- uint16_t disk)
-{
-
- uint32_t opsPerType = 2;
- uint32_t numberOfLocations = 2;
- uint32_t minDocSize = 0;
- uint32_t maxDocSize = 128;
-
- for (uint32_t useHeaderOnly = 0; useHeaderOnly < 2; ++useHeaderOnly) {
- bool headerOnly = (useHeaderOnly == 1);
- for (uint32_t optype=0; optype < 4; ++optype) {
- for (uint32_t i=0; i<opsPerType; ++i) {
- uint32_t seed = useHeaderOnly * 10000 + optype * 1000 + i + 1;
- uint64_t location = (seed % numberOfLocations);
- location <<= 32;
- location += (bucket.getRawId() & 0xffffffff);
- document::Document::SP doc(
- createRandomDocumentAtLocation(
- location, seed, minDocSize, maxDocSize));
- if (headerOnly) {
- clearBody(*doc);
- }
- doPut(doc, Timestamp(seed), disk, bucket.getUsedBits());
- if (optype == 0) { // Regular put
- } else if (optype == 1) { // Overwritten later in time
- Document::SP doc2(new Document(*doc));
- doc2->setValue(doc2->getField("content"),
- document::StringFieldValue("overwritten"));
- doPut(doc2, Timestamp(seed + 500),
- disk, bucket.getUsedBits());
- } else if (optype == 2) { // Removed
- doRemove(doc->getId(), Timestamp(seed + 500), disk, false,
- bucket.getUsedBits());
- } else if (optype == 3) { // Unrevertable removed
- doRemove(doc->getId(), Timestamp(seed), disk, true,
- bucket.getUsedBits());
- }
- }
- }
- }
- flush(bucket, disk);
-}
-
-void
-MemFileTestUtils::simulateIoErrorsForSubsequentlyOpenedFiles(
- const IoErrors& errs)
-{
- std::unique_ptr<SimulatedFailureLazyFile::Factory> factory(
- new SimulatedFailureLazyFile::Factory);
- factory->setWriteOpsBeforeFailure(errs._afterWrites);
- factory->setReadOpsBeforeFailure(errs._afterReads);
- env()._lazyFileFactory = std::move(factory);
-}
-
-void
-MemFileTestUtils::unSimulateIoErrorsForSubsequentlyOpenedFiles()
-{
- env()._lazyFileFactory = std::unique_ptr<Environment::LazyFileFactory>(
- new DefaultLazyFileFactory(0));
-}
-
-std::string
-MemFileTestUtils::stringifyFields(const document::Document& doc) const
-{
- using namespace document;
- std::vector<std::string> output;
- const StructFieldValue& fields(doc.getFields());
- for (StructFieldValue::const_iterator
- it(fields.begin()), e(fields.end());
- it != e; ++it)
- {
- std::ostringstream ss;
- const Field& f(it.field());
- ss << f.getName() << ": ";
- FieldValue::UP val(fields.getValue(f));
- if (val.get()) {
- ss << val->toString();
- } else {
- ss << "(null)";
- }
- output.push_back(ss.str());
- }
- std::ostringstream ret;
- std::sort(output.begin(), output.end());
- std::copy(output.begin(), output.end(),
- std::ostream_iterator<std::string>(ret, "\n"));
- return ret.str();
-}
-
-} // memfile
-} // storage