Yad: принцип действия
Нынешний проект сервера разделен на три части:
-
Веб-сервер, обслуживающий запросы жаждущих клиентов.
-
MySQL база, хранящая запросы пользователей и ссылки на созданные дельты.
-
Демон, выполняющий запросы из базы данных и создающий дельты.
Акцентируется, что пользователь в идеале не должен почувствовать разницы при
переходе на проектируемый сервер, то есть он может использовать сценарий
getdelta.sh без особых изменений в настройке.
Веб-сервер
Роль первого звена выполняет php-скрипт deltup.php, принимающий
следующие параметры
-
have, имя имеющегося пакета
-
want, имя нужного пакета
-
url, официальный адрес нужного пакета (getdelta.sh
получает его из сведений пакета)
-
version, версия getdelta.sh, на данный момент — 0.7
-
time, время создания запроса в секундах от начала эпохи
UNIX
Получив все эти данные и проверив на правильность, deltup.php, осуществляет
поиск в базе данных на предмет существующей дельты. Если есть, то, выбрав из
базы местонахождение дельты, он возвращает его пользователю. После он
увеличивает счетчик обращений к дельте и устанавливает время обращения к
записи.
Если создание дельты по каким-то причинам закончилось неудачей, то в статус
демоном заносится failed с пояснением причины неудачи. При следующем обращении
пользователь получит файл <имя_дельты>.failed с содержимым, поясняющим
неудачу.
Если запись о дельте не найдена, то в базу заносятся данные, необходимые для
ее создания и присваивается статус queued. Соотвественно пользователю
возвращается файл queued с содержимым «Creation of delta
queued at $time».
Также на веб-сервере возможно ведение статистики.
База данных
Содержимое этого раздела в обсуждении. Черновой
образец дампа MySQL находится в репозитории
База разделена на две таблицы:
deltas
-
delta_id идентификатор дельты, уникальный номер
-
package_name_have имя пакета, имеющегося у клиента
-
package_name_want имя пакета, требуемого пользователем
-
client_vesion версия клиента
-
last_query время последнего обращения к записи
-
delta_status статус дельты
-
created_at, время создания дельты
-
create_duration, время затраченное на создание (для
служебного использования)
-
result_message комментарий статуса
-
upload_count количество скачиваний
-
dtu_size размер дельты
-
dtu_url место хранения дельты
-
create_duration время формирования
distfiles
-
package_name имя пакета
-
package_status статус пакета
-
query_time время скачивания
-
dist_size размера пакета
-
dist_file адрес файла
-
fetch_duration, время затраченное на скачивание
-
fetched_from, откуда скачано
Демон
Содержимое этого раздела в обсуждении.
Алгоритм демона имеет следующий вид.
-
Выбираем из таблицы дельты в статусе «дельта в очереди»
и «дельта формируется», последняя дата запроса
которой меньше, чем текущая более чем на N секунд.
-
Берем очередную строку выборки и если ее статус «дельта в
очереди» — присваеваем текущим значением даты и врмени
дату последнего запроса и статус «дельта формируется».
-
Ищем пакеты have и want.
-
Если оба пакета в статусе «пакет готов», то
переходим к п. 4;
-
Если хотя бы один из пакетов в статусе «пакет
запрещен», то ставим у дельты статус «дельта
запрещена», переходим к п. 5;
-
Если пакет найден — создаем строку в таблице packages, прописываем
текущим значением даты и времени дату запроса и ставим в статус
«пакет в очереди на скачивание». Если пакет в
статусе «пакет скачивается» или «пакет в
очереди на скачивание» — пропускаем их. Переходим к п.
5.
-
Запускаем формирование дельты, после ее окончания пишет статус
«дельта готова» или «дельта
запрещена» в зависимости от результата.
-
Если в выборке есть еще строки, то переходим к п. 2, иначе выдерживаем
timeout K и к п. 1.