summaryrefslogtreecommitdiff
path: root/databases/flare/files/patch-kqueue-server.cc
diff options
context:
space:
mode:
authorNorikatsu Shigemura <nork@FreeBSD.org>2010-05-30 04:41:50 +0000
committerNorikatsu Shigemura <nork@FreeBSD.org>2010-05-30 04:41:50 +0000
commit4bfc868fa38694920f916a2d7b3f93f1c5cab28a (patch)
tree0007c480d3b7f900c96e2915c058559fe2b01dc8 /databases/flare/files/patch-kqueue-server.cc
parentfix typo failing install (diff)
Add flare 1.0.9, is distributed, and persistent key-value storage
compatible / memcached, and has more features(as follows): * persistent storage (you can use flare as persistent memcached) * pluggable storage (currently only Tokyo Cabinet is available, though:) * data replication (synchronous or asynchronous) * data partitioning (automatically partitioned according to # of master servers (clients do not have to care about it)) * dynamic reconstruction, and partitioning (you can dynamically (I mean, without any service interruption) add slave servers and partition master servers) * node monitoring and failover (if any server is down, the server is automatically isolated from active servers and another slave server is promoted to master server) * request proxy (you can always get same result regardless of servers you connect to. so you can think flare servers as one big key-value storage) * over 256 bytes keys, and over 1M bytes values are available WWW: http://labs.gree.jp/Top/OpenSource/Flare-en.html
Notes
Notes: svn path=/head/; revision=255301
Diffstat (limited to 'databases/flare/files/patch-kqueue-server.cc')
-rw-r--r--databases/flare/files/patch-kqueue-server.cc106
1 files changed, 106 insertions, 0 deletions
diff --git a/databases/flare/files/patch-kqueue-server.cc b/databases/flare/files/patch-kqueue-server.cc
new file mode 100644
index 000000000000..699e3fb6e57e
--- /dev/null
+++ b/databases/flare/files/patch-kqueue-server.cc
@@ -0,0 +1,106 @@
+--- src/lib/server.cc.orig 2009-10-09 19:08:47.000000000 +0900
++++ src/lib/server.cc 2010-05-30 06:10:23.363742550 +0900
+@@ -21,6 +21,9 @@
+ #ifdef HAVE_EPOLL
+ _epoll_socket(0),
+ #endif
++#ifdef HAVE_KQUEUE
++ _kqueue_socket(-1),
++#endif
+ _back_log(SOMAXCONN) {
+ }
+
+@@ -55,6 +58,14 @@
+ }
+ #endif
+
++#ifdef HAVE_KQUEUE
++ if (this->_kqueue_socket >= 0) {
++ if (::close(this->_kqueue_socket) < 0) {
++ log_err("close() failed: %s (%d) (sock=kqueue)", util::strerror(errno), errno);
++ }
++ }
++#endif
++
+ for (int i = 0; i < this->_listen_socket_index; i++) {
+ int sock = this->_listen_socket[i];
+
+@@ -139,6 +150,12 @@
+ }
+ #endif
+
++#ifdef HAVE_KQUEUE
++ if (this->_add_kqueue_socket(sock) < 0) {
++ return -1;
++ }
++#endif
++
+ return 0;
+ }
+
+@@ -195,6 +212,12 @@
+ }
+ #endif
+
++#ifdef HAVE_KQUEUE
++ if (this->_add_kqueue_socket(sock) < 0) {
++ return -1;
++ }
++#endif
++
+ return 0;
+ }
+
+@@ -208,6 +231,10 @@
+ const char* poll_type = "epoll_wait"; // just for logging
+ struct epoll_event ev_list[this->max_listen_socket];
+ int n = epoll_wait(this->_epoll_socket, ev_list, this->max_listen_socket, -1);
++#elifdef HAVE_KQUEUE
++ const char* poll_type = "kqueue_wait"; // just for logging
++ struct kevent kev;
++ int n = kevent(this->_kqueue_socket, &kev, 1, NULL, 0, NULL);
+ #else
+ const char* poll_type = "select"; // just for logging
+ fd_set fds;
+@@ -230,6 +257,8 @@
+ #ifdef HAVE_EPOLL
+ for (int i = 0; i < n; i++) {
+ int listen_socket = ev_list[i].data.fd;
++#elifdef HAVE_KQUEUE
++ int listen_socket = kev.ident;
+ #else
+ for (int i = 0; i < this->_listen_socket_index; i++) {
+ if (!FD_ISSET(this->_listen_socket[i], &fds)) {
+@@ -369,6 +398,32 @@
+ return 0;
+ }
+ #endif
++
++#ifdef HAVE_KQUEUE
++/**
++ * add listen socket to kqueue
++ */
++int server::_add_kqueue_socket(int sock) {
++ if (this->_kqueue_socket <= 0) {
++ this->_kqueue_socket = kqueue();
++ if (this->_kqueue_socket < 0) {
++ log_err("kqueue() failed: %s (%s)", util::strerror(errno), errno);
++ return -1;
++ }
++ }
++
++ struct kevent kev;
++ EV_SET(&kev, sock, EVFILT_READ, EV_ADD, 0, 0, NULL);
++ if (kevent(this->_kqueue_socket, &kev, 1, NULL, 0, NULL) < 0 ) {
++ log_err("kevent() failed: %s (%d) (sock=%d)", util::strerror(errno), errno, sock);
++ return -1;
++ } else {
++ log_debug("added listen socket to kevent (kqueue_socket=%d, listen_socket=%d)", this->_kqueue_socket, sock);
++ }
++
++ return 0;
++}
++#endif
+ // }}}
+
+ // {{{ private methods