Skip to content

Commit a4f8065

Browse files
author
John Hann
committed
Finish minimal cluster support (untested).
1 parent 784f4df commit a4f8065

File tree

3 files changed

+22
-18
lines changed

3 files changed

+22
-18
lines changed

Network/Memcache.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@ module Network.Memcache (
55
module Network.Memcache.Server,
66
Protocol.Expiry(..),
77
Memcache.Memcache(..),
8-
module Network.Memcache.Helpers
8+
module Network.Memcache.Helpers,
9+
module Network.Memcache.Cluster
910
) where
1011

1112
import qualified Network.Memcache.Protocol as Protocol
1213
import Network.Memcache.Server
1314
import qualified Network.Memcache.Memcache as Memcache
1415
import Network.Memcache.Helpers
16+
import Network.Memcache.Cluster
1517

1618
-- vim: set ts=2 sw=2 et :

Network/Memcache/Cluster.hs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
module Network.Memcache.Cluster where
1+
module Network.Memcache.Cluster (
2+
Cluster(..),
3+
Distribute,
4+
simple
5+
) where
26

37
import Network.Memcache.Server
48
import Network.Memcache.Key
@@ -13,10 +17,7 @@ data Cluster =
1317
distribute :: Distribute
1418
}
1519

16-
type Distribute = [Server NoConnection] -> String -> Server NoConnection
17-
18-
choose :: Cluster -> String -> Server NoConnection
19-
choose (Cluster ss dist) keyable = dist ss (toKey keyable)
20+
type Distribute = [Server AutoConnection] -> String -> Server AutoConnection
2021

2122
-- TODO: ketama (requires an MD5 library)
2223
-- Reference: http://www.last.fm/user/RJ/journal/2007/04/10/rz_libketama_-_a_consistent_hashing_algo_for_memcache_clients
@@ -25,21 +26,20 @@ choose (Cluster ss dist) keyable = dist ss (toKey keyable)
2526

2627
-- this seems ok for short keys
2728
-- TODO: prevent empty list of servers from getting here
28-
simple :: String -> [Server NoConnection] -> Server NoConnection
29+
simple :: String -> [Server AutoConnection] -> Server AutoConnection
2930
simple k (s : []) = s
3031
simple k ss = head . snd $ splitAt idx ss
3132
where
3233
hash = foldl' (\c i -> i + c * 31) 0 . map fromEnum
3334
idx = (hash . toKey) k `mod` length ss
3435

3536
instance Memcache Cluster where
36-
get cl k = P.get (getConnection cl k)
37-
delete cl k = P.delete (getConnection cl k)
38-
set cl e f k = P.store "set" (getConnection cl k) e f
39-
-- add (Connected s e f) = P.store "add" s e f
40-
-- replace (Connected s e f) = P.store "replace" s e f
41-
-- incr (Connected s _ _) = P.incDec "incr" s
42-
-- decr (Connected s _ _) = P.incDec "decr" s
43-
44-
-- TODO: figure out how to connect the server. They're all Server NoConnection!
45-
getConnection cl key = cConn (distribute cl (servers cl) key)
37+
get cl k = get (getServer cl k) k
38+
delete cl k = delete (getServer cl k) k
39+
set cl k = set (getServer cl k) k
40+
add cl k = add (getServer cl k) k
41+
replace cl k = replace (getServer cl k) k
42+
incr cl k = incr (getServer cl k) k
43+
decr cl k = decr (getServer cl k) k
44+
45+
getServer cl key = distribute cl (servers cl) (toKey key)

memcached.cabal

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ exposed-modules:
3333
Network.Memcache.Memcache,
3434
Network.Memcache.Protocol,
3535
Network.Memcache.Serializable,
36-
Network.Memcache.Key
36+
Network.Memcache.Key,
37+
Network.Memcache.Cluster,
38+
Network.Memcache.Helpers
3739

3840
ghc-options: -Wall
3941
ghc-prof-options: -prof -auto-all

0 commit comments

Comments
 (0)