aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore/src/vespa/searchcore/proton/persistenceengine/persistence_handler_map.h
blob: 807b0f0b5d70b86f212fc06e7cc3421a9466f4d7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once

#include <vespa/document/bucket/bucketspace.h>
#include <vespa/searchcore/proton/common/handlermap.hpp>
#include <vespa/vespalib/util/sequence.h>
#include <memory>
#include <unordered_map>

namespace document { class DocumentId; }

namespace proton {

class DocTypeName;
class IPersistenceHandler;

/**
 * Class that maintains a set of PersistenceHandler instances
 * and provides mapping from bucket space to the set of handlers in that space.
 */
class PersistenceHandlerMap {
public:
    using DocTypeToHandlerMap = HandlerMap<IPersistenceHandler>;
    using PersistenceHandlerSP = std::shared_ptr<IPersistenceHandler>;

    class HandlerSnapshot {
    private:
        DocTypeToHandlerMap::Snapshot  _handlers;
    public:
        HandlerSnapshot() : _handlers() {}
        HandlerSnapshot(DocTypeToHandlerMap::Snapshot handlers_)
            : _handlers(std::move(handlers_))
        {}
        HandlerSnapshot(const HandlerSnapshot &) = delete;
        HandlerSnapshot & operator = (const HandlerSnapshot &) = delete;
        ~HandlerSnapshot();

        size_t size() const { return _handlers.size(); }
        vespalib::Sequence<IPersistenceHandler*> &handlers() { return _handlers; }
        static DocTypeToHandlerMap::Snapshot release(HandlerSnapshot &&rhs) { return std::move(rhs._handlers); }
    };

    class UnsafeHandlerSnapshot {
    private:
        DocTypeToHandlerMap::UnsafeSnapshot  _handlers;
    public:
        UnsafeHandlerSnapshot() : _handlers() {}
        UnsafeHandlerSnapshot(DocTypeToHandlerMap::UnsafeSnapshot handlers_)
            : _handlers(std::move(handlers_))
        {}
        UnsafeHandlerSnapshot(const UnsafeHandlerSnapshot &) = delete;
        UnsafeHandlerSnapshot & operator = (const UnsafeHandlerSnapshot &) = delete;
        ~UnsafeHandlerSnapshot();

        size_t size() const { return _handlers.size(); }
        vespalib::Sequence<IPersistenceHandler*> &handlers() { return _handlers; }
    };

private:
    struct BucketSpaceHash {
        std::size_t operator() (const document::BucketSpace &bucketSpace) const { return bucketSpace.getId(); }
    };

    std::unordered_map<document::BucketSpace, DocTypeToHandlerMap, BucketSpaceHash> _map;

public:
    PersistenceHandlerMap();

    PersistenceHandlerSP putHandler(document::BucketSpace bucketSpace, const DocTypeName &docType, const PersistenceHandlerSP &handler);
    PersistenceHandlerSP removeHandler(document::BucketSpace bucketSpace, const DocTypeName &docType);
    IPersistenceHandler * getHandler(document::BucketSpace bucketSpace, const DocTypeName &docType) const;
    HandlerSnapshot getHandlerSnapshot() const;
    HandlerSnapshot getHandlerSnapshot(document::BucketSpace bucketSpace) const;
    UnsafeHandlerSnapshot getUnsafeHandlerSnapshot(document::BucketSpace bucketSpace) const;
};

}