Получение ошибки TypeError: объект «NoneType» не повторяется при попытке использовать шепот-слияние

Я пытаюсь использовать whisper-merge для объединения 2 wsp файлов. У них одинаковые стратегии хранения, просто у одного более старые данные, чем у другого.

Когда я запускаю whisper-merge oldfile.wsp newfile.wsp, я получаю эту ошибку

Traceback (most recent call last):
  File "/usr/local/src/whisper-0.9.12/bin/whisper-merge.py", line 32, in <module>
    whisper.merge(path_from, path_to)
  File "/usr/local/lib/python2.7/dist-packages/whisper.py", line 821, in merge
    (timeInfo, values) = fetch(path_from, fromTime, untilTime)
TypeError: 'NoneType' object is not iterable

Любые идеи?

Вот вывод метаданных для 2 файлов:


person Glenn Slaven    schedule 30.07.2014    source источник


Ответы (2)


Фрагмент из whisper.py

def fetch(path,fromTime,untilTime=None):
    """fetch(path,fromTime,untilTime=None)

    path is a string
    fromTime is an epoch time
    untilTime is also an epoch time, but defaults to now.

    Returns a tuple of (timeInfo, valueList)
    where timeInfo is itself a tuple of (fromTime, untilTime, step)

    Returns None if no data can be returned
    """
    fh = open(path,'rb')
    return file_fetch(fh, fromTime, untilTime)

Предполагает, что whisper.fetch() возвращает None, что, в свою очередь, (вместе с последней строкой в ​​трассировке) указывает на наличие проблемы с файлом path_from.
Если посмотреть немного глубже, whisper.file_fetch(), похоже, имеет два места, куда он может вернуться None (явно, по крайней мере):

def file_fetch(fh, fromTime, untilTime):
    header = __readHeader(fh)
    now = int( time.time() )
    if untilTime is None:
        untilTime = now
    fromTime = int(fromTime)
    untilTime = int(untilTime)

    # Here we try and be flexible and return as much data as we can.
    # If the range of data is from too far in the past or fully in the future, we
    # return nothing
    if (fromTime > untilTime):
        raise InvalidTimeInterval("Invalid time interval: from time '%s' is after until time '%s'" % (fromTime, untilTime))

    oldestTime = now - header['maxRetention']
    # Range is in the future
    if fromTime > now:
        return None               # <== Here
    # Range is beyond retention
    if untilTime < oldestTime:
        return None               # <== ...and here
    ...
person SiHa    schedule 30.07.2014
comment
Это кажется вероятным, однако файл from отлично отображается в графите. - person Glenn Slaven; 30.07.2014
comment
Метаданные для исходного файла sprunge.us/dBHC Метаданные для исходного_файла sprunge.us/eIVG - person Glenn Slaven; 30.07.2014
comment
Есть только два очевидных места, откуда может появиться None (могут быть и неочевидные). Может быть, пара отладочных print в whisper.file_fetch() сузила бы его? - person SiHa; 30.07.2014

Строка 812 в шептала.py не работает для файлов, содержащих несколько архивов. https://github.com/graphite-project/whisper/blob/0.9.12/whisper.py#L812

fromTime = int(time.time()) - headerFrom['maxRetention']

Чтобы исправить это, сразу после строки 813 назначьте fromTime на основе срока хранения архива. https://github.com/graphite-project/whisper/blob/0.9.12/whisper.py#L813

for archive in archives: # this line already exists
  fromTime = int(time.time()) - archive['retention'] # add this line
person Jason Stangroome    schedule 31.07.2014
comment
Джейсон, большое спасибо за предложение, сегодня я столкнулся с той же проблемой с последней стабильной версией Graphite. Я думаю, вы должны открыть ошибку и предложить изменение Whisper :) - person Nikolai Grigoriev; 02.03.2016
comment
Соответствующая проблема уже существует: github.com/graphite-project/whisper/issues/163< /а> - person Slaven Rezic; 04.07.2016