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 на дескрипторе каталога (круто!). И ещё одна тонкость что нужно сигналы обязательно блокировать на время взятия блокировки. Кажется, факт блокировки фиксируется физически в самой базе. Поэтому если по пришествии сигнала блокировку не снять, то база останется залоченной "надолго".