Автор Тема: атомарность ldif  (Прочитано 14986 раз)

Обухов Дмитрий

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
атомарность ldif
« : 04 Январь 2015, 18:22:13 »
пока разбираюсь с LDAP, так что слишком много материала

вопрос:

если мы собираем некоторый ldif, который допустим добавляет один-второй-третий объектный класс, а так же допустим добавляет пять свойств и три записи.

и допустим где-то в конце этого ldif ошибка. вопрос: на этой ошибке что будет с базой?
вот эти успешные модифаи они откатятся или останутся в БД?

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: атомарность ldif
« Ответ #1 : 08 Январь 2015, 13:55:14 »
Здравствуйте, Дмитрий! Атомарность внесения изменений в каталог предусмотрена в стандарте (см. раздел 4.6 RFC4511). Но тут надо понимать, что если Вы составляете LDIF, который изменяет несколько записей в каталоге, то атомарность будет соблюдаться только в изменениях, вносимых за один раз в одну запись. Проще показать это на примере. Имея такие записи в каталоге:
# ldapsearch -x -LLL -b 'ou=People,dc=mycompany,dc=ru' -s one
dn: uid=vitaly,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: vitaly
cn: Vitaly Fridzon
sn: Fridzon

dn: uid=anton,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: anton
cn: Anton Ponkrashov
sn: Ponkrashov

dn: uid=alex,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: alex
cn: Aleksey Savrasenko
sn: Savrasenko

составим такой LDIF для их изменения:
# Добавление вспомогательного объектного класса и атрибутов к записи vitaly
dn: uid=vitaly,ou=People,dc=mycompany,dc=ru
changetype: modify
add: objectClass
objectClass: posixAccount
-
add: uidNumber
uidNumber: 1001
-
add: gidNumber
gidNumber: 1001
-
add: homeDirectory
homeDirectory: /home/vitaly

# Изменение записи anton -- ошибка в удалении несуществующего атрибута ou
dn: uid=anton,ou=People,dc=mycompany,dc=ru
changetype: modify
add: description
description: Team Russia's captain
-
delete: ou
ou: Krasniy Oktyabr Volgograd
-
add: ou
ou: Uniks Kazan

# Добавление новой записи andrey
dn: uid=andrey,ou=People,dc=mycompany,dc=ru
changetype: add
objectClass: inetOrgPerson
uid: andrey
cn: Andrey Kirilenko
sn: Kirilenko

Тут у нас фактически три фрагмента, начинающихся со строки dn: ... и заканчивающихся пустой строкой. Два первых вносят изменения в существующие записи, последний добавляет новую запись. В первом фрагменте все изменения верны: будет добавлен вспомогательный объектный класс и его обязательные атрибуты. Во втором фрагменте первое изменение (добавление атрибута description) верно, а второе (удаление несуществующего атрибута ou) -- нет. В третьем фрагменте также всё верно. Попробуем применить наш LDIF:
# ldapmodify -D 'cn=manager,ou=System,dc=mycompany,dc=ru' -W -f ./some-changes.ldif
Enter LDAP Password:
modifying entry "uid=vitaly,ou=People,dc=mycompany,dc=ru"

modifying entry "uid=anton,ou=People,dc=mycompany,dc=ru"
ldap_modify: No such attribute (16)
additional info: modify/delete: ou: no such attribute

Как видите, изменение первой записи прошло успешно, изменение второй завершилось ошибкой (no such attribute), на этом работа ldapmodify завершилась, так что до третьей записи дело вообще не дошло (это поведение по умолчанию утилиты ldapmodify, его можно переопределить опцией -c). Посмотрим, что у нас в каталоге:
# ldapsearch -x -LLL -b 'ou=People,dc=mycompany,dc=ru' -s one
dn: uid=vitaly,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
uid: vitaly
cn: Vitaly Fridzon
sn: Fridzon
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/vitaly

dn: uid=anton,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: anton
cn: Anton Ponkrashov
sn: Ponkrashov

dn: uid=alex,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: alex
cn: Aleksey Savrasenko
sn: Savrasenko
Как видите, первая запись изменена, а вторая -- нет, даже то изменение, которое было верно, не применилось. Так что атомарность действует на уровне одной записи за один проход (от строки dn: ... до пустой строки).

Надеюсь, я Вас не запутал.

Егор

Обухов Дмитрий

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: атомарность ldif
« Ответ #2 : 08 Январь 2015, 23:30:54 »
да все понятно, спасибо.

хгм, как же этим пользоваться тогда.

egor

  • Администратор
  • Старожил
  • *****
  • Сообщений: 486
    • Просмотр профиля
Re: атомарность ldif
« Ответ #3 : 09 Январь 2015, 10:22:55 »
Здравствуйте!
хгм, как же этим пользоваться тогда.

Да всё просто:
  • Делайте модификации поэтопно, по одной записи за раз.
  • Формируйте корректный LDIF -- Вы же его не руками будете писать. А если Вы пишете приложение на Perl, так тем более, перед тем как посылать операцию на API можно всё сто раз перепроверить.

Егор