<table><tr><td style="">poboiko created this revision.<br />poboiko added reviewers: Frameworks, Baloo.<br />Herald added projects: Frameworks, Baloo.<br />Herald added a subscriber: kde-frameworks-devel.<br />poboiko requested review of this revision.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D16876">View Revision</a></tr></table><br /><div><strong>REVISION SUMMARY</strong><div><p>Currently, after the indexing is done, there is a huge difference between <tt style="background: #ebebeb; font-size: 13px;">Actual Size</tt> and <tt style="background: #ebebeb; font-size: 13px;">Expected Size</tt> in <tt style="background: #ebebeb; font-size: 13px;">balooctl indexSize</tt>.<br />
(I would estimate it as ~30%, based on personal experience). The difference because how <tt style="background: #ebebeb; font-size: 13px;">LMDB</tt> works: it never shrinks, and if we ask<br />
it to remove or replace something, free'd pages go to freelist (i.e. useless empty pages waiting to be reused). That wasted space is<br />
indeed a freelist (can be checked via <tt style="background: #ebebeb; font-size: 13px;">mdb_stat -nf ~/.local/share/baloo/index</tt> -- see <tt style="background: #ebebeb; font-size: 13px;">Free pages</tt>).</p>

<p><tt style="background: #ebebeb; font-size: 13px;">LMDB</tt> doesn't allow to compress the DB and remove all free pages "in situ", but it allows to create a copy of the DB without freelist<br />
(see <tt style="background: #ebebeb; font-size: 13px;">mdb_env_copy2</tt> with <tt style="background: #ebebeb; font-size: 13px;">MDB_CP_COMPACT</tt> flag).</p>

<p>Because it creates another copy (which might eat a lot of space), I would not suggest to do it automatically, but instead add a possibility to do it manually.<br />
This patch adds a <tt style="background: #ebebeb; font-size: 13px;">copy</tt> command to <tt style="background: #ebebeb; font-size: 13px;">balooctl</tt> tool, which does it. It allows to create a backup of index (either in a desired place or in temporary directory), <br />
and its main usage is to shrink the DB, in a following way:</p>

<div class="remarkup-code-block" style="margin: 12px 0;" data-code-lang="console" data-sigil="remarkup-code-block"><pre class="remarkup-code" style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; padding: 12px; margin: 0; background: rgba(71, 87, 120, 0.08);"><span style="color: #000080">$ balooctl copy /tmp/index</span>
<span style="color: #000080">$ balooctl stop</span>
<span style="color: #000080">$ mv /tmp/index ~/.local/share/baloo/index</span>
<span style="color: #000080">$ balooctl start</span></pre></div></div></div><br /><div><strong>TEST PLAN</strong><div><p>It works as expected: before copy, indexSize gave me ~500MB, after copy - 327MB<br />
(funny, the actual size after copy is even smaller than expected size, that is 389MB).<br />
DB seems to be fine, i.e. searching works</p></div></div><br /><div><strong>REPOSITORY</strong><div><div>R293 Baloo</div></div></div><br /><div><strong>BRANCH</strong><div><div>freepages (branched from master)</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D16876">https://phabricator.kde.org/D16876</a></div></div><br /><div><strong>AFFECTED FILES</strong><div><div>src/engine/database.cpp<br />
src/engine/database.h<br />
src/tools/balooctl/main.cpp</div></div></div><br /><div><strong>To: </strong>poboiko, Frameworks, Baloo<br /><strong>Cc: </strong>kde-frameworks-devel, ashaposhnikov, michaelh, astippich, spoorun, ngraham, bruns, abrahams<br /></div>