1. Куча / Говнокод #27475

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    dirty_boostrap_test() ->
        SourceTab = ets:new(source, [public, named_table]),
        ReplicaTab = ets:new(replica, [public, named_table]),
        %% Insert some initial data:
        ets:insert(source, {1, 1}),
        ets:insert(source, {2, 2}),
        ets:insert(source, {3, 3}),
        try
            register(testcase, self()),
            Replica = spawn_link(fun replica/0),
            register(replica, Replica),
            %% "importer" process emulates mnesia_tm:
            spawn_link(fun importer/0),
            %% "bootstrapper" process emulates bootstrapper server:
            spawn_link(fun bootstrapper/0),
            receive
                done ->
                    SrcData = lists:sort(ets:tab2list(source)),
                    RcvData = lists:sort(ets:tab2list(replica)),
                    ?assertEqual(SrcData, RcvData)
            end
        after
            ets:delete(SourceTab),
            ets:delete(ReplicaTab)
        end.
    
    importer() ->
        Ops = [ {write, 3, 3}
              , {write, 4, 4}
              , {write, 4, 5}
              , {delete, 2}
              ],
        lists:map(fun(OP) ->
                          import_op(source, OP),
                          %% Imitate mnesia event (note: here we send it
                          %% directly to the replica process bypassing
                          %% the agent):
                          replica ! {tlog, OP}
                  end,
                  Ops),
        replica ! last_trans.
    
    replica() ->
        receive
            {bootstrap, K, V} ->
                ets:insert(replica, {K, V}),
                replica();
            bootstrap_done ->
                replay()
        end.
    
    replay() ->
        receive
            {tlog, Op} ->
                import_op(replica, Op),
                replay();
            last_trans ->
                testcase ! done
        end.
    
    import_op(Tab, {write, K, V}) ->
        ets:insert(Tab, {K, V});
    import_op(Tab, {delete, K}) ->
        ets:delete(Tab, K).
    
    bootstrapper() ->
        {Keys, _} = lists:unzip(ets:tab2list(source)),
        [replica ! {bootstrap, K, V} || K <- Keys, {_, V} <- ets:lookup(source, K)],
        replica ! bootstrap_done.

    Follow-up к треду про то, как делать снепшоты.

    Запостил: CHayT, 20 Июня 2021

    Комментарии (69) RSS

    • Недавно был тред про то, как снепшотить мир MMORPG без остановки мира. Я там на словах расписал один метод, запилил модель для Concuerror, которая его чекает.
      Ответить
      • Вернее, это способ создать консистентную реплику мира c 0. Снепшоты (т.е. состояние мира на какой-то момент в прошлом) примерно так же делаются, только применять к ним нужно не WAL как здесь, а undo log.
        Ответить
        • P.S. В мнязии сделано чуть поумнее, там для снепшота делается отдельная служебная табличка, которая накапливает diff'ы.
          Ответить
          • Тред не читал.
            Разве в этих ваших отказоустойчивых СУБД не должно быть стрим репликации из коробки?
            Ответить
            • Тред о том, как она из коробки запилена.
              Ответить
    • Хм, а где собственно снепшоты?
      Ответить
      • См. комментарий выше. В ReplicaTab.
        Ответить
        • Бля. Непривычно, что слово replica тут юзается и как атом и как функция.
          Ответить
          • Ещё и как имя процесса до кучи. Какая оптимизация atom table )))
            Ответить
    • наконец-то код на эрланге, который я хоть немного могу понять
      Ответить
    • Всё, наконец-то дошло что тут тестируется. bootstrapper копирует значения из основной таблицы без всяких синхронизаций. В это время importer уже начал что-то делать с основной таблицей.

      Но когда мы проиграем журнал транзакций на грязном снимке, то всё будет ок.

      А concuerror перебирает все варианты шедулинга процессов?
      Ответить
      • > А concuerror перебирает все варианты шедулинга процессов?
        Да, все некоммутирующие.
        Ответить
      • Вот сестрёнка умная!
        Ответить
        • Не, я всё ещё чувствую себя бакой. Не могу осознать, как это все ложится на реальные кеши, диски и проигрывание истории не с нуля.

          Я помню, что в том же постгресе можно попросить сервер сделать чекпоинт, тогда он сделает отсечку лога транзакций и мне можно будет забить на wal до этой точки. И вот пока не получается понять, что именно происходит в момент чекпоинта.

          Просто флашатся все странички, которые были грязными до начала чекпоинта?
          Ответить
          • Да, походу просто зафлашить. Тогда все старые записи в wal будут полностью отражены на диске, а новые частично. И мы сможем хвост wal'а юзать совместно с грязным снепшотом, прочитанным прямо с диска после чекпоинта.
            Ответить
          • В постгре не ковырялся (и подозреваю, что там всё несколько хитрее, либо, наоборот, проще), а в мнязии в момент, когда в момент когда делаешь чекпоинт, создаётся специальный процесс retainer и регистрируется колбек в commit hook транзакции, который начинает retainer'у слать undo логи. Retainer начинает на основе этих логов поддерживать табличку-diff между текущим состоянием базы и тем, каким оно было на момент вызова checkpoint. Дампинг снэпшота делается заглядыванием в diff, если там нету ни записи, ни tombstone'а, то данные берутся из основной таблички.
            Это работает онлайн с небольшими издержками, но жрёт память пока чекпоинт активен.
            Ответить
            • В постгресе за WAL отвечает процесс walwriter: он флашит WAL на диск (как именно -- зависит от wal_sync_method)

              Переодически случается CHECKPOINT (или явно, или через checkpoint_timeout)

              В момент CHECKPOINT всё флашится, а в WAL ставится REDO POINT (с которой будет проигрываться лог в случае дизастера)

              Этим занимается процесс checkpointer.

              Вроде так
              Ответить
            • Ну это получается логический снепшот, не физический. Тогда на кеши и диски пофигу, да.

              tombstone это остатки после удаления записи? Хотя раз это undo лог, то походу наоборот, создания.
              Ответить
    • Интересно, а бывают ли движки для БД, которые предназначены для прошивания в FPGA? Ну типа берем FPGA с оперативной памятью, делаем хуйню для SATA или SCSI винта (или может уже есть плисины с готовыми блоками, и тратить ячейки самой FPGA на эту хуйню не надо), и реализуем на Verilog или VHDL непосредственно сам движок БД, чтоб питушня хранилась на жестком диске, и всякие там запросы на добавления-удаления-поиска хуйни в БД по какому-то там протоколу через ethernet или оптике передавались.
      Ответить
      • А в чём мы здесь можем выиграть по сравнению с процом?
        Ответить
        • В энергоэффективности, цене, занимаемом пространстве, затрат на охлаждение (т.к. энергоэффективнее). Ну и latency будет пониже наверняка, меньше всяких абстракций.
          Ответить
          • FPGA'шкам сложно по эффективности конкурировать. Это надо прям на голову выше проца на какой-то задаче оказаться. Иначе оверхед от ячеек и интерконнекта весь твой профит сожрёт.
            Ответить
        • Вообще, вот там что-то через FPGA ускоряют
          https://www.researchgate.net/figure/Field-programmable-gate-array-FPGA-accelerated-database-system-Database-pages-are_fig1_234045878

          но там и процессор общего назначения есть, плата с плисиой там тупо в PCI всунута, так что это немного не то.
          Ответить
          • Ну это норм. Сейчас в FPGA тоже стали ставить хардварные ядра, получаешь лучшее от джвух миров: нормальный оптимизнутый проц без оверхеда и матрицу под какой-нибудь обвес вокруг него, который неудобно/медленно делать программно.

            Так что если какую-то операцию в духе поиска в хешмапе получилось ускорить, то вай нот? А остальное на проце поработает.
            Ответить
      • > SATA или SCSI винта
        лол, тогда уже nvme уже

        и всё сразу в ASIC
        Ответить
        • Чтобы для изменения SQL запроса паяльник нужен был.
          Ответить
          • Надо джамперы переставить.
            Ответить
          • SQL запрос можно хранить в ПЗУ
            В более дорогих моделях будет EEPROM, или который под лампой стирался
            В более дешевых одноарзовый, где прогромматор перемычки пережигал
            Ответить
            • > SQL запрос можно хранить в ПЗУ

              И тут мы приходим к проблеме современных техпроцессов, в которых нельзя выразить нормальное ПЗУ. Кроме одноразового с пережиганием вроде.

              У FPGA'шек тоже с этим проблема -- надо внешнее ПЗУ или внешний контроллер.
              Ответить
              • я думал, все юзают NOR, и текут
                Ответить
                • В основном NAND всё-таки.

                  NOR только под какие-то редкие кейсы, где не надо много памяти но хочется стирать произвольные байты. Он слишком жирный.
                  Ответить
                  • мне казалось, что биосы обычно на NOR, чтобы быть быстрее (а много места там и не нужно)
                    Ответить
                    • Что характерно, нигде в даташитах не могу найти. Пишут flash да и всё.
                      Ответить
                      • ты смотришь даташит конкретной микросхемы ПЗУ?
                        Ответить
                        • Да, посмотрела даташиты нескольких чипов, которые по словам гугла юзаются как spi flash для материнок.

                          Хер знает, может и правда NOR...

                          Но на самом деле скорость у SPI интерфейса никакая, так что я не вижу смысла туда лепить супер-охуенную память.
                          Ответить
            • Была городская легенда, что некоторые ПЗУ с плавкими перемычками удавалось обнулить, прогрев зажигалкой: металл растекался обратно на место выжженной перемычки. Только надо было не перестараться, чтобы не сжечь полупроводники.

              Я не знаю, работает ли это на самом деле.
              Ответить
              • Что-то мне намекает, что они там испарились нахуй а не расплавились.
                Ответить
    • > dirty_boostrap_test

      Грязный бусь-траповый тест. Это на анимешника тест какой-то?
      Ответить
    • https://id-press-a.ru/fileget.php?number=65&token=6b0cbdd1aa2a b8d0c760c0c60c5eaf50

      https://id-press-a.ru/#service (18 06)

      ааааааааа
      Ответить
      • Ссылка стухла.
        Ответить
      • Ссыкла устарела. Вернитесь на главную страницу
        Ответить
      • Гладильщик(ца), приёмщик(ца) и аппаратчик(ца)-пятновыводчик(ца), приёмщица(-к), гладильщица(-к).

        Бедняги )))
        Ответить
        • но не инженерка:(
          гребаные шовинисты
          Ответить
        • кури(ца) не пти(ца)

          еще раз напомню, что в рашке «инженер» - мученая степень типа боколавра
          Ответить
          • Вуз – это лишь доказательство, что человек может заниматься тупой, неинтересной и скучной работой на протяжении долгого времени. Не более. Гении вузы не оканчивали, а разочаровывались в них и создавали шедевры. Либо открывали свои вузы, чтобы пролить блаженный свет знаний на пролов.
            Ответить
            • Верно

              Вот Ротойоб никаких ВУЗов не заканчивал, и это не мешает ему быть гениальным программистом

              Хотя может и заканчивал.. Я не знаю точно
              Ответить
            • Ты давно вуз закончил?
              Ответить
      • разработка и производство сантехнического оборудования для железных дорог
        Ответить
        • это легендарный железный тубзалет делать?
          Ответить
          • Там и душ бывает, кстати.
            Ответить
            • Я как-то ездил в плацкартном поезде на юга в 90-е. Там душа небыло
              Ответить
              • стучаться головой о пятки товарищей по несчастью на верхних полках по дороге из туалета на лежбище

                что может быть луччее
                Ответить
          • 8 (963) 677-89-78 Елена
            Ответить
            • -электрогазосварщика от 4 разряда (аргон), заработная плата от 70 000 рублей
              -инженера-конструктора, заработная плата от 40 000 рублей

              ого
              Ответить
          • Кстати, железные тубзалеты и в парках бывают.
            Ответить
      • СЦЕНАРИСТ в ИП ████ (PR холдинг ████). Создавать оригинальные сценарии в рамка концепции телевизионного проекта, редактирование сценариев. Без о/р. Г/р: на дому.
        Ответить

    Добавить комментарий