Как в etcd v3.0.x запросить все ключи с заданным префиксом?

В etcd 3.0.x был представлен новый API, и я только читаю об этом. Одно мне непонятно, в объекте RangeRequest. В описании свойства range_end оно говорит:

Если range_end на один бит больше заданного ключа, то запросы диапазона получают все ключи с префиксом (заданный ключ).

Вот полный текст, чтобы обеспечить некоторый контекст:

// key is the first key for the range. If range_end is not given, the request only looks up key.
bytes key = 1;
// range_end is the upper bound on the requested range [key, range_end).
// If range_end is '\0', the range is all keys >= key.
// If the range_end is one bit larger than the given key,
// then the range requests get the all keys with the prefix (the given key).
// If both key and range_end are '\0', then range requests returns all keys.
bytes range_end = 2;

Мой вопрос: что имеется в виду под

Если range_end на один бит больше заданного ключа

? Означает ли это, что range_end на 1 бит длиннее, чем key? Означает ли это, что оно должно быть key+1 при интерпретации как целое число? Если второе, то в какой кодировке?


person Jost    schedule 13.07.2016    source источник


Ответы (3)


Существует PR, который устраняет эту путаницу.

Если range_end равно ключу плюс один (например, "aa"+1 == "ab", "a\xff"+1 == "b"), то запрос диапазона получает все ключи с префиксом key.

ОБНОВИТЬ:

var key = "/aaa"
var range_end = "/aa" + String.fromCharCode("a".charCodeAt(2) + 1);
person xpepermint    schedule 30.05.2017

На один бит больше, чем последний байт key.
Например, если key равно "09903x", то range_end должно быть "09903y".
Существует только поток байтов< /strong> при отправке на сервер etcd, поэтому вам следует позаботиться о сериализации драйвера и определить значение range_end.

person sel-fish    schedule 13.07.2016

Отличный пример TypeScript здесь: https://github.com/mixer/etcd3/blob/7691f9bf227841e268c3aeeb7461ad71872df878/src/util.ts#L25

пример работы js с TextEncoder/TextDecoder:

function endRangeForPrefix(value) {
    let textEncoder = new TextEncoder();
    let encodeValue = textEncoder.encode(value);

    for (let i = encodeValue.length - 1; i >= 0; i--) {
        if (encodeValue[i] < 0xff) {
            encodeValue[i]++;
            encodeValue = encodeValue.slice(0, i + 1);

            let textDecoder = new TextDecoder();
            let decode = textDecoder.decode(encodeValue);
            return decode;
        }
    }

    return '';
}
person StillOG    schedule 02.06.2020