#endif
int LMDBBackend::s_reloadcount=0;
-pthread_mutex_t LMDBBackend::s_initlock = PTHREAD_MUTEX_INITIALIZER;
+pthread_rwlock_t LMDBBackend::s_initlock = PTHREAD_RWLOCK_INITIALIZER;
LMDBBackend::LMDBBackend(const string &suffix)
{
d_doDnssec = false;
}
d_lastreload = s_reloadcount;
+ WriteLock wl(&s_initlock);
open_db();
}
if( MDB_VERINT( major, minor, patch ) < MDB_VERINT( 0, 9, 8 ) )
throw PDNSException( "LMDB Library version too old (" + verstring + "). Needs to be 0.9.8 or greater" );
- Lock l(&s_initlock);
if( (rc = mdb_env_create(&env)) )
throw PDNSException("Couldn't open LMDB database " + path + ": mdb_env_create() returned " + mdb_strerror(rc));
LMDBBackend::~LMDBBackend()
{
+ WriteLock wl(&s_initlock);
close_db();
}
void LMDBBackend::needReload() {
if (s_reloadcount > d_lastreload) {
+ WriteLock wl(&s_initlock);
d_lastreload = s_reloadcount;
close_db();
open_db();
return false;
needReload();
+ ReadLock rl(&s_initlock);
if (kind == "PRESIGNED" || kind == "NSEC3PARAM") {
int rc;
return false;
needReload();
+ ReadLock rl(&s_initlock);
MDB_val key, data;
string key_str, cur_key, cur_value;
return false;
needReload();
+ ReadLock rl(&s_initlock);
int rc;
MDB_val key, data;
bool LMDBBackend::getAuthZone( string &rev_zone )
{
needReload();
+ ReadLock rl(&s_initlock);
MDB_val key, data;
// XXX can do this just using char *
bool LMDBBackend::getAuthData( SOAData &soa, DNSPacket *p )
{
needReload();
+ ReadLock rl(&s_initlock);
MDB_val key, value;
if( mdb_cursor_get(zone_cursor, &key, &value, MDB_GET_CURRENT) )
DEBUGLOG("lookup: " <<inQdomain << " " << type.getName() << endl);
needReload();
+ ReadLock rl(&s_initlock);
d_first = true;
d_origdomain = inQdomain;
bool is_axfr = (d_curqtype == QType::AXFR);
bool is_full_key = ( ! is_axfr && d_curqtype != QType::ANY );
+ ReadLock rl(&s_initlock);
DEBUGLOG("get : " <<d_origdomain<< endl);
if( !d_origdomain.length() )
return false;