Куча говна / Говнокод #27475 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 CHayT, (Updated )

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

  • Недавно был тред про то, как снепшотить мир MMORPG без остановки мира. Я там на словах расписал один метод, запилил модель для Concuerror, которая его чекает.
    Ответить
    • Вернее, это способ создать консистентную реплику мира c 0. Снепшоты (т.е. состояние мира на какой-то момент в прошлом) примерно так же делаются, только применять к ним нужно не WAL как здесь, а undo log.
      Ответить
      • P.S. В мнязии сделано чуть поумнее, там для снепшота делается отдельная служебная табличка, которая накапливает diff'ы.
        Ответить
        • Тред не читал.
          Разве в этих ваших отказоустойчивых СУБД не должно быть стрим репликации из коробки?
          Ответить
      • Бля. Непривычно, что слово 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 тоже стали ставить хардварные ядра, получаешь лучшее от джвух миров: нормальный оптимизнутый проц без оверхеда и матрицу под какой-нибудь обвес вокруг него, который неудобно/медленно делать программно.

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

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

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

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

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

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

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

    Грязный бусь-траповый тест. Это на анимешника тест какой-то?
    Ответить
    • Гладильщик(ца), приёмщик(ца) и аппаратчик(ца)-пятновыводчик(ца), приёмщица(-к), гладильщица(-к).

      Бедняги )))
      Ответить
      • кури(ца) не пти(ца)

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

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8