diff options
author | Abhi Beckert <abhi@abhibeckert.com> | 2017-03-10 12:49:14 +1000 |
---|---|---|
committer | Abhi Beckert <abhi@abhibeckert.com> | 2017-03-10 12:49:14 +1000 |
commit | 833d8726302d854684dfa52db92e30c6766a8b63 (patch) | |
tree | 413e33bb2f9ab97d5e71532585447a7fb928d836 | |
parent | 9c5357a28e27b74a6df7bfeeb24015073d5993e5 (diff) | |
parent | 7c56b11d8bdead768e86643a4b61e3f293820330 (diff) | |
download | sequelpro-833d8726302d854684dfa52db92e30c6766a8b63.tar.gz sequelpro-833d8726302d854684dfa52db92e30c6766a8b63.tar.bz2 sequelpro-833d8726302d854684dfa52db92e30c6766a8b63.zip |
Merge remote-tracking branch 'sequelpro/master'
9 files changed, 46 insertions, 39 deletions
diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h b/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h index 99daca77..8fdf4e7e 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h +++ b/Frameworks/SPMySQLFramework/Source/SPMySQL Private APIs.h @@ -47,7 +47,6 @@ - (void)_disconnect; - (void)_updateConnectionVariables; - (void)_restoreConnectionVariables; -- (BOOL)_checkConnectionIfNecessary; - (void)_validateThreadSetup; + (void)_removeThreadVariables:(NSNotification *)aNotification; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h index a3f34817..1bd9f85b 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.h @@ -34,6 +34,7 @@ typedef struct { MYSQL *mySQLConnection; volatile BOOL *keepAlivePingThreadActivePointer; volatile BOOL *keepAliveLastPingSuccessPointer; + void *parentId; } SPMySQLConnectionPingDetails; @interface SPMySQLConnection (Ping_and_KeepAlive) diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m index 7940b483..374d0909 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Ping & KeepAlive.m @@ -33,6 +33,7 @@ #import "SPMySQL Private APIs.h" #import "Locking.h" #import <pthread.h> +#include <stdio.h> @implementation SPMySQLConnection (Ping_and_KeepAlive) @@ -85,7 +86,7 @@ } keepAliveThread = [NSThread currentThread]; - [keepAliveThread setName:@"SPMySQL connection keepalive monitor thread"]; + [keepAliveThread setName:[NSString stringWithFormat:@"SPMySQL connection keepalive monitor thread (id=%p)", self]]; // If the maximum number of ping failures has been reached, determine whether to reconnect. if (keepAliveLastPingBlocked || keepAlivePingFailures >= 3) { @@ -158,6 +159,7 @@ end_cleanup: pingDetails->mySQLConnection = mySQLConnection; pingDetails->keepAliveLastPingSuccessPointer = &keepAliveLastPingSuccess; pingDetails->keepAlivePingThreadActivePointer = &keepAlivePingThreadActive; + pingDetails->parentId = self; // Create a pthread for the ping pthread_t keepAlivePingThread_t; @@ -216,9 +218,11 @@ end_cleanup: */ void _backgroundPingTask(void *ptr) { - pthread_setname_np("SPMySQL _backgroundPingTask() worker thread"); - SPMySQLConnectionPingDetails *pingDetails = (SPMySQLConnectionPingDetails *)ptr; + + char threadNameBuf[80]; + snprintf(threadNameBuf, sizeof(threadNameBuf), "SPMySQL _backgroundPingTask() worker thread (id=%p)", pingDetails->parentId); + pthread_setname_np(threadNameBuf); // Set up a cleanup routine pthread_cleanup_push(_pingThreadCleanup, pingDetails); diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m index d96ebe52..594756be 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Querying & Preparation.m @@ -79,7 +79,7 @@ // Ensure per-thread variables are set up [self _validateThreadSetup]; - if (![self _checkConnectionIfNecessary]) return nil; + if (![self checkConnectionIfNecessary]) return nil; // Perform a lossy conversion to bytes, using NSData to do the hard work. Preserves // nul characters correctly. @@ -259,7 +259,7 @@ [self _validateThreadSetup]; // Check the connection if necessary, returning nil if the state couldn't be validated - if (![self _checkConnectionIfNecessary]) return nil; + if (![self checkConnectionIfNecessary]) return nil; // Determine whether a maximum query size needs to be restored from a previous query if (queryActionShouldRestoreMaxQuerySize != NSNotFound) { diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m index db846929..d8d87931 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection Categories/Server Info.m @@ -107,7 +107,7 @@ if (state != SPMySQLConnected) return nil; // Check the connection if appropriate - if (![self _checkConnectionIfNecessary]) return nil; + if (![self checkConnectionIfNecessary]) return nil; // Lock the connection before using it [self _lockConnection]; @@ -153,7 +153,7 @@ - (BOOL)serverShutdown { - if([self _checkConnectionIfNecessary]) { + if([self checkConnectionIfNecessary]) { [self _lockConnection]; // Ensure per-thread variables are set up [self _validateThreadSetup]; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h index 15b809f1..343d0d36 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.h @@ -188,6 +188,7 @@ - (BOOL)isConnected; - (BOOL)isConnectedViaSSL; - (BOOL)checkConnection; +- (BOOL)checkConnectionIfNecessary; - (double)timeConnected; - (BOOL)userTriggeredDisconnect; diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m index ce980af8..e8692895 100644 --- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m +++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m @@ -336,6 +336,8 @@ const char *SPMySQLSSLPermissibleCiphers = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RS * * WARNING: This method may return NO if the current thread is cancelled! * You MUST check the isCancelled flag before using the result! + * + * NOTE: In general -checkConnectionIfNecessary should be used instead! */ - (BOOL)checkConnection { @@ -375,6 +377,35 @@ const char *SPMySQLSSLPermissibleCiphers = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RS } /** + * If thirty seconds have passed since the last time the connection was + * used, check the connection. + * This minimises the impact of continuous additional connection checks - + * each of which requires a round trip to the server - but handles most + * network issues. + * Returns whether the connection is considered still valid. + * + * WARNING: This method may return NO if the current thread is cancelled! + * You MUST check the isCancelled flag before using the result! + */ +- (BOOL)checkConnectionIfNecessary +{ + + // If the connection has been dropped in the background, trigger a + // reconnect and return the success state here + if (state == SPMySQLConnectionLostInBackground) { + return [self _reconnectAllowingRetries:YES]; + } + + // If the connection was recently used, return success + if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 30) { + return YES; + } + + // Otherwise check the connection + return [self checkConnection]; +} + +/** * Retrieve the time elapsed since the connection was established, in seconds. * This time is retrieved in a monotonically increasing fashion and is high * precision; it is used internally for query timing, and is reset on reconnections. @@ -1043,35 +1074,6 @@ static uint64_t _elapsedMicroSecondsSinceAbsoluteTime(uint64_t comparisonTime) } /** - * If thirty seconds have passed since the last time the connection was - * used, check the connection. - * This minimises the impact of continuous additional connection checks - - * each of which requires a round trip to the server - but handles most - * network issues. - * Returns whether the connection is considered still valid. - * - * WARNING: This method may return NO if the current thread is cancelled! - * You MUST check the isCancelled flag before using the result! - */ -- (BOOL)_checkConnectionIfNecessary -{ - - // If the connection has been dropped in the background, trigger a - // reconnect and return the success state here - if (state == SPMySQLConnectionLostInBackground) { - return [self _reconnectAllowingRetries:YES]; - } - - // If the connection was recently used, return success - if (_elapsedSecondsSinceAbsoluteTime(lastConnectionUsedTime) < 30) { - return YES; - } - - // Otherwise check the connection - return [self checkConnection]; -} - -/** * Ensure that the thread this method is called on has been registered for * use with MySQL. MySQL requires thread-specific variables for safe * execution. diff --git a/Source/SPDatabaseStructure.m b/Source/SPDatabaseStructure.m index 8eed2607..fdb78916 100644 --- a/Source/SPDatabaseStructure.m +++ b/Source/SPDatabaseStructure.m @@ -551,7 +551,7 @@ cleanup_thread_and_pool: if (!mySQLConnection || !delegate) return NO; // Check the connection state - if ([mySQLConnection isConnected] && [mySQLConnection checkConnection]) return YES; + if ([mySQLConnection isConnected] && [mySQLConnection checkConnectionIfNecessary]) return YES; // the result of checkConnection may be meaningless if the thread was cancelled during execution. (issue #2353) if([[NSThread currentThread] isCancelled]) return NO; @@ -1,7 +1,7 @@ Sequel Pro <img alt="Logo" src="https://sequelpro.com/images/logo.png" align="right" height="50"> ========== -Sequel Pro is a fast, easy-to-use Mac database management application for working with MySQL databases. +Sequel Pro is a fast, easy-to-use Mac database management application for working with MySQL & MariaDB databases. You can find more details on our website: [sequelpro.com](http://sequelpro.com) |