void gs_init_ttl() { register Inodenum i; #ifndef AGE_IN_INODE Res_size numbytes; numbytes = Superblock.s_numinodes; CEILING_BLKSZ(numbytes); Inode_local_ttl = (unsigned char *) a_alloc(A_CACHE_MEM, numbytes); Inode_global_ttl = (unsigned char *) a_alloc(A_CACHE_MEM, numbytes); if (Inode_local_ttl == 0 || Inode_global_ttl == 0) bpanic("Insufficient memory for ttl structures."); #endif if ( init_done ) return ; dbmessage(28,("Init_ttl starts...")); p_ttl_updates = ttl_updates ; mu_init(&update_mutex) ; sema_init(&can_age,0) ; sema_init(&awaiting_accept,0); refuse_age=1 ; refusing_member= -1 ; delay_threshold= HARD_THRESHOLD ; /* Initially set all lifetimes to unknown */ for (i = 1; i < Superblock.s_numinodes; i++) { INIT_LOCAL_TTL(i) ; INIT_GLOBAL_TTL(i) ; } init_done= 1; dbmessage(28,("Init_ttl finishes")); }
void CursorCache::gotKillCursors(Message& m ) { DbMessage dbmessage(m); int n = dbmessage.pullInt(); if ( n > 2000 ) { ( n < 30000 ? warning() : error() ) << "receivedKillCursors, n=" << n << endl; } uassert( 13286 , "sent 0 cursors to kill" , n >= 1 ); uassert( 13287 , "too many cursors to kill" , n < 30000 ); massert( 18632 , str::stream() << "bad kill cursors size: " << m.dataSize(), m.dataSize() == 8 + ( 8 * n ) ); const long long* cursors = dbmessage.getArray(n); ClientBasic* client = ClientBasic::getCurrent(); AuthorizationSession* authSession = client->getAuthorizationSession(); for ( int i=0; i<n; i++ ) { long long id = cursors[i]; LOG(_myLogLevel) << "CursorCache::gotKillCursors id: " << id << endl; if ( ! id ) { warning() << " got cursor id of 0 to kill" << endl; continue; } string server; { scoped_lock lk( _mutex ); MapSharded::iterator i = _cursors.find( id ); if ( i != _cursors.end() ) { const bool isAuthorized = authSession->isAuthorizedForActionsOnNamespace( NamespaceString(i->second->getNS()), ActionType::killCursors); audit::logKillCursorsAuthzCheck( client, NamespaceString(i->second->getNS()), id, isAuthorized ? ErrorCodes::OK : ErrorCodes::Unauthorized); if (isAuthorized) { _cursorsMaxTimeMS.erase( i->second->getId() ); _cursors.erase( i ); } continue; } MapNormal::iterator refsIt = _refs.find(id); MapNormal::iterator refsNSIt = _refsNS.find(id); if (refsIt == _refs.end()) { warning() << "can't find cursor: " << id << endl; continue; } verify(refsNSIt != _refsNS.end()); const bool isAuthorized = authSession->isAuthorizedForActionsOnNamespace( NamespaceString(refsNSIt->second), ActionType::killCursors); audit::logKillCursorsAuthzCheck( client, NamespaceString(refsNSIt->second), id, isAuthorized ? ErrorCodes::OK : ErrorCodes::Unauthorized); if (!isAuthorized) { continue; } server = refsIt->second; _refs.erase(refsIt); _refsNS.erase(refsNSIt); } LOG(_myLogLevel) << "CursorCache::found gotKillCursors id: " << id << " server: " << server << endl; verify( server.size() ); ScopedDbConnection conn(server); conn->killCursor( id ); conn.done(); } }
void CursorCache::gotKillCursors(Message& m ) { DbMessage dbmessage(m); int n = dbmessage.pullInt(); if ( n > 2000 ) { LOG( n < 30000 ? LL_WARNING : LL_ERROR ) << "receivedKillCursors, n=" << n << endl; } uassert( 13286 , "sent 0 cursors to kill" , n >= 1 ); uassert( 13287 , "too many cursors to kill" , n < 30000 ); massert( 18632 , str::stream() << "bad kill cursors size: " << m.dataSize(), m.dataSize() == 8 + ( 8 * n ) ); const long long* cursors = dbmessage.getArray(n); AuthorizationManager* authManager = ClientBasic::getCurrent()->getAuthorizationManager(); for ( int i=0; i<n; i++ ) { long long id = cursors[i]; LOG(_myLogLevel) << "CursorCache::gotKillCursors id: " << id << endl; if ( ! id ) { LOG( LL_WARNING ) << " got cursor id of 0 to kill" << endl; continue; } string server; { scoped_lock lk( _mutex ); MapSharded::iterator i = _cursors.find( id ); if ( i != _cursors.end() ) { if (authManager->checkAuthorization(i->second->getNS(), ActionType::killCursors)) { _cursors.erase( i ); } continue; } MapNormal::iterator refsIt = _refs.find(id); MapNormal::iterator refsNSIt = _refsNS.find(id); if (refsIt == _refs.end()) { LOG( LL_WARNING ) << "can't find cursor: " << id << endl; continue; } verify(refsNSIt != _refsNS.end()); if (!authManager->checkAuthorization(refsNSIt->second, ActionType::killCursors)) { continue; } server = refsIt->second; _refs.erase(refsIt); _refsNS.erase(refsNSIt); } LOG(_myLogLevel) << "CursorCache::found gotKillCursors id: " << id << " server: " << server << endl; verify( server.size() ); scoped_ptr<ScopedDbConnection> conn( ScopedDbConnection::getScopedDbConnection( server ) ); conn->get()->killCursor( id ); conn->done(); } }