УМННБJ, ЯХВ. Войти !bnw Сегодня Клубы
Посоны, есть один файл… Он постоянно меняется, а я хочу его анализировать каждые N секунд. Он, конечно, небольшой — меньше десятка метров — и можно его просто копировать, но мне хочется consistency и isolation в терминах ACID: у меня должна быть возможность взять какое-то конкретное состояние файла и читать его сколько влезет, не опасаясь того, что кто-то мне эти данные перепишет. Так можно? В open(2) ничего такого не нашёл. ФС, если что, ext4, но по возможности хотелось бы не привязываться.
Рекомендовали: @stiletto
#GKLP4G / @minoru / 3536 дней назад

если у тебя есть контроль над пишущей стороной, то flock(2)
#GKLP4G/73D / @lexszero / 3536 дней назад
@lexszero Нету, к сожалению.
#GKLP4G/HIT / @minoru --> #GKLP4G/73D / 3536 дней назад
@minoru тогда никак. то есть непонятно, что считать консистентным состоянием файла - когда он закрыт?
#GKLP4G/6A0 / @lexszero --> #GKLP4G/HIT / 3536 дней назад
@lexszero Состояния между вызовами write(), например.
#GKLP4G/5Y9 / @minoru --> #GKLP4G/6A0 / 3536 дней назад

@minoru нужна внешняя синхронизация

#GKLP4G/3F9 / @ninesigns --> #GKLP4G/5Y9 / 3536 дней назад
@lexszero о, идея: делаешь LVM-том, когда хочешь читать - снапшотишь, вся дальнейшая запись идет в COW, когда начитался - удаляешь снапшот. но это дорого.
#GKLP4G/3UZ / @lexszero --> #GKLP4G/6A0 / 3536 дней назад
@minoru вот нифига не гарантия консистентности для arbitrary софтины и данных
#GKLP4G/I2G / @lexszero --> #GKLP4G/5Y9 / 3536 дней назад
@lexszero Да, эта мысль приходила и мне, но фризить 800 гиг ради десяти мегабайт действительно несколько оверкилл :)
#GKLP4G/1U4 / @minoru --> #GKLP4G/3UZ / 3536 дней назад
@minoru так сделай отдельный том, даже не обязательно фс на нем делать, можно в рав девайс писать
#GKLP4G/YL8 / @lexszero --> #GKLP4G/1U4 / 3536 дней назад
@lexszero Не спорю, но от системных гарантий я бы большего и не ожидал.
#GKLP4G/4NA / @minoru --> #GKLP4G/I2G / 3536 дней назад
@lexszero В смысле, отдельный том конкретно для этого файлика? Грустновато, я штуку из поста хочу для софтины, которая не привязана к ФС и, тем более, таким тонкостям сетапа, как LVM.
#GKLP4G/7F3 / @minoru --> #GKLP4G/YL8 / 3536 дней назад
@minoru и кажется мне, что на уровне сисколлов "консистентность" есть чуть ли не искаропки, можно просто read() весь файл в буфер и в нем уже ковыряться. но не уверен, надо читать папиры||сорцы.
#GKLP4G/P5O / @lexszero --> #GKLP4G/4NA / 3536 дней назад
@lexszero > делаешь LVM-том пруф или накатываешь btrfs и делаешь COW пофайлово
#GKLP4G/QQN / @anonymous --> #GKLP4G/3UZ / 3536 дней назад

а в файл данные пишутся или перезаписываются?

#GKLP4G/R95 / @hirthwork / 3536 дней назад

@minoru напиши драйверок для ядра, который бы вывешивал файлик.
и реализуй какой-нить ioctl, который будет вызывать блокировку write пока ты эту блокировку сам явно не снимешь.

ну и mmap/munmap заодно имплементни чтобы читать из буфера как белый человек.

#GKLP4G/U3R / @ninesigns --> #GKLP4G/7F3 / 3536 дней назад

кандидат в номинации «наркоманы ебаные»: что насчёл LD_PRELOAD на пишущей стороне, который будет делать flock при вызове write?

#GKLP4G/YRW / @hirthwork / 3536 дней назад
@lexszero буфферизация вообще нифига не гаратирует, мне никто не обещал даже, что ядро вообще будет что-то буфферизовать.
#GKLP4G/QS6 / @minoru --> #GKLP4G/P5O / 3536 дней назад
@hirthwork Хз. Пойду читать сорец.
#GKLP4G/Q6B / @minoru --> #GKLP4G/R95 / 3536 дней назад
@4da Пора пилить свою ФС, и ОС к ней впридачу!
#GKLP4G/83H / @minoru --> #GKLP4G/U3R / 3536 дней назад

@minoru да не, там обычный char device хватит со стандартным набором fops, не так сложно на самом деле

#GKLP4G/ARD / @ninesigns --> #GKLP4G/83H / 3536 дней назад
@hirthwork Это лишь немного лучше, чем LVM :)
#GKLP4G/BKN / @minoru --> #GKLP4G/YRW / 3536 дней назад

@minoru если есть сорец, что мешает пропатчить с тем чтобы был flock? или сделать перезаписывание файла, чтобы inode новая создавалась, т.е. открыв файл из другой программы ты всегда будешь получать консистентное состояние

#GKLP4G/UPY / @hirthwork --> #GKLP4G/Q6B / 3536 дней назад

@minoru номинация обязывает

#GKLP4G/MYQ / @hirthwork --> #GKLP4G/BKN / 3536 дней назад
очевидно, проблема в архитектуре ссу в рот в первую очередь тем, кто предлагает _решения_
#GKLP4G/GZG / @anonymous / 3536 дней назад

@anonymous тем-то инженер и отличается от анонимуса: предлагает решения вместо того чтобы пытаться всем в рот нассать

#GKLP4G/18E / @hirthwork --> #GKLP4G/GZG / 3536 дней назад
@hirthwork Как я уже писал в /7F3, я это хочу сделать в виде программы для людей. Программка, чей файл читаю — FOSS, но сторонняя. Заставлять людей патчить её ради пользования моим приложением — убероверкилл, похлеще LVM и LD_PRELOAD.
#GKLP4G/GBL / @minoru --> #GKLP4G/UPY / 3536 дней назад

@minoru чо за программка?

#GKLP4G/BUF / @ninesigns --> #GKLP4G/GBL / 3536 дней назад
@hirthwork я и не против некостыльных решений
#GKLP4G/LPX / @anonymous --> #GKLP4G/18E / 3536 дней назад

@minoru давай уже ссылку на исходники

#GKLP4G/K64 / @hirthwork --> #GKLP4G/GBL / 3536 дней назад

@anonymous не бывает «костыльных» и «некостыльных» решений. есть решения «работающие» и твои (нассать в ротешник)

#GKLP4G/X68 / @hirthwork --> #GKLP4G/LPX / 3536 дней назад

@anonymous Ок, давайте тогда поговорим об архитектуре.

Есть Firefox, есть arbtt (тайм-трекер для нищебродов и паранойиков, не желающих платить RescueTime за то, что они тырят твои данные и рисуют для тебя ГРАФИЧКИ). Но последняя не умеет читать адрес, открытый в текущей вкладке первого (а RescueTime умеет!).

Firefox пишет в ~/.mozilla/firefox/%PROFILE%/sessionstore.js список всех-всех-всех открытых табов вместе со всякой инфой, в том числе открытым во вкладке адресом.

arbtt работает по внутреннему таймеру; я, например, попросил его собирать статистику каждые десять секунд. Хотелось бы научить его читать файлик и вытягивать оттуда домены, но возникают проблемы с тем, что Firefox может успеть всё переписать, пока мы читаем. Отсюда и пост.

#GKLP4G/SKR / @minoru --> #GKLP4G/GZG / 3536 дней назад

@minoru а чего ты паришься? берёшь да вычитываешь весь файл в память — он несколько килобайт весит. после этого парсишь, смог распарсить — норм. не смог — значит огнелис что-то записал пока ты читал и нужно сделать ретрай. количество false positives будет пренебрежимо мало

#GKLP4G/3YN / @hirthwork --> #GKLP4G/SKR / 3536 дней назад

@hirthwork вариант с кастомным драйвером меня больше возбуждает

#GKLP4G/6GO / @ninesigns --> #GKLP4G/3YN / 3536 дней назад
@hirthwork В моём случае файл весит полтора метра, и это далеко не предел! Я часто открываю очень много вкладок, браузер перезапускаю каждый день, поэтому память они не жрут (в отличие от молниеносно быстрого ультрасовременного Chromium). Но пока что твой прагматичный подход и правда выигрывает.
#GKLP4G/LXV / @minoru --> #GKLP4G/3YN / 3536 дней назад

@4da тебе лишь бы с ПО поебаться, содомит

#GKLP4G/OJ5 / @hirthwork --> #GKLP4G/6GO / 3536 дней назад

@minoru напиши экстеншен для прыщфекса, который будет писать в файлик

window.top.getBrowser().selectedBrowser.contentWindow.location.href;

#GKLP4G/VUL / @ninesigns --> #GKLP4G/LXV / 3536 дней назад
@4da Такое тоже думал, но мне этот подход не нравится тем, что Firefox тормозит и без моих экстеншонов. Олсо некоторые юзают layouts, которые стопят Firefox, когда пользователь покидает соответсвующий воркспейс — файл при этом окажется в неконсистентном состоянии, и arbtt будет жечь циклы, читая и перечитывая его в надежде не то, что Firefox наконец всё там перепишет и починит.
#GKLP4G/LS2 / @minoru --> #GKLP4G/VUL / 3536 дней назад
@minoru Этот файлик вообще бывает в неконсистентном состоянии? Вангую, при каждом обновлении фф просто перезаписывает этот файл новым, поэтому можно просто делать open+read и не париться. Алсо, у меня такого файла при запущенном фф нет.
#GKLP4G/52D / @anonymous --> #GKLP4G/SKR / 3536 дней назад
@anonymous Минутку, я всё ещё раскуриваю JS. Блять, мой браузер написан на JS! dynamic_cast<@komar>(@minoru) просто, блять! Точно нет? А sessionstore.bak рядом есть? Что за версия ФФ у тебя?
#GKLP4G/7NK / @minoru --> #GKLP4G/52D / 3536 дней назад
@4da поддерживаю аддон
#GKLP4G/AOD / @anonymous --> #GKLP4G/VUL / 3536 дней назад

@minoru я, конечно, не настоящий куркума, но из browser/components/sessionstore/src/SessionWorker.js и https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/OSFile.jsm/OS.File_for_the_main_thread#OS.File.writeAtomic() могу сделать вывод, что там всё на mv, т.е. если ты сделал open на файле, то можешь делать read не опасаясь того что данные изменятся, у тебя будет висящая ссылка на удалённый файл, если что

#GKLP4G/T2A / @hirthwork --> #GKLP4G/LXV / 3536 дней назад

@minoru у меня 15 экстеншенов открыто, думаешь один мелкий погоду сыграет?

олсо нахер его перечитывать в бизилупе? считал раз в 10 секунд и норм.
ну и олсо можно в файлике счетчик завести чтобы оно не обновляло статы если он не инкрементнулся.

#GKLP4G/2Q5 / @ninesigns --> #GKLP4G/LS2 / 3536 дней назад
начали с хаков фс и ядерных модулей, закончили жаваскриптом. it's so 2017.
#GKLP4G/Z7I / @lexszero / 3536 дней назад
@anonymous Кстати да, у меня включено сохранение сессии. Возможно, у тебя нет, и потому нет файла. В статье не указано, дополню: файл действительно апдейтится по ходу работы, это я уже проверил.
#GKLP4G/GTZ / @minoru --> #GKLP4G/P5M / 3536 дней назад
@hirthwork Как ты умудряешься так быстро курить сорцы и при этом отвечать здесь >_< Да, похоже, ты абсолютно прав. Ну, значит, нет проблемы. Всем спасибо, bnw более чем торт!
#GKLP4G/79T / @minoru --> #GKLP4G/T2A / 3536 дней назад
надо просто поставить аддон, который добавляет URL к заголовку окна, и считывать его в твоей трекалке (костыль)
#GKLP4G/X41 / @anonymous / 3536 дней назад
@minoru в новой (33+) версии файла быть не должно
#GKLP4G/HGM / @anonymous --> #GKLP4G/GTZ / 3536 дней назад
@anonymous >при каждом обновлении фф просто перезаписывает этот файл новым ето
#GKLP4G/31L / @mugiseyebrows --> #GKLP4G/52D / 3536 дней назад
@anonymous так и сделал
#GKLP4G/MZO / @anonymous --> #GKLP4G/X41 / 3536 дней назад
fuse уже предлагали?
#GKLP4G/H92 / @zatoni / 3536 дней назад
@zatoni оп уже решил проблему. её, как оказалось, не было
#GKLP4G/MZH / @stiletto --> #GKLP4G/H92 / 3536 дней назад
@stiletto /me слоупок
#GKLP4G/21Y / @zatoni --> #GKLP4G/MZH / 3536 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.