diff options
author | Norikatsu Shigemura <nork@FreeBSD.org> | 2010-05-30 04:41:50 +0000 |
---|---|---|
committer | Norikatsu Shigemura <nork@FreeBSD.org> | 2010-05-30 04:41:50 +0000 |
commit | 4bfc868fa38694920f916a2d7b3f93f1c5cab28a (patch) | |
tree | 0007c480d3b7f900c96e2915c058559fe2b01dc8 /databases/flare/files/patch-kqueue-server.cc | |
parent | fix 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.cc | 106 |
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 |