summaryrefslogtreecommitdiffstats
path: root/sca-cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp')
-rw-r--r--sca-cpp/trunk/components/cache/memcache-test.cpp4
-rw-r--r--sca-cpp/trunk/components/cache/memcache.composite1
-rw-r--r--sca-cpp/trunk/components/cache/memcache.cpp3
-rw-r--r--sca-cpp/trunk/components/cache/memcache.hpp41
-rwxr-xr-xsca-cpp/trunk/components/cache/memcached-start6
-rwxr-xr-xsca-cpp/trunk/components/cache/memcached-stop6
-rwxr-xr-xsca-cpp/trunk/components/cache/memcached-test8
-rwxr-xr-xsca-cpp/trunk/components/cache/server-test8
-rw-r--r--sca-cpp/trunk/samples/store-cluster/domains/jane/shopping-cart.py27
-rw-r--r--sca-cpp/trunk/samples/store-cluster/domains/jane/store.composite3
-rw-r--r--sca-cpp/trunk/samples/store-cluster/domains/joe/shopping-cart.py27
-rw-r--r--sca-cpp/trunk/samples/store-cluster/domains/joe/store.composite3
-rwxr-xr-xsca-cpp/trunk/samples/store-cluster/ssl-start7
-rwxr-xr-xsca-cpp/trunk/samples/store-cluster/start7
-rwxr-xr-xsca-cpp/trunk/samples/store-cluster/stop4
-rw-r--r--sca-cpp/trunk/samples/store-cpp/store.composite1
-rw-r--r--sca-cpp/trunk/samples/store-java/store.composite1
-rw-r--r--sca-cpp/trunk/samples/store-python/store.composite1
-rw-r--r--sca-cpp/trunk/samples/store-scheme/store.composite1
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite1
-rw-r--r--sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite1
21 files changed, 112 insertions, 49 deletions
diff --git a/sca-cpp/trunk/components/cache/memcache-test.cpp b/sca-cpp/trunk/components/cache/memcache-test.cpp
index 04c4b7d347..289037a179 100644
--- a/sca-cpp/trunk/components/cache/memcache-test.cpp
+++ b/sca-cpp/trunk/components/cache/memcache-test.cpp
@@ -33,7 +33,7 @@ namespace tuscany {
namespace memcache {
bool testMemCached() {
- MemCached ch("localhost", 11211);
+ MemCached ch(mklist<string>("localhost:11211", "localhost:11212", "localhost:11213"));
const value k = mklist<value>("a");
assert(hasContent(post(k, string("AAA"), ch)));
@@ -59,7 +59,7 @@ struct getLoop {
bool testGetPerf() {
const value k = mklist<value>("c");
- MemCached ch("localhost", 11211);
+ MemCached ch(mklist<string>("localhost:11211", "localhost:11212", "localhost:11213"));
assert(hasContent(post(k, string("CCC"), ch)));
const lambda<bool()> gl = getLoop(k, ch);
diff --git a/sca-cpp/trunk/components/cache/memcache.composite b/sca-cpp/trunk/components/cache/memcache.composite
index 654df6abbf..7c160172f0 100644
--- a/sca-cpp/trunk/components/cache/memcache.composite
+++ b/sca-cpp/trunk/components/cache/memcache.composite
@@ -27,6 +27,7 @@
<service name="memcache">
<t:binding.http uri="memcache"/>
</service>
+ <property name="servers">localhost,localhost:11212,localhost:11213</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/components/cache/memcache.cpp b/sca-cpp/trunk/components/cache/memcache.cpp
index 246b6137b3..ec61ae9a92 100644
--- a/sca-cpp/trunk/components/cache/memcache.cpp
+++ b/sca-cpp/trunk/components/cache/memcache.cpp
@@ -112,7 +112,8 @@ private:
*/
const failable<value> start(unused const list<value>& params) {
// Connect to memcached
- memcache::MemCached& ch = *(new (gc_new<memcache::MemCached>()) memcache::MemCached("localhost", 11211));
+ const value servers = ((lambda<value(list<value>)>)car(params))(list<value>());
+ memcache::MemCached& ch = *(new (gc_new<memcache::MemCached>()) memcache::MemCached(tokenize(",", servers)));
// Return the component implementation lambda function
return value(lambda<value(const list<value>&)>(applyCache(ch)));
diff --git a/sca-cpp/trunk/components/cache/memcache.hpp b/sca-cpp/trunk/components/cache/memcache.hpp
index d410b90767..213120891f 100644
--- a/sca-cpp/trunk/components/cache/memcache.hpp
+++ b/sca-cpp/trunk/components/cache/memcache.hpp
@@ -54,7 +54,13 @@ public:
MemCached(const string host, const int port) : owner(true) {
apr_pool_create(&pool, NULL);
apr_memcache_create(pool, 1, 0, &mc);
- init(host, port);
+ addServer(host, port);
+ }
+
+ MemCached(const list<string>& servers) : owner(true) {
+ apr_pool_create(&pool, NULL);
+ apr_memcache_create(pool, 1, 0, &mc);
+ addServers(servers);
}
MemCached(const MemCached& c) : owner(false) {
@@ -79,9 +85,9 @@ private:
friend const failable<bool> del(const value& key, const MemCached& cache);
/**
- * Initialize the memcached context.
+ * Add servers to the memcached context.
*/
- const failable<bool> init(const string& host, const int port) {
+ const failable<bool> addServer(const string& host, const int port) {
apr_memcache_server_t *server;
const apr_status_t sc = apr_memcache_server_create(pool, c_str(host), (apr_port_t)port, 0, 1, 1, 60, &server);
if (sc != APR_SUCCESS)
@@ -91,9 +97,30 @@ private:
return mkfailure<bool>("Could not add server");
return true;
}
+
+ const failable<bool> addServers(const list<string>& servers) {
+ if (isNil(servers))
+ return true;
+ const list<string> toks = tokenize(":", car(servers));
+ const failable<bool> r = addServer(car(toks), isNil(cdr(toks))? 11211 : atoi(c_str(cadr(toks))));
+ if (!hasContent(r))
+ return r;
+ return addServers(cdr(servers));
+ }
};
/**
+ * Replace spaces by tabs (as spaces are not allowed in memcached keys).
+ */
+const char* nospaces(const char* s) {
+ char* c = const_cast<char*>(s);
+ for (; *c; c++)
+ if (*c == ' ')
+ *c = '\t';
+ return s;
+}
+
+/**
* Post a new item to the cache.
*/
const failable<bool> post(const value& key, const value& val, const MemCached& cache) {
@@ -102,7 +129,7 @@ const failable<bool> post(const value& key, const value& val, const MemCached& c
const string ks(scheme::writeValue(key));
const string vs(scheme::writeValue(val));
- const apr_status_t rc = apr_memcache_add(cache.mc, c_str(ks), const_cast<char*>(c_str(vs)), length(vs), 0, 27);
+ const apr_status_t rc = apr_memcache_add(cache.mc, nospaces(c_str(ks)), const_cast<char*>(c_str(vs)), length(vs), 0, 27);
if (rc != APR_SUCCESS)
return mkfailure<bool>("Could not add entry");
@@ -119,7 +146,7 @@ const failable<bool> put(const value& key, const value& val, const MemCached& ca
const string ks(scheme::writeValue(key));
const string vs(scheme::writeValue(val));
- const apr_status_t rc = apr_memcache_set(cache.mc, c_str(ks), const_cast<char*>(c_str(vs)), length(vs), 0, 27);
+ const apr_status_t rc = apr_memcache_set(cache.mc, nospaces(c_str(ks)), const_cast<char*>(c_str(vs)), length(vs), 0, 27);
if (rc != APR_SUCCESS)
return mkfailure<bool>("Could not set entry");
@@ -141,7 +168,7 @@ const failable<value> get(const value& key, const MemCached& cache) {
char *data;
apr_size_t size;
- const apr_status_t rc = apr_memcache_getp(cache.mc, cache.pool, c_str(ks), &data, &size, NULL);
+ const apr_status_t rc = apr_memcache_getp(cache.mc, cache.pool, nospaces(c_str(ks)), &data, &size, NULL);
if (rc != APR_SUCCESS) {
apr_pool_destroy(vpool);
return mkfailure<value>("Could not get entry");
@@ -161,7 +188,7 @@ const failable<bool> del(const value& key, const MemCached& cache) {
debug(key, "memcache::delete::key");
const string ks(scheme::writeValue(key));
- const apr_status_t rc = apr_memcache_delete(cache.mc, c_str(ks), 0);
+ const apr_status_t rc = apr_memcache_delete(cache.mc, nospaces(c_str(ks)), 0);
if (rc != APR_SUCCESS)
return mkfailure<bool>("Could not delete entry");
diff --git a/sca-cpp/trunk/components/cache/memcached-start b/sca-cpp/trunk/components/cache/memcached-start
index b10d7f3fe8..a3cecc29bf 100755
--- a/sca-cpp/trunk/components/cache/memcached-start
+++ b/sca-cpp/trunk/components/cache/memcached-start
@@ -19,7 +19,11 @@
# Start memcached
here=`readlink -f $0`; here=`dirname $here`
+port=$1
+if [ "$port" = "" ]; then
+ port="11211"
+fi
memcached_prefix=`cat $here/memcached.prefix`
-$memcached_prefix/bin/memcached -d -l 127.0.0.1 -m 4 -p 11211
+$memcached_prefix/bin/memcached -d -l 127.0.0.1 -m 4 -p $port
diff --git a/sca-cpp/trunk/components/cache/memcached-stop b/sca-cpp/trunk/components/cache/memcached-stop
index 80801cdfbf..6522e1d36e 100755
--- a/sca-cpp/trunk/components/cache/memcached-stop
+++ b/sca-cpp/trunk/components/cache/memcached-stop
@@ -19,8 +19,12 @@
# Stop memcached
here=`readlink -f $0`; here=`dirname $here`
+port=$1
+if [ "$port" = "" ]; then
+ port="11211"
+fi
memcached_prefix=`cat $here/memcached.prefix`
-mc="$memcached_prefix/bin/memcached -d -l 127.0.0.1 -m 4 -p 11211"
+mc="$memcached_prefix/bin/memcached -d -l 127.0.0.1 -m 4 -p $port"
kill `ps -ef | grep -v grep | grep "${mc}" | awk '{ print $2 }'`
diff --git a/sca-cpp/trunk/components/cache/memcached-test b/sca-cpp/trunk/components/cache/memcached-test
index 842e8d2030..993d63ba1b 100755
--- a/sca-cpp/trunk/components/cache/memcached-test
+++ b/sca-cpp/trunk/components/cache/memcached-test
@@ -18,7 +18,9 @@
# under the License.
# Setup
-./memcached-start
+./memcached-start 11211
+./memcached-start 11212
+./memcached-start 11213
sleep 1
# Test
@@ -26,5 +28,7 @@ sleep 1
rc=$?
# Cleanup
-./memcached-stop
+./memcached-stop 11211
+./memcached-stop 11212
+./memcached-stop 11213
return $rc
diff --git a/sca-cpp/trunk/components/cache/server-test b/sca-cpp/trunk/components/cache/server-test
index 5c86b75ebc..598d4bce5b 100755
--- a/sca-cpp/trunk/components/cache/server-test
+++ b/sca-cpp/trunk/components/cache/server-test
@@ -26,7 +26,9 @@ SCAContribution `pwd`/
SCAComposite memcache.composite
EOF
-./memcached-start
+./memcached-start 11211
+./memcached-start 11212
+./memcached-start 11213
../../modules/http/httpd-start tmp
sleep 2
@@ -36,6 +38,8 @@ rc=$?
# Cleanup
../../modules/http/httpd-stop tmp
-./memcached-stop
+./memcached-stop 11211
+./memcached-stop 11212
+./memcached-stop 11213
sleep 2
return $rc
diff --git a/sca-cpp/trunk/samples/store-cluster/domains/jane/shopping-cart.py b/sca-cpp/trunk/samples/store-cluster/domains/jane/shopping-cart.py
index 405adb85bf..e315b2f1ca 100644
--- a/sca-cpp/trunk/samples/store-cluster/domains/jane/shopping-cart.py
+++ b/sca-cpp/trunk/samples/store-cluster/domains/jane/shopping-cart.py
@@ -19,21 +19,23 @@
import uuid
import sys
-cartId = "1234"
+# Convert a particular host and user email to a cart id
+def cartid(host, email):
+ return ("cart", host(), email())
# Get the shopping cart from the cache
# Return an empty cart if not found
def getcart(id, cache):
- cart = cache("get", (id,))
+ cart = cache("get", id)
if cart is None:
return ()
return cart
# Post a new item to the cart, create a new cart if necessary
-def post(collection, item, cache):
+def post(collection, item, cache, host, email):
id = str(uuid.uuid1())
- cart = ((item[0], id, item[2]),) + getcart(cartId, cache)
- cache("put", (cartId,), cart)
+ cart = ((item[0], id, item[2]),) + getcart(cartid(host, email), cache)
+ cache("put", cartid(host, email), cart)
return (id,)
@@ -47,15 +49,15 @@ def find(id, cart):
return find(id, cart[1:])
# Get items from the cart
-def get(id, cache):
+def get(id, cache, host, email):
if id == ():
- return ("Your Cart", cartId) + getcart(cartId, cache)
- return find(id[0], getcart(cartId, cache))
+ return ("Your Cart", email()) + getcart(cartid(host, email), cache)
+ return find(id[0], getcart(cartid(host, email), cache))
# Delete items from the cart
-def delete(id, cache):
+def delete(id, cache, host, email):
if id == ():
- return cache("delete", (cartId,))
+ return cache("delete", cartid(host, email))
return True
# Return the price of an item
@@ -69,7 +71,6 @@ def sum(items):
return price(items[0]) + sum(items[1:])
# Return the total price of the items in the cart
-def gettotal(cache):
- cart = getcart(cartId, cache)
- return sum(cart)
+def gettotal(cache, host, email):
+ return sum(getcart(cartid(host, email), cache))
diff --git a/sca-cpp/trunk/samples/store-cluster/domains/jane/store.composite b/sca-cpp/trunk/samples/store-cluster/domains/jane/store.composite
index 893b4f0ed4..396970a6e6 100644
--- a/sca-cpp/trunk/samples/store-cluster/domains/jane/store.composite
+++ b/sca-cpp/trunk/samples/store-cluster/domains/jane/store.composite
@@ -43,6 +43,8 @@
<component name="ShoppingCart">
<t:implementation.python script="shopping-cart.py"/>
+ <property name="host">localhost</property>
+ <property name="email">anonymous@localhost</property>
<service name="ShoppingCart">
<t:binding.atom uri="shoppingCart"/>
</service>
@@ -64,6 +66,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211,localhost:11212,localhost:11213</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-cluster/domains/joe/shopping-cart.py b/sca-cpp/trunk/samples/store-cluster/domains/joe/shopping-cart.py
index 405adb85bf..e315b2f1ca 100644
--- a/sca-cpp/trunk/samples/store-cluster/domains/joe/shopping-cart.py
+++ b/sca-cpp/trunk/samples/store-cluster/domains/joe/shopping-cart.py
@@ -19,21 +19,23 @@
import uuid
import sys
-cartId = "1234"
+# Convert a particular host and user email to a cart id
+def cartid(host, email):
+ return ("cart", host(), email())
# Get the shopping cart from the cache
# Return an empty cart if not found
def getcart(id, cache):
- cart = cache("get", (id,))
+ cart = cache("get", id)
if cart is None:
return ()
return cart
# Post a new item to the cart, create a new cart if necessary
-def post(collection, item, cache):
+def post(collection, item, cache, host, email):
id = str(uuid.uuid1())
- cart = ((item[0], id, item[2]),) + getcart(cartId, cache)
- cache("put", (cartId,), cart)
+ cart = ((item[0], id, item[2]),) + getcart(cartid(host, email), cache)
+ cache("put", cartid(host, email), cart)
return (id,)
@@ -47,15 +49,15 @@ def find(id, cart):
return find(id, cart[1:])
# Get items from the cart
-def get(id, cache):
+def get(id, cache, host, email):
if id == ():
- return ("Your Cart", cartId) + getcart(cartId, cache)
- return find(id[0], getcart(cartId, cache))
+ return ("Your Cart", email()) + getcart(cartid(host, email), cache)
+ return find(id[0], getcart(cartid(host, email), cache))
# Delete items from the cart
-def delete(id, cache):
+def delete(id, cache, host, email):
if id == ():
- return cache("delete", (cartId,))
+ return cache("delete", cartid(host, email))
return True
# Return the price of an item
@@ -69,7 +71,6 @@ def sum(items):
return price(items[0]) + sum(items[1:])
# Return the total price of the items in the cart
-def gettotal(cache):
- cart = getcart(cartId, cache)
- return sum(cart)
+def gettotal(cache, host, email):
+ return sum(getcart(cartid(host, email), cache))
diff --git a/sca-cpp/trunk/samples/store-cluster/domains/joe/store.composite b/sca-cpp/trunk/samples/store-cluster/domains/joe/store.composite
index 893b4f0ed4..396970a6e6 100644
--- a/sca-cpp/trunk/samples/store-cluster/domains/joe/store.composite
+++ b/sca-cpp/trunk/samples/store-cluster/domains/joe/store.composite
@@ -43,6 +43,8 @@
<component name="ShoppingCart">
<t:implementation.python script="shopping-cart.py"/>
+ <property name="host">localhost</property>
+ <property name="email">anonymous@localhost</property>
<service name="ShoppingCart">
<t:binding.atom uri="shoppingCart"/>
</service>
@@ -64,6 +66,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211,localhost:11212,localhost:11213</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-cluster/ssl-start b/sca-cpp/trunk/samples/store-cluster/ssl-start
index 4acd41bc2d..d9d0fec67d 100755
--- a/sca-cpp/trunk/samples/store-cluster/ssl-start
+++ b/sca-cpp/trunk/samples/store-cluster/ssl-start
@@ -99,9 +99,10 @@ cp `../../modules/http/ssl-ls tmp/ssl` tmp/proxy2/conf
../../modules/http/proxy-ssl-member-conf tmp/proxy2 localhost 8443
../../modules/http/httpd-start tmp/proxy2
-# Start a shared memcached
-# Todo change to one per server
-../../components/cache/memcached-start
+# Start three memcached servers
+../../components/cache/memcached-start 11211
+../../components/cache/memcached-start 11212
+../../components/cache/memcached-start 11213
# Redirect traffic from port 80 to 8091 and use proxy1
#../../ubuntu/ip-redirect-all 80 8091
diff --git a/sca-cpp/trunk/samples/store-cluster/start b/sca-cpp/trunk/samples/store-cluster/start
index 809e9edad9..1cd5825471 100755
--- a/sca-cpp/trunk/samples/store-cluster/start
+++ b/sca-cpp/trunk/samples/store-cluster/start
@@ -71,9 +71,10 @@ EOF
../../modules/http/proxy-member-conf tmp/proxy2 localhost 8103
../../modules/http/httpd-start tmp/proxy2
-# Start a shared memcached
-# Todo change to one per server
-../../components/cache/memcached-start
+# Start three memcached servers
+../../components/cache/memcached-start 11211
+../../components/cache/memcached-start 11212
+../../components/cache/memcached-start 11213
# Redirect traffic from port 80 to 8091 and use proxy1
#../../ubuntu/ip-redirect-all 80 8091
diff --git a/sca-cpp/trunk/samples/store-cluster/stop b/sca-cpp/trunk/samples/store-cluster/stop
index 375e5de698..9df37dc948 100755
--- a/sca-cpp/trunk/samples/store-cluster/stop
+++ b/sca-cpp/trunk/samples/store-cluster/stop
@@ -22,4 +22,6 @@
../../modules/http/httpd-stop tmp/server3
../../modules/http/httpd-stop tmp/proxy1
../../modules/http/httpd-stop tmp/proxy2
-../../components/cache/memcached-stop
+../../components/cache/memcached-stop 11211
+../../components/cache/memcached-stop 11212
+../../components/cache/memcached-stop 11213
diff --git a/sca-cpp/trunk/samples/store-cpp/store.composite b/sca-cpp/trunk/samples/store-cpp/store.composite
index c9039a1d58..8b5edede99 100644
--- a/sca-cpp/trunk/samples/store-cpp/store.composite
+++ b/sca-cpp/trunk/samples/store-cpp/store.composite
@@ -64,6 +64,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-java/store.composite b/sca-cpp/trunk/samples/store-java/store.composite
index b93e2dbfbf..4b0db9d05c 100644
--- a/sca-cpp/trunk/samples/store-java/store.composite
+++ b/sca-cpp/trunk/samples/store-java/store.composite
@@ -64,6 +64,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-python/store.composite b/sca-cpp/trunk/samples/store-python/store.composite
index 045ebe6ec5..912898123b 100644
--- a/sca-cpp/trunk/samples/store-python/store.composite
+++ b/sca-cpp/trunk/samples/store-python/store.composite
@@ -64,6 +64,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-scheme/store.composite b/sca-cpp/trunk/samples/store-scheme/store.composite
index e461637b2b..fd58ae6c9d 100644
--- a/sca-cpp/trunk/samples/store-scheme/store.composite
+++ b/sca-cpp/trunk/samples/store-scheme/store.composite
@@ -64,6 +64,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite b/sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite
index 893b4f0ed4..0c94bd81d2 100644
--- a/sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite
+++ b/sca-cpp/trunk/samples/store-vhost/domains/jane/store.composite
@@ -64,6 +64,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211</property>
</component>
</composite>
diff --git a/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite b/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite
index 893b4f0ed4..0c94bd81d2 100644
--- a/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite
+++ b/sca-cpp/trunk/samples/store-vhost/domains/joe/store.composite
@@ -64,6 +64,7 @@
<service name="Cache">
<t:binding.atom uri="cache"/>
</service>
+ <property name="servers">localhost:11211</property>
</component>
</composite>