erasure-code: add ErasureCodeInterface::get_coding_chunk_count

Signed-off-by: Loic Dachary <loic@dachary.org>
erasure-code: relax profile parameter syntax

Do not restrict the character set of the key=value pairs of osd
erasure-code-profile set to allow for things like:

             layers='[
                       [ "_aAA_aAA", "" ],
                       [ "bBBB____", "" ],
                       [ "____cCCC", "" ],
                     ]'

Signed-off-by: Loic Dachary <loic@dachary.org>
erasure-code: override the default only if the plugin match

When setting a new erasure coded profile, the key/value of the default
profile are re-used so that ruleset-failure-domain=osd can be overridden
like so:

        ceph osd erasure-code-profile set ruleset-failure-domain=osd

This is however not appropriate if the plugin is different from the
defaut plugin (for instance LRC instead of jerasure) because the
parameters are not the same.

If the plugin is changed, the default profile is not reused.

Signed-off-by: Loic Dachary <loic-201408@dachary.org>
erasure-code: delegate chunk remapping to the plugin

Remapping the chunks after they have been encoded by the plugin is fine
if remapping is transparent to the plugin. However, the goal is to
delegate the remapping of the chunks to the plugin, for LRC in
particular. The chunks are therefore reordered according to the
directions found in the mapping array before they are passed to
decode_chunks.

Signed-off-by: Loic Dachary <loic-201408@dachary.org>
erasure-code: locally repairable code plugin

Recursively apply erasure code techniques so that recovering from the
loss of some chunks only require a subset of the available chunks, most
of the time.

http://tracker.ceph.com/issues/7238 Fixes: #7238

Signed-off-by: Loic Dachary <loic@dachary.org>
erasure-code: high level LRC configuration

Add a configuration mode to the LRC plugin, suitable for most use cases
and simpler to explain and understand. It uses k,m parameters similar to
the jerasure and isa plugins and adds l for locality. For instance:

   k=4 m=2 l=3
   ruleset_locality=rack
   ruleset_failure_domain=host

Will translate into

   local_group_count = (k+m)/l

   ruleset-steps = "["
    " [\"choose\", \"rack\", " + local_group_count + "], "
    " [\"chooseleaf\", \"host\", " + (l + 1) + "], "
    "]";

   layers = "[ "
      "  [ \"DDc_DDc_\", \"\" ],"
      "  [ \"DDDc____\", \"\" ],"
      "  [ \"____DDDc\", \"\" ],"
      "]";

It is less flexible because k+m must be a multiple of l and other
similar relationships and also because it cannot express recursive
configurations with locality in the datacenter and locality in a rack
within the datacenter.

Signed-off-by: Loic Dachary <loic@dachary.org>
erasure-code: test LRC pool, profile and crush ruleset

Using the command line to create an LRC pool validates that the plugin
can be loaded and the ruleset created immediately after the crush table
is populated with the default rulesets.

Add a test that takes out the first OSD holding data for an object and
checks the recovery is effective by retrieving the object content and
checking it is as expected.

Signed-off-by: Loic Dachary <loic@dachary.org>
erasure-code: LRC plugin documentation

Signed-off-by: Loic Dachary <loic-201408@dachary.org>