From 1ca56c9b3ee112d89f5f300a8a1dbad74a6cc182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Canna=C3=B2?= Date: Tue, 29 Nov 2016 12:10:59 +0000 Subject: [PATCH] Speeds up LOAD MYSQL USERS TO RUNTIME #802 MySQL_Authentication::add() used to delete a user, and then create it. This patch applied the change in place if possible. With 100k users, not it is around 7 times faster. --- lib/MySQL_Authentication.cpp | 74 ++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 25 deletions(-) diff --git a/lib/MySQL_Authentication.cpp b/lib/MySQL_Authentication.cpp index eba87de19..d8129d958 100644 --- a/lib/MySQL_Authentication.cpp +++ b/lib/MySQL_Authentication.cpp @@ -125,41 +125,62 @@ __loop_remove_inactives: bool MySQL_Authentication::add(char * username, char * password, enum cred_username_type usertype, bool use_ssl, int default_hostgroup, char *default_schema, bool schema_locked, bool transaction_persistent, bool fast_forward, int max_connections) { uint64_t hash1, hash2; - SpookyHash *myhash=new SpookyHash(); - myhash->Init(1,2); - myhash->Update(username,strlen(username)); - myhash->Final(&hash1,&hash2); - delete myhash; +// SpookyHash *myhash=new SpookyHash(); +// myhash->Init(1,2); +// myhash->Update(username,strlen(username)); +// myhash->Final(&hash1,&hash2); +// delete myhash; + SpookyHash myhash; + myhash.Init(1,2); + myhash.Update(username,strlen(username)); + myhash.Final(&hash1,&hash2); creds_group_t &cg=(usertype==USERNAME_BACKEND ? creds_backends : creds_frontends); - void *sha1_pass=NULL; - char *oldpass=NULL; +// void *sha1_pass=NULL; +// char *oldpass=NULL; spin_wrlock(&cg.lock); //btree::btree_map::iterator lookup; std::unordered_map::iterator lookup; lookup = cg.bt_map.find(hash1); + // few changes will follow, due to issue #802 + account_details_t *ad=NULL; + bool new_ad=false; if (lookup != cg.bt_map.end()) { - account_details_t *ad=lookup->second; - cg.cred_array->remove_fast(ad); - cg.bt_map.erase(lookup); - free(ad->username); + ad=lookup->second; +// cg.cred_array->remove_fast(ad); +// cg.bt_map.erase(lookup); + //free(ad->username); +/* if (ad->sha1_pass) { oldpass=strdup(ad->password); sha1_pass=malloc(SHA_DIGEST_LENGTH); memcpy(sha1_pass,ad->sha1_pass,SHA_DIGEST_LENGTH); } - free(ad->password); - if (ad->sha1_pass) { - free(ad->sha1_pass); - ad->sha1_pass=NULL; +*/ + if (strcmp(ad->password,password)) { + free(ad->password); + ad->password=strdup(password); + if (ad->sha1_pass) { + free(ad->sha1_pass); + ad->sha1_pass=NULL; + } + } else { } - free(ad->default_schema); - free(ad); - } - account_details_t *ad=(account_details_t *)malloc(sizeof(account_details_t)); - ad->username=strdup(username); - ad->password=strdup(password); + if (strcmp(ad->default_schema,default_schema)) { + free(ad->default_schema); + ad->default_schema=strdup(default_schema); + } +// free(ad); + } else { + ad=(account_details_t *)malloc(sizeof(account_details_t)); + ad->username=strdup(username); + ad->default_schema=strdup(default_schema); + ad->password=strdup(password); + new_ad=true; + ad->sha1_pass=NULL; + } +/* ad->sha1_pass=NULL; if (strlen(password)) { if (password[0]=='*') { // password is sha1(sha1(real_password)) @@ -171,19 +192,21 @@ bool MySQL_Authentication::add(char * username, char * password, enum cred_usern } } } +*/ ad->use_ssl=use_ssl; ad->default_hostgroup=default_hostgroup; - ad->default_schema=strdup(default_schema); ad->schema_locked=schema_locked; ad->transaction_persistent=transaction_persistent; ad->fast_forward=fast_forward; ad->max_connections=max_connections; ad->num_connections_used=0; ad->__active=true; - cg.bt_map.insert(std::make_pair(hash1,ad)); - cg.cred_array->add(ad); + if (new_ad) { + cg.bt_map.insert(std::make_pair(hash1,ad)); + cg.cred_array->add(ad); + } spin_wrunlock(&cg.lock); - +/* if (oldpass) { free(oldpass); oldpass=NULL; @@ -192,6 +215,7 @@ bool MySQL_Authentication::add(char * username, char * password, enum cred_usern free(sha1_pass); sha1_pass=NULL; } +*/ return true; };