Что не так с Perforce?

Когда более 2-х лет назад был презентован Git as Subversion, некоторые люди активно предлагали попробовать Perforce.

И вот, волей судеб, последние полгода на работе проект живёт в Perforce. И у меня сложилось о нём своё мнение.

Архитектура и безопасность

В отличие от большинства систем контроля версий, Perforce не хранит на клиенте почти никакой информации.

Для подключения к серверу ему нужно знать только адрес сервера (P4PORT), имя пользователя (P4USER) и имя рабочей копии (P4CLIENT). Вся остальная информация хранится на сервере.

При этом клиент глуп и вся логика команд так же находится на сервере. Для выполнения любой команды клиент выполняет примерно следующую последовательность действий:

  • Подключиться к серверу и сообщает кратенькую информацию о себе;
  • Говорит серверу, какую команду и с какими аргументами от него хочет выполнить пользователь;
  • Ждет от сервера набор инструкций и выполняет их.

Кстати, список полей для формы ввода информации о changelist-е и тому подобное, так же присылается с сервера.

Особенно хочу акцентировать внимание, что для клиента команды p4 help и p4 submit ничем внутренне не отличаются. И в случае подмены Perforce-сервера злоумышленник получает массу возможностей по модификации файлов на машине клиента (в том числе и за пределами рабочей копии).

Если не используется SSL-подключение, то клиент не обратит никакого внимание на подмену сервера.

Общие впечатления

Архитектурная особенность, при которой на клиенте нет никаких данных имеет свои плюсы:

  • Очень быстрое получение версии с сервера в первый раз;
  • Никакие служебные данных не занимают место на клиентской машине.

И свои минусы:

  • Клиент не может ничего сделать без взаимодействия с сервером;
  • На клиенте нет способа дешево узнать состояние файлов и находятся ли они под контролем версий;
  • Любое изменение рабочей копии в обход Perforce-утилит нарушает соответствие реального содержимого директории и состояния о котором знает сервер.

В итоге, к примеру:

  • Нет способа быстро получить чистую рабочую копию (git reset --hard && git clean -fdx).
  • Нет способа быстро получить список измененных без p4 open файлов.

Время выполнения обоих операций зависит от размера рабочей копии: Perforce должен прочитать файлы, посчитать их хэши и сравнить с данными на сервере. В Git и Subversion, к примеру эти операции зависят только от количества файлов и выполняются несоизмеримо быстрее.

Можно возразить, что в Perforce есть режим сравнения файлов, основанный на дате модификации KB-3097, но этот режим порождает дополнительные проблемы:

  • Файлы получают дату модификации, которая была у него на компьютере клиента, залившего этот файл;
  • Как следствие, при обновлении файла дата модификации файла может измениться на более раннюю;
  • Многие утилиты (например make), будут крайне обескуражены данным поведением.

Распреденность

Так как без сервера клиент не может вообще ничего, зависимость от доступности сервера и сетевой задержки становится реальной проблемой.

Сидя в Москве нельзя использовать сервер, расположенный в Калифорнии: любое действие, требующее передачи данных туда-обратно становится чудовищно медленным.

Есть два выхода из данной ситуации:

  • Perforce Proxy - простая кэширующая прокся, позволяющая не бегать каждому пользователю за файлами на другую сторону земного шара. Самостоятельно действовать не способна, но за то может быть настроена без вмешательства в конфигурацию центрального Perforce-севера.
  • Perforce Edge Server - относительно самостоятельный вариант Perforce-реплики, который позволяет значительную часть операций производить локально. Но те не менее часть операций (submit, создание changelist-а) все равно выполняется на основном сервере.

С Perforce Edge Server-ом можно жить относительно комфортно:

  • Остаются проблемы с долгим вытаскиванием файлов, которые по каким-то причинам не дошли до Edge Server-а;
  • Любая операция по отправке данных на сервер по прежнему использует основной сервер и вызывает боль.

Кстати, клиент всегда отображает время во временной зоне сервера. Это очень удобно. Пруф:

Date and time specifications are always interpreted in terms of the local time zone of the Perforce server.

Кроссплатформенность

Perfoce работает как под Windows, так и под Linux. Но упоси Господь вас попытаться использовать сервер под одной операционной системой, а клиента под другой KB-3081:

  • UNIX server + UNIX clients
    No problem -- Case of the Perforce meta-data and archive files are always consistent.
  • Windows server + Windows clients
    No problem -- Case differences can exist between meta-data and archives files, however, these differences are ignored.
  • UNIX server + Windows clients
    Potential problem -- The Perforce Server on UNIX (and the UNIX file system) can store case-variant files; the Windows file system cannot store case-variant files.
  • Windows server + UNIX clients
    Potential problem -- The Perforce Server on Windows can maintain case-variant meta-data. As a result, files that exist in one directory on a Windows-based Perforce Server might appear as two or more case-variant directories in a UNIX-based Perforce client workspace.

Примерно похожая проблема с кодировками KB-3106: по умолчанию Perforce использует 8-ми битную кодировку и предполагается, что она у всех одинаковая.

Можно на сервере включить поддержку Unicode, но:

  • Эта дорога в один конец и отменить эту операцию нельзя;
  • Если кто-то залил данные за пределами ASCII, то use any editor or process to remove or convert non-UTF8 byte sequences to be a valid UTF8 byte sequence, Luke. И в случае с именами файлов это не выглядит тривиальной задачей.

Stream-ы

Perforce Streams
Perforce streams are "branches with brains," a containerized approach to managing bodies of related files such as codelines.

Когда я слышу, что Streams, это умные ветки, я вспоминаю картинку с умным молотком. Может оно и звучит круто, но свою функцию выполнять перестаёт.

Основная претензия к Stream-ам: они существуют отдельно за пределами версионирования. То есть, если у вас есть Stream со стабильной версией, то никаких гарантий, что кто-то не поменяет его задним числом просто нет.

При этом, для того, чтобы создать Task Stream, я должен:

  • либо заранее решить, что я буду редактировать (в общем случае, я этой информацией не обладаю) и составить правильный Stream Views (глаза бы мои его не видели).
  • либо скопировать все данные, что занимает очень много времени.

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

Юзабилити

Порождение Сатаны

Это скорее к курьёзами, но помимо порта по-умолчанию (1666), для шифрования пользовательских данных Perforce использует шифр Lucifer. Мне кажется, это не спроста…

comments powered by Disqus