* [devel] вопрос про BDB и блокировки. @ 2007-04-27 10:05 Sergey Y. Afonin 2007-04-27 10:20 ` Alexey Tourbin 2007-04-27 10:24 ` Sergey Y. Afonin 0 siblings, 2 replies; 9+ messages in thread From: Sergey Y. Afonin @ 2007-04-27 10:05 UTC (permalink / raw) To: devel Приветствую. Нужна консультация специалиста по BDB. Сначала в качестве какого-никакого ввода в тему. http://lists.altlinux.org/pipermail/security-team/2007-April/000243.html Хочется, в данной ситации, "добить" проблему с mailfromd. В документации http://www.oracle.com/technology/documentation/berkeley-db/db/ref/lock/intro.html утверждается, что The Lock subsystem is created, initialized, and opened by calls to DB_ENV->open with the DB_INIT_LOCK or DB_INIT_CDB flags specified. То есть, что встроенные блокировки в BDB начинают работать только в случае использования флагов DB_INIT_LOCK или DB_INIT_CDB. По некоторой причине (в эти подробноcти я не вдавался, утверждается, что не всё гладко) автор mailfromd решил делать блокировки самостоятельно. Я, вроде как, единственный из нарвавшихся на проблему с его блокировками. Используя метод научного тыка и по совету человека, который кое-где bdb сам использовал, я просто убрал блокировку (про то, что она активируется при использовании DB_INIT_LOCK или DB_INIT_CDB, я ещё не дочитал на тот момент). А теперь самое интересное. Оно работает с достаточно активной записью в *.db без явного использования как самодельной, так и встроенной системы блокировок с прошлого вечера. Процессов mailfromd сейчас, например, 1306 штук. В логах по поводу ошибок с BDB тишина. Это везение, или есть какие-то объективные причины для этого ? Про неработоспособность самодельной системы блокировок тоже понять бы не плохо. Я это могу только со скоростью обработки файловых операций связать или с загрузкой системы... -- С уважением, Сергей Афонин asy@altlinux.ru ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 10:05 [devel] вопрос про BDB и блокировки Sergey Y. Afonin @ 2007-04-27 10:20 ` Alexey Tourbin 2007-04-27 10:38 ` Sergey Y. Afonin 2007-04-27 10:24 ` Sergey Y. Afonin 1 sibling, 1 reply; 9+ messages in thread From: Alexey Tourbin @ 2007-04-27 10:20 UTC (permalink / raw) To: devel [-- Attachment #1.1: Type: text/plain, Size: 1734 bytes --] On Fri, Apr 27, 2007 at 03:05:09PM +0500, Sergey Y. Afonin wrote: > Хочется, в данной ситации, "добить" проблему с mailfromd. В документации > http://www.oracle.com/technology/documentation/berkeley-db/db/ref/lock/intro.html > утверждается, что The Lock subsystem is created, initialized, and opened by > calls to DB_ENV->open with the DB_INIT_LOCK or DB_INIT_CDB flags specified. > То есть, что встроенные блокировки в BDB начинают работать только в случае > использования флагов DB_INIT_LOCK или DB_INIT_CDB. По некоторой причине (в DB_INIT_CDB дает "прозрачный" локинг для каждой операции. То есто операция начинается берётся блокировка. Операция заканчивает блокировка снимается. DB_INIT_LOCK по идее специально указывать не надо, если указано DB_INIT_CDB|DB_INIT_MPOOL. Там есть ещё другой режим вместо локинга, он log может писать. > эти подробноcти я не вдавался, утверждается, что не всё гладко) автор > mailfromd решил делать блокировки самостоятельно. Я, вроде как, единственный > из нарвавшихся на проблему с его блокировками. Используя метод научного тыка > и по совету человека, который кое-где bdb сам использовал, я просто убрал > блокировку (про то, что она активируется при использовании DB_INIT_LOCK или > DB_INIT_CDB, я ещё не дочитал на тот момент). Вот кусок перлового кода. Тут есть две тонкости: открывать env надо через exclusive lock, иначе там глюкало. Я это делаю через flock на дескрипторе каталога (круто!). И ещё одна тонкость что нужно сигналы обязательно блокировать на время взятия блокировки. Кажется, факт блокировки фиксируется физически в самой базе. Поэтому если по пришествии сигнала блокировку не снять, то база останется залоченной "надолго". [-- Attachment #1.2: cache.pm --] [-- Type: text/plain, Size: 4355 bytes --] package qa::cache; use strict; use BerkeleyDB; our $topdir = "$ENV{HOME}/.qa-cache"; my $topdir_fd; my $dbenv; sub init_dbenv () { use Fcntl qw(:flock O_DIRECTORY); -d $topdir or mkdir $topdir; sysopen $topdir_fd, $topdir, O_DIRECTORY or die "$topdir: $!"; if (flock $topdir_fd, LOCK_EX | LOCK_NB) { $dbenv = BerkeleyDB::Env->new(-Home => $topdir, -Verbose => 1, -ErrFile => *STDERR, -Flags => DB_CREATE | DB_INIT_CDB | DB_INIT_MPOOL) or die $BerkeleyDB::Error; # TODO: drop all locks flock $topdir_fd, LOCK_SH; } else { flock $topdir_fd, LOCK_SH; $dbenv = BerkeleyDB::Env->new(-Home => $topdir, -Verbose => 1, -ErrFile => *STDERR, -Flags => DB_JOINENV) or die $BerkeleyDB::Error; } } my %blessed; my $pagesize; sub TIEHASH ($$) { my ($class, $id) = @_; return $blessed{$id} if $blessed{$id}; init_dbenv() unless $dbenv; my $dir = "$topdir/$id"; -d $dir or mkdir $dir; my $db = BerkeleyDB::Hash->new(-Filename => "$id/cache.db", -Env => $dbenv, -Flags => DB_CREATE) or die $BerkeleyDB::Error; $pagesize ||= $db->db_stat->{hash_pagesize}; my $self = bless [ $dir, $db ] => $class; $blessed{$id} = $self; use Scalar::Util qw(weaken); weaken $blessed{$id}; return $self; } use Storable qw(freeze thaw); use Compress::LZO qw(compress decompress); use Digest::SHA1 qw(sha1); use constant { V_STO => 2**1, # STO is Special Theory of Relativity V_LZO => 2**2, # LZO is real-time compressor }; my $today = int($^T / 3600 / 24); sub STORE ($$$) { my ($self, $k, $v) = @_; $k = freeze($k) if ref $k; $k = sha1($k); my $vflags = 0; if (ref $v) { $v = freeze($v); $vflags |= V_STO; } if (length($v) > 768) { $v = compress($v); $vflags |= V_LZO; } my ($dir, $db) = @$self; if (length($v) > $pagesize / 2) { my ($subdir, $file) = unpack "H2H*", $k; $subdir = "$dir/$subdir"; $file = "$subdir/$file"; -d $subdir or mkdir $subdir; open my $fh, ">", "$file.$$" or die $!; syswrite $fh, pack("S", $vflags); syswrite $fh, $v; close $fh; rename "$file.$$", $file; } else { # SSS: mtime, atime, vflags $db->db_put($k, pack("SSS", $today, 0, $vflags) . $v); } } sub FETCH ($$) { my ($self, $k) = @_; $k = freeze($k) if ref $k; $k = sha1($k); my ($dir, $db) = @$self; my ($vflags, $v); if ($db->db_get($k, $v) == 0) { (my $m, my $a, $vflags) = unpack "SSS", $v; substr $v, 0, 6, ""; $db->db_put($k, pack("SSS", $m, $today, $vflags) . $v) if $a != $today; # XXX not atomic } else { my ($subdir, $file) = unpack "H2H*", $k; $subdir = "$dir/$subdir"; $file = "$subdir/$file"; open my $fh, "<", $file or return; local $/; $v = <$fh>; $vflags = unpack "S", $v; substr $v, 0, 2, ""; } $v = decompress($v) if $vflags & V_LZO; $v = thaw($v) if $vflags & V_STO; return $v; } sub EXISTS ($$) { my ($self, $k) = @_; $k = freeze($k) if ref($k); $k = sha1($k); my ($dir, $db) = @$self; return 1 if $db->db_get($k, my $v) == 0; my ($subdir, $file) = unpack "H2H*", $k; $subdir = "$dir/$subdir"; $file = "$subdir/$file"; return -f $file; } sub DELETE ($$) { my ($self, $k) = @_; $k = freeze($k) if ref($k); $k = sha1($k); my ($dir, $db) = @$self; $db->db_del($k); my ($subdir, $file) = unpack "H2H*", $k; $subdir = "$dir/$subdir"; $file = "$subdir/$file"; unlink $file; } # BerkeleyDB cleans up at the END, so do I my $global_destruction; # execute the END when interrupted by a signal -- # it is VERY important to release all locks and shut down gracefully use sigtrap qw(die normal-signals); our $expire = 33; sub DESTROY ($) { return if $global_destruction; my $self = shift; my ($dir, $db) = @$self; my $cur = $db->_db_write_cursor() or return; if ($db->db_get("cleanup", my $cleanup) != 0) { $db->db_put("cleanup", $today); return; } elsif ($cleanup == $today) { return; } while ($cur->c_get(my $k, my $v, DB_NEXT) == 0) { next if $k eq "cleanup"; my ($m, $a, $vflags) = unpack "SSS", $v; next if $a + 33 > $today; next if $m + 33 > $today; $cur->c_del(); } my $wanted = sub { stat or return; -f _ and -M _ > $expire and -A _ > $expire and unlink; -d _ and rmdir; }; require File::Find; File::Find::finddepth($wanted, $dir); } END { undef $dbenv; while (my ($id, $self) = each %blessed) { next unless $self; $self->DESTROY(); undef @$self; } $global_destruction = 1; } 1; [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 10:20 ` Alexey Tourbin @ 2007-04-27 10:38 ` Sergey Y. Afonin 2007-04-27 11:02 ` Alexey Tourbin 2007-04-27 11:19 ` Alexey Tourbin 0 siblings, 2 replies; 9+ messages in thread From: Sergey Y. Afonin @ 2007-04-27 10:38 UTC (permalink / raw) To: devel On Friday 27 April 2007, Alexey Tourbin wrote: > DB_INIT_CDB дает "прозрачный" локинг для каждой операции. > То есто операция начинается берётся блокировка. Операция заканчивает > блокировка снимается. > > DB_INIT_LOCK по идее специально указывать не надо, если указано > DB_INIT_CDB|DB_INIT_MPOOL. > > Там есть ещё другой режим вместо локинга, он log может писать. Но этот другой режим - тоже режим блокировок ? Хочется понять, почему сейчас работает, когда нет явного указания на использование блокировок. Обязательно уже должно было несколько процессов к одной базе сунуться и не раз. Ан нет, пашет... > Вот кусок перлового кода. Тут есть две тонкости: открывать env надо > через exclusive lock, иначе там глюкало. Я это делаю через flock на > дескрипторе каталога (круто!). Если каталог "свой", почему бы и нет. :-) -- С уважением, Сергей Афонин asy@altlinux.ru ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 10:38 ` Sergey Y. Afonin @ 2007-04-27 11:02 ` Alexey Tourbin 2007-04-27 12:00 ` Sergey Y. Afonin 2007-04-27 11:19 ` Alexey Tourbin 1 sibling, 1 reply; 9+ messages in thread From: Alexey Tourbin @ 2007-04-27 11:02 UTC (permalink / raw) To: devel [-- Attachment #1: Type: text/plain, Size: 1568 bytes --] On Fri, Apr 27, 2007 at 03:38:52PM +0500, Sergey Y. Afonin wrote: > On Friday 27 April 2007, Alexey Tourbin wrote: > > > DB_INIT_CDB дает "прозрачный" локинг для каждой операции. > > То есто операция начинается берётся блокировка. Операция заканчивает > > блокировка снимается. > > > > DB_INIT_LOCK по идее специально указывать не надо, если указано > > DB_INIT_CDB|DB_INIT_MPOOL. > > > > Там есть ещё другой режим вместо локинга, он log может писать. > > Но этот другой режим - тоже режим блокировок ? Хочется понять, почему > сейчас работает, когда нет явного указания на использование блокировок. > Обязательно уже должно было несколько процессов к одной базе сунуться > и не раз. Ан нет, пашет... Скорее всего, не работает. Просто если чтение с записью не пересекается, то это, может быть, прокатывает. Ну или там один в базу записал а другой старую копию базы видит, и это работает, пока постраничные данные не перезаписаны. Режима два разных: либо блокировать всю базу (ну или там постранично), либо писать write-ahead log (это транзакции, там сложнее уже). Либо блокировать своими средствами. Делайте как у меня, лучше пока ничего не придумано. :) Похожим образом сделано в /usr/sbin/amavisd, только там BerkeleyDB::Env->new ничем не блокируется. По-моему при одновременных попытках инициализировать evn будет капут. При использовании логинкга или DB_INIT_CDB очень важно сигналы правильно заблокировать. /usr/share/doc/db-4.4.20/ref/program/appsignals.html К сожалению в перле это делается проще чем в C. [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 11:02 ` Alexey Tourbin @ 2007-04-27 12:00 ` Sergey Y. Afonin 2007-04-27 12:07 ` Sergey Y. Afonin 0 siblings, 1 reply; 9+ messages in thread From: Sergey Y. Afonin @ 2007-04-27 12:00 UTC (permalink / raw) To: devel On Friday 27 April 2007, Alexey Tourbin wrote: > Скорее всего, не работает. Просто если чтение с записью не пересекается, Обязаны пересекаться. И чтение, и запись, и всё вместе. Там для обрабатываемых E-Mail пишутся и читаются данные по проверка отправителей, грейлистинг, лимиты, DNS-кэш и т.п., а поток сообщений обрабатывается, если вот за сейчас посмотреть с 4:00, 3.6 сообщений в секунду, а бывают провалы и пики. Максимум за сегодня 22 сообщения в секунду. -- С уважением, Сергей Афонин asy@altlinux.ru ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 12:00 ` Sergey Y. Afonin @ 2007-04-27 12:07 ` Sergey Y. Afonin 0 siblings, 0 replies; 9+ messages in thread From: Sergey Y. Afonin @ 2007-04-27 12:07 UTC (permalink / raw) To: ALT Devel discussion list On Friday 27 April 2007, Sergey Y. Afonin wrote: > Максимум за сегодня 22 сообщения в секунду. То есть, это значит, что 22 процесса mailfromd начали работать с базой в пределах одной секунды. Возможно, что они не все писали (грейлистинг избирательный, доменные имена в кэше могли быть и т.п.). -- С уважением, Сергей Афонин asy@altlinux.ru ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 10:38 ` Sergey Y. Afonin 2007-04-27 11:02 ` Alexey Tourbin @ 2007-04-27 11:19 ` Alexey Tourbin 2007-04-27 11:40 ` Sergey Y. Afonin 1 sibling, 1 reply; 9+ messages in thread From: Alexey Tourbin @ 2007-04-27 11:19 UTC (permalink / raw) To: devel [-- Attachment #1: Type: text/plain, Size: 533 bytes --] On Fri, Apr 27, 2007 at 03:38:52PM +0500, Sergey Y. Afonin wrote: > Но этот другой режим - тоже режим блокировок ? Хочется понять, почему > сейчас работает, когда нет явного указания на использование блокировок. > Обязательно уже должно было несколько процессов к одной базе сунуться > и не раз. Ан нет, пашет... Если процесс всего один (одновременно работает с базой), то блокировать ничего не надо. Это у вообще демон что ли или нет? Давайте ка посерьезнее. Где git репоазитарий и над каким кодом идет медитация? [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 11:19 ` Alexey Tourbin @ 2007-04-27 11:40 ` Sergey Y. Afonin 0 siblings, 0 replies; 9+ messages in thread From: Sergey Y. Afonin @ 2007-04-27 11:40 UTC (permalink / raw) To: devel On Friday 27 April 2007, Alexey Tourbin wrote: > > Но этот другой режим - тоже режим блокировок ? Хочется понять, почему > > сейчас работает, когда нет явного указания на использование блокировок. > > Обязательно уже должно было несколько процессов к одной базе сунуться > > и не раз. Ан нет, пашет... > > Если процесс всего один (одновременно работает с базой), Я писал в начале: "Процессов mailfromd сейчас, например, 1306 штук". Это фильтр для sendmail. > то блокировать ничего не надо. Это у вообще демон что ли или нет? Демон, размножающийся по одной копии на каждое принимаемое сообщение. > Давайте ка посерьезнее. Где git репоазитарий и над каким кодом идет > медитация? git-а нет, есть svn: "svn checkout http://svn.gnu.org.ua/sources/mailfromd/trunk" Вообще автор не склонен пока переходить на блокировку из BDB. Про причины могу попробовать распросить более подробно. Хотя вот Олман для MeTA1 таскает за собой отдельную патченную db-4.3.28.NC, а в sendmail тоже пользовался самописными блокировками... -- С уважением, Сергей Афонин asy@altlinux.ru ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [devel] вопрос про BDB и блокировки. 2007-04-27 10:05 [devel] вопрос про BDB и блокировки Sergey Y. Afonin 2007-04-27 10:20 ` Alexey Tourbin @ 2007-04-27 10:24 ` Sergey Y. Afonin 1 sibling, 0 replies; 9+ messages in thread From: Sergey Y. Afonin @ 2007-04-27 10:24 UTC (permalink / raw) To: ALT Devel discussion list On Friday 27 April 2007, Sergey Y. Afonin wrote: > Процессов mailfromd сейчас, например, 1306 штук. В логах по поводу ошибок > с BDB тишина. Это везение, или есть какие-то объективные причины для этого ? Забыл добавить. Это Compact 3.0, db4.3-4.3.28-alt1 -- С уважением, Сергей Афонин asy@altlinux.ru ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2007-04-27 12:07 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2007-04-27 10:05 [devel] вопрос про BDB и блокировки Sergey Y. Afonin 2007-04-27 10:20 ` Alexey Tourbin 2007-04-27 10:38 ` Sergey Y. Afonin 2007-04-27 11:02 ` Alexey Tourbin 2007-04-27 12:00 ` Sergey Y. Afonin 2007-04-27 12:07 ` Sergey Y. Afonin 2007-04-27 11:19 ` Alexey Tourbin 2007-04-27 11:40 ` Sergey Y. Afonin 2007-04-27 10:24 ` Sergey Y. Afonin
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git