aboutsummaryrefslogtreecommitdiffstats
path: root/searchcore/src/vespa/searchcore/proton/flushengine/shrink_lid_space_flush_target.cpp
blob: d292f8347a7efbe80d9aab814083f435eee80dfd (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#include "shrink_lid_space_flush_target.h"
#include <vespa/searchlib/common/i_compactable_lid_space.h>

namespace proton {

using searchcorespi::IFlushTarget;
using searchcorespi::LeafFlushTarget;
using searchcorespi::FlushStats;
using searchcorespi::FlushTask;

class ShrinkLidSpaceFlushTarget::Flusher : public FlushTask
{
    ShrinkLidSpaceFlushTarget &_target;
    SerialNum _flushSerialNum;
public:
    Flusher(ShrinkLidSpaceFlushTarget &target, SerialNum flushSerialNum);
    void run() override;
    search::SerialNum getFlushSerial() const override;
};

ShrinkLidSpaceFlushTarget::Flusher::Flusher(ShrinkLidSpaceFlushTarget &target, SerialNum flushSerialNum)
    : FlushTask(),
      _target(target),
      _flushSerialNum(flushSerialNum)
{
    _target._target->shrinkLidSpace();
}

void
ShrinkLidSpaceFlushTarget::Flusher::run()
{
    _target._flushedSerialNum = _flushSerialNum;
    _target._lastFlushTime = vespalib::system_clock::now();
}

search::SerialNum
ShrinkLidSpaceFlushTarget::Flusher::getFlushSerial() const
{
    return _flushSerialNum;
}

ShrinkLidSpaceFlushTarget::ShrinkLidSpaceFlushTarget(const vespalib::string &name,
                                                     Type type,
                                                     Component component,
                                                     SerialNum flushedSerialNum,
                                                     Time lastFlushTime,
                                                     std::shared_ptr<ICompactableLidSpace> target)
    : LeafFlushTarget(name, type, component),

      _target(std::move(target)),
      _flushedSerialNum(flushedSerialNum),
      _lastFlushTime(lastFlushTime),
      _lastStats()
{
}

IFlushTarget::MemoryGain
ShrinkLidSpaceFlushTarget::getApproxMemoryGain() const
{
    int64_t canFree = _target->getEstimatedShrinkLidSpaceGain();
    return MemoryGain(canFree, 0);
}

IFlushTarget::DiskGain
ShrinkLidSpaceFlushTarget::getApproxDiskGain() const
{
    return DiskGain(0, 0);
}

IFlushTarget::SerialNum
ShrinkLidSpaceFlushTarget::getFlushedSerialNum() const
{
    return _flushedSerialNum;
}

IFlushTarget::Time
ShrinkLidSpaceFlushTarget::getLastFlushTime() const
{
    return _lastFlushTime;
}

IFlushTarget::Task::UP
ShrinkLidSpaceFlushTarget::initFlush(SerialNum currentSerial, std::shared_ptr<search::IFlushToken>)
{
    if (currentSerial < _flushedSerialNum) {
        _lastFlushTime = vespalib::system_clock::now();
        return IFlushTarget::Task::UP();
    } else if (!_target->canShrinkLidSpace()) {
        _flushedSerialNum = currentSerial;
        _lastFlushTime = vespalib::system_clock::now();
        return IFlushTarget::Task::UP();
    } else {
        return std::make_unique<Flusher>(*this, currentSerial);
    }
}

FlushStats
ShrinkLidSpaceFlushTarget::getLastFlushStats() const
{
    return _lastStats;
}

uint64_t
ShrinkLidSpaceFlushTarget::getApproxBytesToWriteToDisk() const
{
    return 0;
}

} // namespace proton