hedis 0.9.11 → 0.9.12
raw patch · 4 files changed
+54/−7 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Database.Redis: [connectTimeout] :: ConnectInfo -> Maybe NominalDiffTime
- Database.Redis: ConnInfo :: HostName -> PortID -> Maybe ByteString -> Integer -> Int -> NominalDiffTime -> ConnectInfo
+ Database.Redis: ConnInfo :: HostName -> PortID -> Maybe ByteString -> Integer -> Int -> NominalDiffTime -> Maybe NominalDiffTime -> ConnectInfo
Files
- CHANGELOG +8/−0
- hedis.cabal +1/−1
- src/Database/Redis/Core.hs +8/−1
- src/Database/Redis/ProtocolPipelining.hs +37/−5
CHANGELOG view
@@ -1,5 +1,9 @@ # Changelog for Hedis +## 0.9.12++* PR #98. Added `connectTimeout` option+ ## 0.9.11 * PR #94. Refactor fix for issue #92 - (Connection to Unix sockets is broken)@@ -20,6 +24,10 @@ ## 0.9.7 * Expose returnDecode method of RedisCtx (see issue #83)++## 0.9.6++* Export Condition constructors (see PR #86) ## 0.9.2
hedis.cabal view
@@ -1,5 +1,5 @@ name: hedis-version: 0.9.11+version: 0.9.12 synopsis: Client library for the Redis datastore: supports full command set, pipelining.
src/Database/Redis/Core.hs view
@@ -166,6 +166,10 @@ -- smallest acceptable value is 0.5 seconds. If the @timeout@ value in -- your redis.conf file is non-zero, it should be larger than -- 'connectMaxIdleTime'.+ , connectTimeout :: Maybe NominalDiffTime+ -- ^ Optional timeout until connection to Redis gets+ -- established. 'ConnectTimeoutException' gets thrown if no socket+ -- get connected in this interval of time. } deriving Show -- |Default information for connecting:@@ -187,6 +191,7 @@ , connectDatabase = 0 , connectMaxConnections = 50 , connectMaxIdleTime = 30+ , connectTimeout = Nothing } -- |Constructs a 'Connection' pool to a Redis server designated by the @@ -197,7 +202,9 @@ createPool create destroy 1 connectMaxIdleTime connectMaxConnections where create = do- conn <- PP.connect connectHost connectPort+ let timeoutOptUs =+ round . (1000000 *) <$> connectTimeout+ conn <- PP.connect connectHost connectPort timeoutOptUs runRedisInternal conn $ do -- AUTH case connectAuth of
src/Database/Redis/ProtocolPipelining.hs view
@@ -21,6 +21,9 @@ ) where import Prelude+import Control.Concurrent (threadDelay)+import Control.Concurrent.Async (race)+import Control.Concurrent.MVar import Control.Exception import Control.Monad import qualified Scanner@@ -54,9 +57,20 @@ instance Exception ConnectionLostException -connect :: HostName -> PortID -> IO Connection-connect hostName portID =- bracketOnError (hConnect portID) hClose $ \connHandle -> do+data ConnectPhase+ = PhaseUnknown+ | PhaseResolve+ | PhaseOpenSocket+ deriving (Show)++data ConnectTimeout = ConnectTimeout ConnectPhase+ deriving (Show, Typeable)++instance Exception ConnectTimeout++connect :: HostName -> PortID -> Maybe Int -> IO Connection+connect hostName portID timeoutOpt =+ bracketOnError hConnect hClose $ \connHandle -> do hSetBinaryMode connHandle True connReplies <- newIORef [] connPending <- newIORef []@@ -66,13 +80,28 @@ writeIORef connReplies rs writeIORef connPending rs return conn- where hConnect (PortNumber port) =+ where+ hConnect = do+ phaseMVar <- newMVar PhaseUnknown+ let doConnect = hConnect' portID phaseMVar+ case timeoutOpt of+ Nothing -> doConnect+ Just micros -> do+ result <- race doConnect (threadDelay micros)+ case result of+ Left h -> return h+ Right () -> do+ phase <- readMVar phaseMVar+ errConnectTimeout phase+ hConnect' (PortNumber port) mvar = bracketOnError mkSocket NS.close $ \sock -> do NS.setSocketOption sock NS.KeepAlive 1+ void $ swapMVar mvar PhaseResolve host <- BSD.getHostByName hostName+ void $ swapMVar mvar PhaseOpenSocket NS.connect sock $ NS.SockAddrInet port (BSD.hostAddress host) NS.socketToHandle sock ReadWriteMode- hConnect _ = connectTo hostName portID+ hConnect' _ _ = connectTo hostName portID mkSocket = NS.socket NS.AF_INET NS.Stream 0 disconnect :: Connection -> IO ()@@ -157,3 +186,6 @@ errConnClosed :: IO a errConnClosed = throwIO ConnectionLost++errConnectTimeout :: ConnectPhase -> IO a+errConnectTimeout phase = throwIO $ ConnectTimeout phase