• WTF code unzip Jolla
    Есть скрипт, который должен скачивать zip архив с одним файлом и заменять им существующий. unzip -o (overwite) не подходит, потому что если unzip почему-то заглохнет в процессе, то на месте исходного файла будет начало нового - невалидные данные. Поэтому я сделал примерно так:
    unzip -p "$TEMP_ARCHIVE" > "${TEMP_ARCHIVE}_unzipped" || exit 1
    mv "${TEMP_ARCHIVE}_unzipped" "${DEST_FILE}" || exit 1
    Пока скрипт отрабатывал раз 6 "${DEST_FILE}" и почти в половине случаев "${DEST_FILE}" после обновления оказывался короче, чем нужно. o_O Причём всякий раз на 2^N байт, последний раз ровно на 64 KiB.
    Добавление sync между unzip и mv не помогает. Чего-то я не понимаю. Может быть это баг связки странного fuse поверх Btrfs? Как вообще надёжно и адекватно решать такую задачу? sleep не предлагать, это быдлокод.

Replies (7)

  • @Self-Perfection, Причём я руками воспроизвести не могу. Попробовал в цикле unzip -p > temp && mv temp dest && ls -l dest — всё ок
  • @Self-Perfection, У меня остался снапшот с битым файлом. Я думал он отличается от правильного только отсутствующим хвостом, но нет, отличаться они начинают с позиции 0x03D30000 (это примерно треть файла) и отличаться не в отдельных байтах, а практически во всех (thanks to vbindiff)! Может unzip -p или стек ФС в каких-то ситуациях проглатывает часть файла?! o_O
  • @Self-Perfection, Посравнивал через Okteta — выглядит так, что в битом файле пропущен кусок 0x03D30000 — 0x03D3FFFF.

    WTF?!?!?!
  • @Self-Perfection, Переписал как

    unzip -p «$TEMP_ARCHIVE» | tee «${TEMP_ARCHIVE}_unzipped» | md5sum

    По md5 вижу, что архив распаковывается корректно, а вот tee нередко ругается:
    tee: /home/nemo/android_storage/osmand/tmp.XzIVB26929_unzipped: Interrupted system call

    Возможно это известные баги, проявляющиеся на Jolla, когда Btrfs близок к заполнению.

    Сделал цикл на 5 попыток извлечения. Да, быдлокод...
  • @Self-Perfection, Не, Btrfs ни при чём. Воспроизводится стабильно, когда скрипт выполняется, пока телефон в спящем режиме и распаковка идёт в ~/android_storage, который примонтировать через странные fuse, в Btrfs напрямую распаковывается ОК.
  • @Self-Perfection, "I have neither skills nor courage" — отличная фраза)