Кратко
- Работа Jeff Bonwick 1994 года о слэб-аллокаторе рассматривала объекты ядра как повторно используемые типизированные структуры, а не безымянные блоки памяти, и помогла утвердить модель выделения памяти, позднее адаптированную в нескольких операционных системах.
- Его работа 2001 года с Jonathan Adams о магазинах для каждого процессора и аллокаторе vmem развила этот подход для многопроцессорных систем и ресурсов, не сводящихся к обычной памяти.
- Bonwick вместе с Matt Ahrens начал разработку ZFS и руководил более крупной командой Sun, объединившей пулы хранения, транзакции с копированием при записи, сквозные контрольные суммы, снимки и восстановление; представлять его единственным изобретателем системы нельзя.
- Поглощение DSSD и последующее прекращение выпуска её продукта, а затем нынешняя работа Bonwick сопрезидентом iodyne показывают, что архитектурная сила, коммерческий успех и устойчивое соответствие продукта рынку — разные вопросы.
Система хранения может вернуть не тот блок и не сообщить об этом
Главное обещание системы хранения легко сформулировать и трудно выполнить: когда программа запрашивает данные, система должна вернуть именно то, что было записано. В традиционном стеке ответственность часто разделена. Файловая система управляет именами и блоками. Менеджер томов объединяет устройства. Контроллер передаёт запросы. Накопитель хранит секторы. Каждый уровень может проверить, завершилась ли его собственная операция, но весь стек всё равно способен выдать устаревшие, направленные не туда или повреждённые данные, не объявив ни один компонент неисправным.
Самая известная работа Jeff Bonwick была направлена против этого разрыва. ZFS хранит контрольную сумму дочернего блока в его родительском блоке, а не рядом с защищаемыми данными. Поэтому ожидаемая идентичность блока передаётся по дереву ссылок. Читая блок, ZFS может сравнить полученное содержимое с тем, которое, согласно родителю, должно было прийти. При наличии зеркальной или паритетной копии система может обратиться к другому расположению, проверить альтернативу и восстановить повреждённую копию. Скрабирование распространяет ту же логику на все размещённые данные до того, как приложение обнаружит проблему в самый неподходящий момент.
Этот механизм объясняет репутацию ZFS как системы с высокой целостностью. Он же показывает, почему эту репутацию часто преувеличивают. Контрольная сумма способна выявить несоответствие, но не может воссоздать блок, если все копии неверны или отсутствуют. Избыточность позволяет исправить некоторые отказы, но не заменяет независимую резервную копию, проверенную процедуру восстановления или продуманную физическую архитектуру.
Пул может пережить предусмотренные схемой отказы и всё равно потерять данные из-за коррелированных неисправностей устройств, ошибки оператора, разрушительного ПО, пожара, кражи либо топологии, в которой якобы независимые копии оказались в одном домене отказа.
Поэтому вклад Bonwick точнее, чем окружающая его мифология. Он помог сделать скрытые сбои наблюдаемыми и превратил проверяемую избыточность в часть обычного пути чтения. Риски хранения он не устранил. Это различие важно: сильнейшие инфраструктурные архитектуры ценны зачастую не обещанием совершенства, а тем, что раскрывают больше условий, при которых способны отказать.
До ZFS Bonwick снизил стоимость создания объектов ядра и упростил анализ их поведения
Открытая техническая история начинается не с дисков, а с памяти ядра. Операционные системы постоянно выделяют структуры для файлов, сетевых соединений, процессов, отображений виртуальной памяти и других внутренних объектов. Это не взаимозаменяемые мешки байтов. У объекта есть тип, размер, инварианты, требующие инициализации поля и нередко предсказуемый жизненный цикл. Повторные запросы сырой памяти у универсального аллокатора с последующим созданием и разборкой объекта добавляют работу именно на том уровне, где небольшие издержки умножаются на масштаб всей машины.
В работе 1994 года Bonwick предложил кэши заранее инициализированных объектов. Память организована в слэбы, а каждый кэш обслуживает один класс объектов. Конструкторы задают необходимое состояние объекта; деструкторы при необходимости выполняют разборку; свободные объекты остаются доступными для повторного использования. Аллокатор может сохранять полезную инициализацию, уменьшать фрагментацию и улучшать локальность, поскольку ядро знает, объект какого типа находится под его управлением, а не рассматривает каждый запрос как несвязанный объём байтов.
Такая архитектура также создала более понятное место для отладки и учёта ресурсов. Аллокатор, понимающий типы объектов, способен выявлять некоторые виды неправильного использования и сообщать о поведении на уровне кэша. Приёмы размещения в слэбах, включая изменение смещений объектов, должны были сокращать вредные конфликты кэша на тогдашнем оборудовании. Это были не просто микрооптимизации. В них проявилось проектное предпочтение, вернувшееся позднее: сохранять структуру, а не отбрасывать её, и делать правила жизненного цикла явными на уровне, которому они принадлежат.
Исходная реализация была связана с SunOS и Solaris. Более поздние аллокаторы Linux и FreeBSD опирались на родственные идеи, но создали собственный код, терминологию и компромиссы. Можно уверенно говорить, что слэбовая модель стала влиятельной; нельзя приписывать Bonwick каждый последующий аллокатор или считать результаты тестов 1994 года гарантией для современных процессоров. Кэши объектов занимают память, даже когда объекты бездействуют. Конструкторы могут закреплять устаревшие предположения. Отладочные функции требуют времени и пространства. Аллокатору приходится уравновешивать повторное использование с давлением на другие части системы.
Эти ограничения усиливают, а не ослабляют исторический вывод. Bonwick не открыл бесплатный короткий путь. Он сделал модель затрат видимой: создание объектов, блокировки, локальность кэша, фрагментацию и отладку стало возможно проектировать вместе, а не оставлять случайными последствиями универсального интерфейса памяти.
Магазины для каждого процессора превратили хороший аллокатор в многопроцессорную архитектуру
Общий кэш объектов работает хорошо, пока множество процессоров не начинает бороться за одну блокировку. По мере роста числа CPU в серверах выделение памяти превратилось в задачу управления конкурентным доступом. РаботаMagazines and Vmem2001 года, написанная Bonwick вместе с Jonathan Adams, была прямо посвящена такому масштабу. Авторы представили локальные для каждого процессора магазины — небольшие наборы объектов, которые процессор может выделять и освобождать, не захватывая общую блокировку кэша при каждой операции.
Название точно описывало ритм работы. CPU использует объекты из локального магазина, возвращает их туда же и пакетами обменивает магазины с общим депо. Большинство операций быстрого пути обходится без глобальной конкуренции. Когда один локальный магазин пустеет или переполняется, система перемещает пакет, а не координирует каждый объект отдельно. Конкурентность улучшается за счёт изменения самой единицы координации.
В той же работе описан vmem — универсальный аллокатор ресурсов на основе арен. Ядра распределяют не только физическую память. Они управляют диапазонами виртуальных адресов, идентификаторами и другими ресурсами, которые можно получать от нижележащего аллокатора и делить между клиентами. Vmem предоставил для таких ресурсов многоуровневый интерфейс, избавив каждую подсистему от необходимости изобретать собственный аллокатор диапазонов.
И здесь ключевым было место механизма в архитектуре. Локальные для CPU кэши располагают обычную активность рядом с использующим её процессором; общие структуры отвечают за балансировку и пополнение. Vmem отделяет политику арены от источника ресурса под ней. Архитектура делает отношения владения и импорта явными.
У локальности есть цена. Объекты могут неравномерно накапливаться на разных CPU. Слабо загруженный процессор способен удерживать свободные объекты, пока другому требуется больше. Пакетные перемещения, давление на память и освобождение объектов с другого CPU всё равно нуждаются в координации. Значительный прирост производительности, описанный в исторических работах, относился к конкретным машинам, нагрузкам и реализациям. Он доказывает работу механизма в измеренных условиях, но не гарантирует, что каждый последующий аллокатор воспроизведёт те же показатели.
Ранние работы Bonwick важны для его карьеры в системах хранения, потому что в обоих случаях отправной точкой был отказ от кажущейся простой абстракции. Сырая память в действительности не была безымянной: в ней находились типизированные объекты со своей историей. Дисковый блок был не просто сектором с номером: у него имелись ожидаемая идентичность, транзакционный контекст и связи с другими блоками. В обоих случаях система становилась надёжнее, когда архитектура сохраняла сведения, которые более тонкий слой отбросил бы.
ZFS началась с решения команды заново спроектировать стек хранения
Bonwick и Matt Ahrens начали работу над ZFS в Sun в 2001 году. Проект вырос в масштабную инженерную программу с участием Bill Moore и многих других специалистов. Bonwick руководил проектом и стал его самым заметным публичным представителем, но имеющиеся данные не позволяют называть его единственным изобретателем ZFS или автором каждого механизма системы. Это не формальное различие. Файловые системы объединяют алгоритмы, дисковые форматы, кэширование, администрирование, работу с устройствами и годы производственной отладки. Их зрелость носит коллективный характер.
Команда исходила из неудовлетворённости тогдашней многоуровневой моделью хранения. Администраторы часто создавали RAID-массив или том, делили его на фиксированные логические тома, строили поверх них файловые системы, а затем пытались предсказать будущую потребность в ёмкости. Рост одной нагрузки мог потребовать уменьшения или перестройки другой. Каждый слой обладал лишь частью знаний о системе и имел собственные инструменты, состояния отказа и метаданные.
ZFS объединила функции файловой системы и управления томами вокруг общего пула хранения. Устройства организуются в виртуальные устройства, или vdev, а пул динамически распределяет ёмкость между наборами данных. Администраторы могут создавать файловые системы, тома, снимки, квоты и резервы, не разбивая всё доступное пространство заранее на жёсткие разделы. Такая интеграция сократила целый класс сложностей планирования и работы в командной строке.
Одновременно повысилась цена ранних архитектурных решений. Схема vdev определяет избыточность, ёмкость, производительность и значительную часть поведения пула при отказе. Пул — не волшебное ведро, куда можно без ограничений добавлять и переставлять произвольные устройства. Расширение, замена и миграция зависят от топологии и поддерживаемых функций. Упрощение повседневного распределения не отменяет необходимости проектировать нижележащие домены отказа.
Sun публично представила ZFS в 2004 году. В 2005 году код вошёл в разработку OpenSolaris, а в 2006 году появился в обновлении Solaris 10. Так проект прошёл путь от внутренних исследований и разработки до продукта операционной системы, а затем до открытого контекста разработки. Это также создало условия, при которых ZFS смогла пережить породившую её корпоративную структуру.
Историческое значение проекта не сводится к одной функции. Пулы хранения, транзакции с копированием при записи, контрольные суммы, снимки, избыточность, кэширование и административные инструменты усиливают друг друга. Центральный тезис системы состоит в том, что управление данными и их целостность следует проектировать как единый механизм, а не собирать из слоёв, неспособных проверять предположения друг друга.
Благодаря копированию при записи единицей фиксации стало целое дерево, а не перезаписанный фрагмент
Традиционные обновления на месте могут оставить метаданные между старым и новым состоянием, если отключится питание или устройство не сохранит запись так, как ожидалось. Журналируемые файловые системы снижают этот риск, записывая планируемые изменения и затем повторяя их либо откатывая. ZFS использовала более широкий подход с копированием при записи. Изменённые блоки записываются в новые места; родительские блоки обновляются, чтобы указывать на них; процесс продолжается вверх по дереву, пока система не сможет атомарно перейти к новому корню группы транзакций.
Практическое преимущество заключается в том, что дисковая структура не преобразуется путём перезаписи каждого старого блока на месте. До фиксации нового дерева прежнее остаётся согласованной версией. Снимки используют то же свойство: старый блок продолжает существовать, пока на него ссылается снимок, а новые записи получают новые блоки. Клоны могут совместно использовать существующие данные и расходиться по мере изменений.
Копирование при записи также создаёт издержки. Перезапись путей через деревья метаданных увеличивает объём операций записи. Давно работающие или сильно фрагментированные пулы могут показывать иную производительность, чем в чистых тестах. При создании снимки занимают мало места, но удерживают блоки, которые иначе были бы освобождены, поэтому небрежная политика хранения способна превратить на вид дешёвую функцию восстановления в источник дефицита ёмкости. Нагрузки с мелкими случайными записями создают иные компромиссы, чем крупные последовательные медиапотоки или архивное хранение.
Группы транзакций делают порядок и фиксацию явными, но по-прежнему зависят от оборудования и нижних уровней. Устройства, контроллеры и прошивки должны соблюдать команды сброса и правила устойчивого хранения. Ошибки памяти могут повлиять на данные до их попадания в постоянное хранилище. Защита питания и избыточность остаются физическими свойствами, а не абстракциями файловой системы. Архитектура сужает конкретные окна отказа, но не делает нижележащую машину несущественной.
Это повторяющаяся черта архитектур Bonwick. Система выполняет больше работы, чтобы больше знать о создаваемом состоянии. Слэб-кэши помнят тип и способ создания объекта. Деревья с копированием при записи сохраняют предыдущие версии до завершения нового состояния. Контрольные суммы в родительских блоках несут ожидаемую идентичность дочерних. Дополнительная структура требует ресурсов, но даёт системе свидетельства, позволяющие отвергнуть или исправить неверный результат.
Контрольные суммы и самовосстановление изменили смысл успешного чтения
Накопитель может успешно завершить запрос и всё же вернуть неверные данные. Ошибка способна возникнуть в носителе, контроллере, кабеле, памяти, прошивке или ПО, направившем запрос не по адресу. Контрольная сумма, хранящаяся вместе с тем же блоком, иногда повреждается или направляется не туда вместе с ним. Архитектура ZFS с контрольной суммой в родительском блоке отделяет ожидаемое значение от проверяемых данных и связывает целостность с деревом указателей блоков.
Даже когда чтение успешно на уровне устройства, ZFS проверяет результат. Если контрольная сумма не совпадает, система понимает, что формально успешная операция ввода-вывода не дала ожидаемый блок. В зеркале она может прочитать другую копию. В подходящей конфигурации RAID-Z — восстановить данные по паритету. Если найден корректный результат, ZFS способна вернуть правильные данные и восстановить повреждённую реплику. Стек хранения не просто сообщает об ошибке наверх, а использует избыточность для восстановления согласованности.
Скрабирование превращает этот реактивный механизм в плановую проверку. Обходя размещённые блоки и сверяя их контрольные суммы, оператор может обнаружить скрытое повреждение, пока избыточные копии ещё доступны. Это важно, поскольку некоторые неисправности остаются незаметными до момента, когда редко читаемые данные понадобятся во время другого отказа. Регулярная проверка снижает вероятность того, что первое полное чтение старого блока произойдёт лишь после потери копии, необходимой для его восстановления.
Ничто из этого не делает пул самодостаточным. Скрабирование конкурирует за операции ввода-вывода и под нагрузкой может выявить слабые устройства. Качество восстановления ограничено уцелевшими данными. Зеркала и паритет не защищают от всех коррелированных отказов. Программа-вымогатель с законным доступом на запись может создать безупречно снабжённые контрольными суммами зашифрованные данные. Администратор способен уничтожить пул. Происшествие в здании может лишить организацию всех локальных копий. Резервные копии должны быть достаточно отделены, чтобы пережить отказы, с которыми основной пул не справится.
Возникает редакционный соблазн превратить эти оговорки в формальный отказ от ответственности после похвалы «самовосстанавливающемуся хранилищу». Более сильная интерпретация состоит в том, что оговорки являются частью архитектуры. ZFS различает обнаружение повреждения, поиск корректной альтернативы, восстановление основной копии и возврат данных после исчезновения всего набора избыточности. Это разные возможности. Объединение их в одно обещание ведёт к плохой архитектуре и ложной уверенности.
RAID-Z, ARC и скрабирование связали целостность с повседневной эксплуатацией
RAID-Z решала известную проблему паритетных массивов. В традиционном RAID обновление данных и паритета может прерваться на разных этапах, оставив их несогласованными, — возникает так называемая дыра записи. Транзакции ZFS с копированием при записи и полосы паритета переменной ширины были спроектированы так, чтобы данные и паритет становились частью одного зафиксированного состояния. Система избегает последовательности обновлений на месте, создающей классическое несоответствие.
Компромиссы при этом не исчезли. Расчёт паритета, восстановление и мелкие случайные записи имеют свою цену. Замена отказавшего устройства может занять значительное время, а перестроение создаёт дополнительную нагрузку на пул. Устройства большей ёмкости увеличивают период, в течение которого особенно опасен второй отказ. На результат влияют характер нагрузки, ширина vdev, размер записей, сжатие и объём свободного места. RAID-Z — семейство вариантов развёртывания, а не единый профиль производительности.
Адаптивный кэш замещения ZFS, или ARC, решает другую эксплуатационную задачу: нагрузки меняются. Одни данные ценны, потому что были прочитаны недавно, другие — потому что читаются многократно. ARC регулирует баланс между этими моделями, не требуя жёстко делить кэш между давностью и частотой. Необязательные устройства вторичного кэша могут расширить иерархию, а отдельные устройства журнала намерений — обслуживать определённые схемы синхронной записи.
Эти функции часто обсуждают как пункты списка покупок: добавить память, устройство кэша или устройство журнала. В действительности каждая из них взаимодействует с нагрузкой и моделью отказов. Дополнительный кэш может помочь, но память также нужна метаданным и остальной операционной системе. Вторичный кэш не превращает медленное основное хранилище в среду с низкой задержкой для любой нагрузки. Неудачно выбранное устройство журнала может стать узким местом или ложным источником уверенности. Архитектура предоставляет инструменты, но не делает правильный выбор за оператора.
Публичные объяснения Bonwick помогли сделать эти механизмы понятными. Такая коммуникация была частью его влияния на инфраструктуру. Сложные системы внедряют не только потому, что существует код, но и потому, что операторы могут построить мысленную модель пулов, vdev, групп транзакций, снимков, контрольных сумм и восстановления. Опасность состоит в том, что запоминающиеся выражения — пулы хранения, самовосстановление, сквозная целостность — способны распространиться дальше, чем связанные с ними условия.
OpenSolaris завершился, но архитектура вышла за пределы создавшей её компании
Oracle приобрела Sun в 2010 году, после чего пути проприетарной ZFS в Solaris и открытого кода разошлись. OpenZFS появилась в 2013 году для координации разработки между сообществами illumos, FreeBSD, Linux и других платформ. Нынешний проект происходит от работ Sun, но современный OpenZFS включает многолетние изменения, внесённые после ухода Bonwick. Текущим проектом управляют его сопровождающие, платформенные сообщества и органы управления, а не Bonwick.
Это разделение стало одной из сильнейших проверок исходной архитектуры. Система, полностью зависящая от продолжающихся полномочий основателя, хрупка. ZFS пережила корпоративное поглощение, прекращение роли OpenSolaris как ожидаемого центра разработки, интеграцию с разными операционными системами и длительные лицензионные споры. Это оказалось возможным, потому что код, документация и инженерные знания были доступны более широкому сообществу.
Продолжение не было бесконфликтным. Common Development and Distribution License, на условиях которой Sun выпустила ZFS, создала вопросы совместимости с GPL ядра Linux. Внедрение в Linux развивалось через отдельное распространение модулей и позднее более зрелые интеграции, а не путём простого включения в основное дерево ядра. Разные платформы внедряли функции в разное время. При переносе пулов между системами могут возникать ограничения совместимости флагов функций. OpenZFS означает координацию, а не полное единообразие.
Эта последующая история также правильно очерчивает влияние Bonwick. Он помог заложить архитектуру и руководил исходным проектом. Он не писал всю современную кодовую базу и не определял каждую позднейшую функцию. Открытое продолжение увеличило ценность архитектуры, одновременно сократив личный контроль. Здесь нет противоречия: именно так инфраструктура становится больше истории своего происхождения.
То же относится к слэб-аллокатору. Идея распространилась через независимые реализации и переработки. Техническое влияние чаще выглядит не как один неизменный фрагмент кода, а как набор ограничений и абстракций, которые другие инженеры решают сохранить. Устойчивый вклад Bonwick находится в этих решениях: сохранять идентичность объектов, делать выделение ресурсов многоуровневым, фиксировать завершённые состояния, передавать контрольные суммы по дереву и считать восстановление частью нормальной эксплуатации.
DSSD показала, что амбициозная архитектура может проиграть продуктовую борьбу
После ухода из Sun Bonwick вместе с Mike Shapiro и Bill Moore основал DSSD. Компания разрабатывала флеш-систему масштаба стойки для требовательных баз данных и аналитических нагрузок. EMC приобрела DSSD в 2014 году. Поглощение дало проекту ресурсы и место внутри крупной компании в сфере хранения, а продукт D5 воплотил тесно интегрированную аппаратно-программную архитектуру.
В 2017 году выпуск DSSD как самостоятельного продукта был прекращён. Этот исход обязателен для серьёзного профиля, поскольку нарушает удобный сюжет, в котором фундаментальная инженерная работа естественным образом ведёт к устойчивому коммерческому успеху. Система может быть быстрой, оригинальной и хорошо профинансированной, но не найти стабильного места на меняющемся рынке. Стоимость продукта, модель внедрения, рабочие процессы клиентов, каналы продаж, организационные приоритеты и конкуренция со стороны массовых NVMe-решений и облачных архитектур могут быть не менее важны, чем результаты тестов.
Открытые данные не устанавливают единственную простую причину завершения DSSD и не позволяют считать поглощение доказательством личных доходов или нынешнего состояния Bonwick. Цена приобретения, доля основателя и его вознаграждение — разные факты, а доступные материалы исследования не дают оснований для оценок. Подтверждено другое: EMC купила компанию, а D5 не сохранилась как самостоятельный продукт.
Поэтому DSSD служит контрдоказательством героическому профилю. Архитектурное чутьё Bonwick не было непогрешимым, а рыночное внедрение не является простым референдумом о технических достоинствах. Этот эпизод также показывает сложность коммерциализации корпоративной инфраструктуры. Новая система хранения попадает в среду сертификации баз данных, эксплуатационных привычек, закупочных циклов, ожиданий поддержки и быстро меняющейся экономики оборудования. Продукт должен соответствовать этим институтам, а не только превосходить альтернативу в контролируемом тесте.
Это различие шире относится к инфраструктуре ИИ, дезагрегированному хранению и фабрикам ускорителей. Технические системы часто выводят на рынок через заявления о производительности, но устойчивое внедрение зависит от стоимости миграции, обработки отказов, поддержки и способности сосуществовать с остальным стеком. Конец DSSD — не примечание к карьере Bonwick, а свидетельство того, что проектирование целостной системы должно охватывать рынок и эксплуатационную организацию вокруг машины.
iodyne применяет знакомые принципы к профессиональным медиапроцессам, а не создаёт новую ZFS
Bonwick и Shapiro основали iodyne в 2018 году. На нынешней странице руководства компании они указаны как сопрезиденты. iodyne выпускает высокопроизводительные системы хранения для профессиональных медиапроцессов, объединяя устройства NVMe, шифрование, избыточность и многопользовательские функции в продуктах для команд, работающих с крупными видео- и аудиоматериалами.
Преемственность с более ранними работами Bonwick носит концептуальный характер. Медиахранилище должно поддерживать высокую пропускную способность, переживать отказы устройств, защищать ценную работу и вписываться в совместный процесс. Компания делает акцент на шифровании и производительности, а её продукты объединяют оборудование и ПО для управления этими требованиями. Однако было бы неверно описывать iodyne как «ZFS в коробке» или прямое продолжение DSSD. Продукты работают в другом масштабе, используют иные интерфейсы и предназначены для других пользователей.
Данные о частной компании также требуют сдержанности. Страницы продуктов могут подтвердить заявленные характеристики и функции. Они не дают аудированных сведений о надёжности, доле рынка, выручке, концентрации клиентов или долях основателей. Обзоры и рассказы клиентов способны осветить отдельные внедрения, но не создают универсального эталона. Нынешнюю роль компании в профиле Bonwick следует описывать как активную продуктовую работу, коммерческий масштаб которой в основном остаётся непубличным.
Рынок профессиональных медиа делает архитектуру практически осязаемой. Отказ диска — не просто событие на уровне компонента: он может прервать монтаж, цветокоррекцию или выпуск материала. Шифрование — не абстрактная функция безопасности: оно защищает переносимые или общие активы. Производительность ценна лишь тогда, когда несколько пользователей могут продолжать работу без повреждения данных и непредсказуемых остановок. Интегрированный продукт должен уравновешивать пропускную способность, тепловой режим, интерфейсы, восстановление, поддержку ПО и человеческую стоимость простоя.
iodyne также показывает изменение формы. ZFS стала универсальным уровнем хранения, внедрённым в разных операционных системах и устройствах. iodyne продаёт ограниченные по назначению продукты для специализированного процесса. Первая модель сильно зависит от управления сообществом и настройки оператором; во второй один поставщик способен интегрировать больше элементов пользовательского опыта. Такая интеграция может упростить поддержку, одновременно усиливая зависимость от поставщика. Покупатели отдают часть свободы в обмен на более ясную и узкую линию ответственности.
На дату завершения исследования Bonwick занимает должность сопрезидента вместе с Shapiro. Общий титул имеет значение. Он не позволяет представить компанию как проект одного основателя и отражает сотрудничество, сформировавшее также DSSD. Нынешняя глава профиля — не одиночное возвращение изобретателя ZFS, а работа ещё одной команды, строящей систему хранения вокруг повторяющегося набора задач.
Администрирование стало частью модели надёжности
ZFS проектировалась не только для повышения безопасности отдельного блока. Система также пыталась убрать административные разделения, создававшие собственные виды отказов. В традиционном стеке оператор мог создать аппаратный или программный RAID-массив, разделить его на тома, отформатировать каждый том, подключить файловые системы, а позднее обнаружить, что ёмкость осталась невостребованной по одну сторону границы, тогда как другой нагрузке не хватает места. У каждого слоя были собственные имена, инструменты и процедуры восстановления. Даже технически исправный компонент мог стать частью небезопасного эксплуатационного процесса.
Модель пула хранения изменила этот порядок работы. Ёмкость поступает через vdev в пул, а наборы данных используют общее пространство. Файловые системы и тома можно создавать со свойствами, квотами и резервами, не разрезая весь пул заранее на постоянные разделы. Снимки фиксируют ссылки на состояние в определённый момент благодаря копированию при записи, а клоны могут создавать доступные для записи ответвления. Репликация способна передавать изменения между снимками, не заставляя каждый процесс резервного копирования заново обнаруживать весь набор данных.
Это надёжность за счёт сокращения лишних процедур. Чем меньше границ создаётся вручную, тем меньше возможностей выбрать неверный размер, забыть, на каком томе находится служба, или выполнить рискованную последовательность изменения размеров. Единообразные команды и свойства делают политику заметнее. Администратор может задавать сжатие, квоты, правила подключения и практику снимков на уровне набора данных, а не распределять эти решения между несвязанными инструментами.
Но пул переносит ответственность, а не устраняет её. Общее свободное пространство позволяет одному набору данных поглотить ёмкость, необходимую другому, если не используются квоты или резервы. Снимки сохраняют старые блоки и могут незаметно увеличивать объём связанных данных. Репликация зависит от принимающих систем, сроков хранения и испытаний. Аккуратный выводzfs listне доказывает, что организация сможет восстановить приложение, согласованность его базы данных или учётные данные, необходимые для расшифрования.
Интегрированный интерфейс также способен скрывать физические различия. Два устройства в одном пуле могут использовать общий контроллер, блок питания, корпус или дефект прошивки. Зеркало между логическими обозначениями не является независимым, если стоящее за ними оборудование подвержено коррелированному отказу. Оператор должен перевести логическую модель обратно в стойки, кабели, домены отказа и процедуры замены. Интеграция повышает возможность согласованной политики, но не гарантирует её соответствия физическому миру.
Именно поэтому работа Bonwick относится к анализу цифровой инфраструктуры, а не только к истории файловых систем. Администрирование является частью обоснования безопасности системы. Архитектура определяет, какие ошибки совершить легко, какие трудно и какие станут видимыми до потери данных. Функция имеет эксплуатационную ценность, когда меняет эти вероятности, а не просто сокращает команду.
И аллокатор, и файловая система сделали обслуживание полноценной рабочей нагрузкой
Инфраструктуру часто оценивают по прямому пути: насколько быстро можно выделить объект, сколько записей выдерживает пул, какую пропускную способность обеспечивает устройство хранения. Архитектуры Bonwick также привлекают внимание к фоновым задачам. Кэши объектов нужно пополнять, освобождать и проверять. Пулы хранения необходимо скрабировать, перестраивать, балансировать, реплицировать и отслеживать. Эти операции конкурируют с пользовательскими нагрузками, но определяют, останется ли система заслуживающей доверия со временем.
Примером служат магазины для каждого процессора. Быстрый путь выделения локален, но общие депо и обслуживание кэша снабжают локальные запасы и не дают им полностью изолироваться. Архитектура успешна лишь тогда, когда медленный путь способен перераспределять ресурсы, не превращая периодическое обслуживание в глобальное узкое место. Оператор, смотрящий только на среднюю задержку выделения, не заметит память, удерживаемую кэшами, и поведение под давлением.
В ZFS действует то же разделение. Обычные чтения и записи — лишь часть нагрузки. Скрабирование читает размещённые данные для проверки. Перестроение восстанавливает или копирует данные после замены устройства. Удаление снимка может освободить крупные деревья блоков. Репликация переносит изменения в другую систему. Метаданные необходимо кэшировать и обновлять. Производительность во время этих событий может быть важнее пиковой пропускной способности пустого пула, поскольку система уже работает с пониженной избыточностью или под давлением восстановления.
Такой взгляд на обслуживание усложняет планирование ёмкости. Запас операций ввода-вывода, CPU, памяти и сетевой пропускной способности не является пустой тратой, если позволяет завершить проверку и восстановление до следующего отказа. Пул, постоянно работающий на видимом максимуме, может оказаться наименее способным именно тогда, когда потребуется перестроение. Профессиональная медиакоманда может ценить предсказуемое восстановление и устойчивую совместную производительность выше краткого пика тестов. Оператор дата-центра может выбрать более широкие домены отказа или больше реплик, поскольку время ремонта имеет экономическую ценность.
Та же логика относится к сопровождающим ПО. OpenZFS должна обеспечивать совместимость, тестирование и выпуск версий — работу, незаметную пользователям, пока всё идёт успешно. Код аллокатора ядра требует проверки на разных архитектурах и нагрузках. После выпуска продукта iodyne должна поддерживать сочетания прошивок, клиентского ПО и оборудования. Обслуживание — не остаток после изобретения, а процесс, превращающий архитектуру в инфраструктуру.
Карьеру Bonwick часто описывают через моменты создания: работу, доску со схемой, новую файловую систему, стартап. Более долговечный урок состоит в том, что созданная система должна резервировать механизмы и ресурсы для поддержания собственной корректности. Архитектура, показывающая блестящие результаты лишь тогда, когда ничего не проверяется, не восстанавливается и не обновляется, не решила эксплуатационную проблему, а только отложила её.
Техническое лидерство означало задавать границы, внутри которых могли работать другие инженеры
Доступные данные позволяют называть Bonwick техническим лидером, особенно в исходной программе ZFS. Они не подтверждают историю об одиноком гении. Крупным системам нужны разделение труда, общий язык проектирования и способ разрешать противоречия между производительностью, корректностью, совместимостью и сроками. Вклад лидера может быть решающим, не совпадая при этом с каждой строкой кода.
Matt Ahrens занимает центральное место в происхождении ZFS и её последующей открытой истории. Bill Moore был важным участником ZFS и DSSD. Jonathan Adams стал соавтором работы о магазинах и vmem. Команда ZFS в Sun превратила концепции в действующую файловую систему, менеджер томов, инструменты, тесты и производственную поддержку. Позднее сопровождающие OpenZFS адаптировали систему к новым платформам, заменили или расширили значительные части исходной реализации. Исключение этих имён сделало бы историю менее точной, а инженерную работу — менее понятной.
Лидерство Bonwick удобно рассматривать через границы, заданные его архитектурами. Слэб-аллокатор предоставил разработчикам подсистем интерфейс кэша объектов. Vmem предложил арены, способные импортировать ресурсы из других арен. ZFS предоставила пулы, наборы данных, группы транзакций и семантику указателей блоков. Эти абстракции позволяли разным инженерам работать над компонентами, сохраняя общую модель владения и фиксации.
Хорошие границы не устраняют разногласия. Команда файловой системы должна решить, какие гарантии принадлежат дисковому формату, какие — инструментам, а какие остаются ответственностью оператора. Ей нужно определить, сколько метаданных сохранять, как раскрывать ошибки и какое поведение оборудования считать допустимым. Эти решения формируют последующую совместимость, и изменить их бывает трудно. Техническое лидерство состоит в том, чтобы сформулировать их достаточно явно для построения и тестирования системы всей командой.
Открытая жизнь ZFS добавляет ещё одну проверку. Основатели часто получают авторитет благодаря истории, а нынешние сопровождающие — благодаря ответственности за актуальный код и пользователей. OpenZFS не требовался продолжающийся контроль Bonwick, чтобы сохранять легитимность. Управление и инженерная работа перешли к людям, несущим текущие обязательства. Такая преемственность доказывает, что исходные концепции можно было передать другим, а не то, что все последующие работы принадлежат основателю.
В iodyne подтверждена совместная модель руководства: Bonwick и Mike Shapiro являются сопрезидентами. Внутреннее распределение продуктовых, инженерных и коммерческих полномочий компании раскрыто не полностью, поэтому статья не должна выдумывать иерархию. Самый безопасный вывод состоит в том, что Bonwick продолжает работать в коллективной корпоративной среде, как и в проектах, благодаря которым он наиболее известен.
Такая дисциплина атрибуции имеет практическую цель. Пользователям инфраструктуры необходимо знать, где полномочия находятся сейчас. Исторический престиж не может принять исправление, отправить замену, раскрыть уязвимость или выполнить обязательство поддержки. Профиль, называющий команду и нынешнего ответственного, полезнее рассказа, сосредоточивающего все достижения в одной известной фигуре.
Лицензирование и управление проектом стали ещё одной формой изоляции отказов
Переход от Sun к Oracle, а затем к OpenZFS можно рассматривать как задачу институционального домена отказа. Код, создаваемый внутри компании, подвержен поглощению, смене стратегии и закрытию продукта. Открытая лицензия и внешнее сообщество не предотвращают такие события, но могут сохранить техническую преемственность, если исходная организация перестаёт её обеспечивать.
Выпуск ZFS через OpenSolaris сделал исходный код и архитектуру доступными за пределами компании. Когда Oracle приобрела Sun и путь открытой разработки изменился, illumos и другие сообщества сохранили ветвь, на основе которой OpenZFS смогла координировать дальнейшую работу. Результатом стала не одна идеально единая замена инженерной системе Solaris, а набор сообществ с достаточным общим кодом и целями, чтобы продолжать выпуски, переносы и разработку функций.
Лицензирование также создало ограничения. Common Development and Distribution License плохо сочеталась с GPL ядра Linux, что способствовало модели распространения, при которой ZFS для Linux развивалась вне основного дерева ядра. Это разделение влияло на пакеты, поддержку и восприятие юридического риска. Оно не помешало широкому использованию, но показало, что техническая открытость и совместимость лицензий — разные свойства.
Управление проектом работает как избыточность, только если копии действительно способны действовать. Публичный репозиторий не обеспечивает преемственности, если некому проверять сложные изменения. Несколько переносов на платформы не создают устойчивости, если все зависят от одной небольшой группы. Корпоративные участники могут финансировать работу и одновременно формировать приоритеты. Добровольные сопровождающие способны защищать независимость, но сталкиваются с выгоранием и риском отсутствия преемников. Проекту нужны люди, тестовая инфраструктура, дисциплина выпусков и процесс разрешения несовместимых требований.
Этот институциональный уровень поучительно отражает механизмы хранения. Избыточные данные полезны, только если корректную копию можно определить и прочитать. Избыточное руководство полезно, только если другая группа имеет права, знания и возможности продолжать работу. В обоих случаях формальное дублирование без эксплуатационной независимости создаёт ложную уверенность.
Поэтому выживание OpenZFS является частью наследия Bonwick, но не его нынешней собственностью. Архитектура пересекла корпоративную границу, поскольку код и сообщество обладали достаточной автономией, чтобы заново выстроить полномочия в другом месте. Этот результат не следует романтизировать: различия платформ, потребности в финансировании и лицензионные вопросы сохраняются. Но его стоит признать реальной формой устойчивости инфраструктуры, действующей на уровне институтов, а не блоков.
Повторяющийся метод — сохранять сведения, которые тонкие слои отбрасывают
Работу Bonwick за четыре десятилетия можно читать как борьбу с абстракциями, теряющими информацию. Универсальный аллокатор видит размер; слэб-кэш — тип и жизненный цикл объекта. Глобальный аллокатор видит общий спрос; магазин для отдельного CPU — локальность и конкуренцию. Традиционный стек хранения может видеть успешное чтение сектора; ZFS видит блок с ожидаемой идентичностью внутри транзакционного дерева. Спецификация продукта может рекламировать пропускную способность; производственный процесс должен учитывать шифрование, отказы, восстановление и время людей, ожидающих систему.
Это не означает, что более глубокая интеграция всегда лучше. Интегрированные системы могут расширять домены отказа, затруднять миграцию и концентрировать контроль. Пулевая модель ZFS упрощает множество задач, но повышает значимость архитектуры vdev. iodyne может предоставить согласованный продукт, но связывает пользователей с жизненным циклом оборудования и ПО одного поставщика. Слэб-кэши улучшают повторное использование, но занимают память и усложняют балансировку под давлением. За сохранённые сведения приходится платить.
И всё же этот подход устойчив, поскольку инфраструктурные отказы часто возникают на границах. Один слой не может проверить обещание другого. Контроллер сообщает об успехе, возвращая неверный блок. Аллокатор выдаёт память, не понимая инвариантов объекта. Уровень RAID и файловая система отдельно обновляют связанное состояние. Архитектуры Bonwick пытаются сделать эти отношения достаточно явными, чтобы система могла рассуждать о них.
Ещё одна повторяющаяся черта — эксплуатационное объяснение. Работы, технические выступления и документация проектов дали инженерам язык для описания архитектуры. «Кэш объектов», «магазин», «пул хранения», «группа транзакций», «скрабирование» и «самовосстановление» — не только термины реализации. Они становятся единицами планирования ёмкости, разбора инцидентов и закупочных решений. Хороший язык способен улучшить эксплуатацию; упрощённый лозунг — скрыть условия и ограничения.
Поэтому долгосрочное значение карьеры Bonwick не в том, что он устранил отказы или что каждая последующая система скопировала его код. Оно в том, что он неоднократно менял объём знаний системы о собственной работе. Выделение ресурсов стало типизированным и многоуровневым. Обновления хранения превратились в транзакционные деревья. Чтение стало утверждением, которое можно проверить по независимому ожидаемому значению. Эти архитектурные решения имеют последствия далеко за пределами одного поколения продуктов.
ZFS конкурировала, изменив саму единицу сравнения
ZFS вышла на рынок, где файловые системы, менеджеры томов и массивы хранения часто оценивали как отдельные продукты. Интегрированная архитектура изменила единицу сравнения. Вопрос теперь состоял не только в том, насколько быстро файловая система обрабатывает каталоги или переживает ли RAID-контроллер отказ диска. Покупателям и операторам пришлось сравнивать весь путь — от группировки устройств и распределения данных до снимков, контрольных сумм, восстановления и администрирования.
Такое более широкое сравнение помогает объяснить и энтузиазм, и споры. В отличие от традиционной файловой системы вроде XFS, ZFS включает управление томами и функции целостности, которые иначе находились бы в других частях стека. От систем с копированием при записи, таких как Btrfs или проприетарные платформенные файловые системы, она отличается историей реализации, зрелостью функций, инструментами и поддержкой.
По сравнению с распределённой системой вроде Ceph она обычно работает в иной модели масштаба и координации: Ceph распределяет объекты и службы между сетевыми узлами, тогда как пул ZFS организован вокруг устройств, подключённых напрямую или видимых системе. По сравнению с коммерческим массивом ZFS может обеспечивать прозрачность и переносимость, но перекладывать больше интеграционной ответственности на оператора или поставщика устройства.
Ни одно из этих различий не определяет универсального победителя. Узел базы данных, цель резервного копирования, медиарабочая станция и многоцентровое объектное хранилище ценят разные свойства. Коммерческие массивы могут предлагать проверенное оборудование, сервисные договоры и предсказуемые процедуры замены. Открытое ПО способно уменьшать зависимость от одного поставщика и раскрывать больше деталей механизма. Распределённое хранение масштабируется между узлами, добавляя зависимости от сети и механизмов согласования. Специализированное устройство может оптимизировать один процесс, одновременно сужая будущие варианты.
Влияние Bonwick видно в вопросах, на которые теперь вынуждены отвечать конкуренты. Где вычисляются и хранятся контрольные суммы? Может ли система обнаружить чтение не по адресу? Какое состояние атомарно после сбоя? Как представлены снимки? Что происходит во время восстановления? Какой уровень отвечает за избыточность? Какую часть системы можно проверить или перенести? Даже продукты с другими ответами работают на рынке, где эти вопросы стали нормой.
Конкурентный урок не в том, что интегрированная архитектура устраняет компромиссы. Она перемещает их. Объединение слоёв может создавать более сильную семантику, поскольку файловая система знает об избыточности и идентичности блоков. Оно также может сделать стек более предписывающим и повысить стоимость независимой замены одного компонента. Операторам следует вместе сравнивать модель целостности, домен отказа, модель поддержки и путь выхода, а не покупать название функции.
Это ещё одна причина не использовать ZFS как замену личному профилю Bonwick. Нынешняя конкурентная позиция системы зависит от актуального кода OpenZFS, платформенной интеграции, разработки устройств, администраторов и окружающего рынка оборудования. Историческая архитектура формирует отрасль, но текущие результаты принадлежат нынешним институтам.
Мышление через домены отказа связывает выделение памяти, хранение и выживание компании
Домен отказа обычно понимают как физическую границу: диск, контроллер, узел, стойку или дата-центр, компоненты внутри которого могут отказать вместе. Карьера Bonwick предлагает более широкое определение. Конкуренция за ресурс может стать доменом отказа, когда каждый CPU зависит от одной блокировки аллокатора. Корпоративный владелец становится доменом отказа, если у проекта нет пути продолжения после смены стратегии. Специализированный продукт становится доменом отказа, если после его прекращения клиенты не могут перенести данные или рабочий процесс.
Магазины для каждого процессора снизили одну форму концентрации, сохранив обычное выделение локальным. Общие депо остались необходимы, но быстрый путь больше не зависел от одной блокировки для каждого объекта. ZFS снижает другую концентрацию, сохраняя в дереве блоков достаточно сведений для проверки данных независимо от сообщения накопителя об успехе. Зеркала и паритет распределяют копии, если аппаратная топология делает их действительно независимыми.
OpenZFS снизила институциональную концентрацию, позволив разработке продолжиться за пределами Oracle. DSSD, напротив, показала, что приобретённый продукт всё равно может исчезнуть после изменения корпоративного и рыночного контекста. Поэтому покупателям iodyne нужно оценивать не только избыточность устройств и шифрование, но и непрерывность поддержки, переносимость данных и последствия зависимости от частного специализированного поставщика.
Принцип прост: избыточность должна существовать на том уровне, где происходит опасный отказ. Два диска за одним неисправным контроллером могут не защитить от контроллера. Две ветви ПО без активных сопровождающих могут не защитить проект. Две копии, зашифрованные одним утраченным ключом, могут не защитить данные. Резервная копия, доступная тому же скомпрометированному администратору, может не защитить от разрушительного доступа.
Такой подход превращает архитектуру в карту коррелированных предположений. Он спрашивает, что может отказать одновременно, какие свидетельства раскроют отказ и какой независимый ресурс восстановит службу. Ответы зависят от конкретного внедрения. ZFS может дать механизмы, но только оператор способен разместить устройства и резервные копии по реальным границам. Открытая лицензия может разрешить ответвление, но только сообщество обеспечивает устойчивую инженерную работу. Компания может предложить гарантию, но выполнить обещание позволяют лишь её финансы и операционная деятельность.
Следствие второго порядка состоит в необходимости осторожно оценивать упрощение. Пулевой интерфейс может облегчить повседневную работу, одновременно скрывая более широкую общую судьбу. Локальный магазин способен ускорить выделение, удерживая память на одном CPU. Интегрированное устройство может сделать поддержку понятнее, но сузить варианты выхода. Лучшая архитектура — не та, где видно меньше всего компонентов, а та, чьи границы соответствуют способности организации наблюдать отказы и восстанавливаться после них.
Работа Bonwick важна, потому что неоднократно раскрывала эти границы. Она не предоставила единой универсальной карты, но дала механизмы, благодаря которым карту труднее игнорировать.
Честное наследие — это более сильные вопросы, а не абсолютная гарантия
Работы Bonwick провоцируют превосходные степени, поскольку системы стали фундаментальными, а механизмы отличаются элегантностью. Более осторожная оценка полезнее. Слэб-аллокатор повлиял на управление повторно используемыми объектами в ядрах. Магазины и vmem показали, как масштабировать и обобщать выделение ресурсов. ZFS объединила пулевое администрирование и сквозную целостность в одной архитектуре. OpenZFS доказала, что работа может продолжаться при других институтах. DSSD выявила разрыв между архитектурными амбициями и долговечностью продукта.
iodyne поместила ту же заботу о производительности и отказах в специализированный коммерческий процесс.
На каждом этапе данные очерчивают границу личной атрибуции. Jonathan Adams был соавтором работы о магазинах и vmem. Matt Ahrens вместе с Bonwick начал ZFS. Bill Moore и крупная команда Sun создали важнейшие части системы. DSSD и iodyne были совместно основанными предприятиями. OpenZFS сопровождается сообществом, нынешняя работа которого не контролируется Bonwick. Называть его руководителем проекта, соавтором и системным архитектором точно. Называть его единственным изобретателем окружающей инфраструктуры означало бы стереть механизм, благодаря которому она стала реальной.
Та же дисциплина должна применяться к техническим заявлениям. ZFS способна обнаружить многие повреждения, но не восстановит блок без корректной копии. Копирование при записи защищает от определённых частичных обновлений, но не предотвращает каждую ошибку устройства или ПО. RAID-Z решает проблему дыры записи, но не заменяет резервное копирование и не устраняет риски перестроения. Скрабирование выявляет скрытые проблемы, но потребляет ресурсы и не гарантирует будущих чтений. Интегрированные продукты упрощают ответственность, но могут также усиливать зависимость от поставщика.
Наблюдаемая проверка наследия Bonwick состоит не в том, сохраняется ли его имя у каждого потомка. Вопрос в том, продолжают ли современные системы принимать архитектурные вопросы, которые его работа сделала неизбежными. Что аллокатор знает об объекте? Где хранится ожидаемая контрольная сумма? Какое состояние достаточно полно для фиксации? В каком домене отказа в действительности находится реплика? Кто сможет восстановить систему, когда проектная избыточность исчерпана? Инфраструктура улучшается, когда на эти вопросы отвечают до инцидента, а не после него.
Эта история также меняет оценку технических карьер. Системный архитектор может оказывать огромное последующее влияние, не владея действующим стандартом, не занимая руководящую должность у доминирующего поставщика и не привязывая личный бренд к каждому производному решению. Свидетельства видны в интерфейсах, которые сохраняют другие инженеры, в ожидаемых от продуктов способах обработки отказов и в ставших обычными эксплуатационных практиках. Это влияние реально, но его следует отделять от утверждений о нынешнем контроле, личном состоянии или всеобщем внедрении.
Сильнейшие работы Bonwick заметны именно потому, что позднейшие команды могли использовать, пересматривать и иногда отвергать их части.
Последняя мера — создаёт ли архитектура лучшие свидетельства во время стресса. Когда серверу не хватает памяти, могут ли инженеры увидеть, где кэшируются объекты? Когда пул сообщает об ошибке, можно ли определить соответствующие блок, копию и устройство? Когда у проекта меняются ответственные, способны ли сопровождающие воспроизвести сборку и продолжить выпуск? Когда рыночная жизнь продукта заканчивается, могут ли клиенты вернуть данные и перейти дальше? Эти вопросы связывают производительность, целостность и институциональную преемственность. Они менее эффектны, чем обещание идеального хранения, и намного полезнее.
Они также удерживают профиль в границах доказательств. Важные факты состоят не в том, что один инженер «изменил всё», а в том, что конкретные работы, архитектуры и команды изменили представление о том, что ядра и системы хранения должны знать о себе. Неопределённость остаётся частью истории: нет полного подсчёта распространения аллокаторов, развившихся из слэбовой модели; нет публичного описания, отделяющего личный вклад Bonwick в каждый компонент ZFS; нет аудированных данных, устанавливающих масштаб iodyne на рынке. Точность в отношении этих пробелов следует той же интеллектуальной дисциплине, что и контрольная сумма: нельзя принимать уверенный ответ лишь потому, что он пришёл без сообщения об ошибке.
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
