namespace Auth {
UserNameCache::UserNameCache(const char *name) :
- cachename(name)
+ cachename(name), cacheCleanupEventName("User cache cleanup: ")
{
- static std::string eventName("User Cache cleanup: ");
- eventName.append(name);
- eventAdd(eventName.c_str(), &UserNameCache::cleanup, this, ::Config.authenticateGCInterval, 1);
+ cacheCleanupEventName.append(name);
+ eventAdd(cacheCleanupEventName.c_str(), &UserNameCache::Cleanup,
+ this, ::Config.authenticateGCInterval, 1);
}
Auth::User::Pointer
{
auto p = store_.find(userKey);
if (p == store_.end())
- return User::Pointer();
+ return User::Pointer(nullptr);
return p->second;
}
void
-UserNameCache::reset()
+UserNameCache::Cleanup(void *data)
{
- store_.clear();
-}
-
-size_t
-UserNameCache::size()
-{
- return store_.size();
-}
-
-void
-UserNameCache::cleanup(void *me)
-{
- // me is this in disguise
- UserNameCache *self = static_cast<UserNameCache *>(me);
+ // data is this in disguise
+ UserNameCache *self = static_cast<UserNameCache *>(data);
// cache entries with expiretime <= expirationTime are to be evicted
const time_t expirationTime = current_time.tv_sec - ::Config.authenticateTTL;
const auto end = self->store_.end();
store_[anAuth_user->SBUserKey()] = anAuth_user;
}
-std::vector<Auth::User::Pointer> UserNameCache::sortedUsersList ()
+// generates the list of cached usernames in a format that is convenient
+// to merge with equivalent lists obtained from other UserNameCaches.
+std::vector<Auth::User::Pointer>
+UserNameCache::sortedUsersList()
{
std::vector<Auth::User::Pointer> rv(size(), nullptr);
std::transform(store_.begin(), store_.end(), rv.begin(),
namespace Auth {
+/** Cache of Auth::User::Pointer, keyed by Auth::User::userKey
+ *
+ * It's meant to be used as a per-authentication protocol cache,
+ * cleaning up objects which are past authenticate_ttl life
+ */
class UserNameCache
{
private:
- /// key is Uer::userKey(), mapped value is User::Pointer
+ /// key is User::userKey(), mapped value is User::Pointer
typedef std::unordered_map<SBuf, Auth::User::Pointer> StoreType;
public:
/// add an user to the cache
void insert(Auth::User::Pointer anAuth_user);
- void reset();
+ /// clear cache
+ void reset() { store_.clear(); }
- size_t size();
+ /// extract number of cached usernames
+ size_t size() { return store_.size(); }
/** periodic cleanup function, removes timed-out entries
*
* Must be static to support EVH interface. Argument will be this
*/
- static void cleanup(void *);
+ static void Cleanup(void *);
/** obtain sorted list of usernames
*
// for logs, events etc.
const char *cachename;
+
+ // must be unique to the cache and valid for the object's lifetime
+ std::string cacheCleanupEventName;
};
} /* namespace Auth */