nutcracker 0.2.4.12 → 0.3.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Rakefile +1 -1
- data/ext/nutcracker/ChangeLog +10 -0
- data/ext/nutcracker/Makefile.am +2 -0
- data/ext/nutcracker/Makefile.in +101 -14
- data/ext/nutcracker/README.md +18 -1
- data/ext/nutcracker/config.h.in +18 -0
- data/ext/nutcracker/configure +196 -25
- data/ext/nutcracker/configure.ac +64 -6
- data/ext/nutcracker/extconf.rb +1 -1
- data/ext/nutcracker/man/nutcracker.8 +76 -0
- data/ext/nutcracker/notes/debug.txt +116 -16
- data/ext/nutcracker/notes/kqueue.pdf +0 -0
- data/ext/nutcracker/notes/recommendation.md +20 -0
- data/ext/nutcracker/notes/redis.md +2 -2
- data/ext/nutcracker/scripts/nutcracker.spec +1 -1
- data/ext/nutcracker/scripts/redis-check.sh +3 -1
- data/ext/nutcracker/src/Makefile.am +15 -6
- data/ext/nutcracker/src/Makefile.in +39 -36
- data/ext/nutcracker/src/event/Makefile.am +16 -0
- data/ext/nutcracker/src/event/Makefile.in +492 -0
- data/ext/nutcracker/src/event/nc_epoll.c +344 -0
- data/ext/nutcracker/src/event/nc_event.h +88 -0
- data/ext/nutcracker/src/event/nc_evport.c +420 -0
- data/ext/nutcracker/src/event/nc_kqueue.c +412 -0
- data/ext/nutcracker/src/hashkit/nc_crc32.c +19 -1
- data/ext/nutcracker/src/hashkit/nc_hashkit.h +3 -1
- data/ext/nutcracker/src/hashkit/nc_md5.c +257 -315
- data/ext/nutcracker/src/nc.c +12 -1
- data/ext/nutcracker/src/nc_connection.c +18 -1
- data/ext/nutcracker/src/nc_connection.h +1 -0
- data/ext/nutcracker/src/nc_core.c +22 -30
- data/ext/nutcracker/src/nc_core.h +22 -7
- data/ext/nutcracker/src/nc_proxy.c +8 -9
- data/ext/nutcracker/src/nc_queue.h +2 -0
- data/ext/nutcracker/src/nc_request.c +3 -4
- data/ext/nutcracker/src/nc_response.c +25 -8
- data/ext/nutcracker/src/nc_server.c +8 -6
- data/ext/nutcracker/src/nc_stats.c +46 -43
- data/ext/nutcracker/src/nc_stats.h +37 -30
- data/ext/nutcracker/src/nc_util.c +6 -1
- data/ext/nutcracker/src/proto/nc_redis.c +19 -5
- data/lib/nutcracker/version.rb +1 -1
- data/lib/nutcracker.rb +1 -1
- metadata +10 -4
- data/ext/nutcracker/src/nc_event.c +0 -214
- data/ext/nutcracker/src/nc_event.h +0 -39
data/ext/nutcracker/configure
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#! /bin/sh
|
2
2
|
# Guess values for system-dependent variables and create Makefiles.
|
3
|
-
# Generated by GNU Autoconf 2.68 for nutcracker 0.
|
3
|
+
# Generated by GNU Autoconf 2.68 for nutcracker 0.3.0.
|
4
4
|
#
|
5
|
-
# Report bugs to <manj@
|
5
|
+
# Report bugs to <manj@cs.stanford.edu>.
|
6
6
|
#
|
7
7
|
#
|
8
8
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
|
@@ -246,7 +246,7 @@ fi
|
|
246
246
|
$as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
|
247
247
|
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
|
248
248
|
else
|
249
|
-
$as_echo "$0: Please tell bug-autoconf@gnu.org and manj@
|
249
|
+
$as_echo "$0: Please tell bug-autoconf@gnu.org and manj@cs.stanford.edu about your
|
250
250
|
$0: system, including any error possibly output before this
|
251
251
|
$0: message. Then install a modern shell, or manually run
|
252
252
|
$0: the script under such a shell if you do have one."
|
@@ -569,9 +569,9 @@ MAKEFLAGS=
|
|
569
569
|
# Identity of this package.
|
570
570
|
PACKAGE_NAME='nutcracker'
|
571
571
|
PACKAGE_TARNAME='nutcracker'
|
572
|
-
PACKAGE_VERSION='0.
|
573
|
-
PACKAGE_STRING='nutcracker 0.
|
574
|
-
PACKAGE_BUGREPORT='manj@
|
572
|
+
PACKAGE_VERSION='0.3.0'
|
573
|
+
PACKAGE_STRING='nutcracker 0.3.0'
|
574
|
+
PACKAGE_BUGREPORT='manj@cs.stanford.edu'
|
575
575
|
PACKAGE_URL=''
|
576
576
|
|
577
577
|
ac_unique_file="src/nc.c"
|
@@ -616,6 +616,12 @@ ac_subst_vars='am__EXEEXT_FALSE
|
|
616
616
|
am__EXEEXT_TRUE
|
617
617
|
LTLIBOBJS
|
618
618
|
subdirs
|
619
|
+
OS_SOLARIS_FALSE
|
620
|
+
OS_SOLARIS_TRUE
|
621
|
+
OS_BSD_FALSE
|
622
|
+
OS_BSD_TRUE
|
623
|
+
OS_LINUX_FALSE
|
624
|
+
OS_LINUX_TRUE
|
619
625
|
LIBOBJS
|
620
626
|
CXXCPP
|
621
627
|
OTOOL64
|
@@ -1301,7 +1307,7 @@ if test "$ac_init_help" = "long"; then
|
|
1301
1307
|
# Omit some internal or obsolete options to make the list less imposing.
|
1302
1308
|
# This message is too long to be a string in the A/UX 3.1 sh.
|
1303
1309
|
cat <<_ACEOF
|
1304
|
-
\`configure' configures nutcracker 0.
|
1310
|
+
\`configure' configures nutcracker 0.3.0 to adapt to many kinds of systems.
|
1305
1311
|
|
1306
1312
|
Usage: $0 [OPTION]... [VAR=VALUE]...
|
1307
1313
|
|
@@ -1371,7 +1377,7 @@ fi
|
|
1371
1377
|
|
1372
1378
|
if test -n "$ac_init_help"; then
|
1373
1379
|
case $ac_init_help in
|
1374
|
-
short | recursive ) echo "Configuration of nutcracker 0.
|
1380
|
+
short | recursive ) echo "Configuration of nutcracker 0.3.0:";;
|
1375
1381
|
esac
|
1376
1382
|
cat <<\_ACEOF
|
1377
1383
|
|
@@ -1417,7 +1423,7 @@ Some influential environment variables:
|
|
1417
1423
|
Use these variables to override the choices made by `configure' or to help
|
1418
1424
|
it to find libraries and programs with nonstandard names/locations.
|
1419
1425
|
|
1420
|
-
Report bugs to <manj@
|
1426
|
+
Report bugs to <manj@cs.stanford.edu>.
|
1421
1427
|
_ACEOF
|
1422
1428
|
ac_status=$?
|
1423
1429
|
fi
|
@@ -1480,7 +1486,7 @@ fi
|
|
1480
1486
|
test -n "$ac_init_help" && exit $ac_status
|
1481
1487
|
if $ac_init_version; then
|
1482
1488
|
cat <<\_ACEOF
|
1483
|
-
nutcracker configure 0.
|
1489
|
+
nutcracker configure 0.3.0
|
1484
1490
|
generated by GNU Autoconf 2.68
|
1485
1491
|
|
1486
1492
|
Copyright (C) 2010 Free Software Foundation, Inc.
|
@@ -2127,9 +2133,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
|
|
2127
2133
|
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
|
2128
2134
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
|
2129
2135
|
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
|
2130
|
-
( $as_echo "##
|
2131
|
-
## Report this to manj@
|
2132
|
-
##
|
2136
|
+
( $as_echo "## ----------------------------------- ##
|
2137
|
+
## Report this to manj@cs.stanford.edu ##
|
2138
|
+
## ----------------------------------- ##"
|
2133
2139
|
) | sed "s/^/$as_me: WARNING: /" >&2
|
2134
2140
|
;;
|
2135
2141
|
esac
|
@@ -2151,7 +2157,7 @@ cat >config.log <<_ACEOF
|
|
2151
2157
|
This file contains any messages produced by compilers while
|
2152
2158
|
running configure, to aid debugging if configure makes a mistake.
|
2153
2159
|
|
2154
|
-
It was created by nutcracker $as_me 0.
|
2160
|
+
It was created by nutcracker $as_me 0.3.0, which was
|
2155
2161
|
generated by GNU Autoconf 2.68. Invocation command line was
|
2156
2162
|
|
2157
2163
|
$ $0 $@
|
@@ -2972,7 +2978,7 @@ fi
|
|
2972
2978
|
|
2973
2979
|
# Define the identity of the package.
|
2974
2980
|
PACKAGE='nutcracker'
|
2975
|
-
VERSION='0.
|
2981
|
+
VERSION='0.3.0'
|
2976
2982
|
|
2977
2983
|
|
2978
2984
|
cat >>confdefs.h <<_ACEOF
|
@@ -3018,13 +3024,13 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
|
|
3018
3024
|
$as_echo "#define NC_VERSION_MAJOR 0" >>confdefs.h
|
3019
3025
|
|
3020
3026
|
|
3021
|
-
$as_echo "#define NC_VERSION_MINOR
|
3027
|
+
$as_echo "#define NC_VERSION_MINOR 3" >>confdefs.h
|
3022
3028
|
|
3023
3029
|
|
3024
|
-
$as_echo "#define NC_VERSION_PATCH
|
3030
|
+
$as_echo "#define NC_VERSION_PATCH 0" >>confdefs.h
|
3025
3031
|
|
3026
3032
|
|
3027
|
-
$as_echo "#define NC_VERSION_STRING \"0.
|
3033
|
+
$as_echo "#define NC_VERSION_STRING \"0.3.0\"" >>confdefs.h
|
3028
3034
|
|
3029
3035
|
|
3030
3036
|
# Checks for language
|
@@ -16191,6 +16197,20 @@ fi
|
|
16191
16197
|
|
16192
16198
|
done
|
16193
16199
|
|
16200
|
+
for ac_header in execinfo.h
|
16201
|
+
do :
|
16202
|
+
ac_fn_c_check_header_mongrel "$LINENO" "execinfo.h" "ac_cv_header_execinfo_h" "$ac_includes_default"
|
16203
|
+
if test "x$ac_cv_header_execinfo_h" = xyes; then :
|
16204
|
+
cat >>confdefs.h <<_ACEOF
|
16205
|
+
#define HAVE_EXECINFO_H 1
|
16206
|
+
_ACEOF
|
16207
|
+
|
16208
|
+
$as_echo "#define HAVE_BACKTRACE 1" >>confdefs.h
|
16209
|
+
|
16210
|
+
fi
|
16211
|
+
|
16212
|
+
done
|
16213
|
+
|
16194
16214
|
for ac_header in sys/epoll.h
|
16195
16215
|
do :
|
16196
16216
|
ac_fn_c_check_header_mongrel "$LINENO" "sys/epoll.h" "ac_cv_header_sys_epoll_h" "$ac_includes_default"
|
@@ -16199,8 +16219,18 @@ if test "x$ac_cv_header_sys_epoll_h" = xyes; then :
|
|
16199
16219
|
#define HAVE_SYS_EPOLL_H 1
|
16200
16220
|
_ACEOF
|
16201
16221
|
|
16202
|
-
|
16203
|
-
|
16222
|
+
fi
|
16223
|
+
|
16224
|
+
done
|
16225
|
+
|
16226
|
+
for ac_header in sys/event.h
|
16227
|
+
do :
|
16228
|
+
ac_fn_c_check_header_mongrel "$LINENO" "sys/event.h" "ac_cv_header_sys_event_h" "$ac_includes_default"
|
16229
|
+
if test "x$ac_cv_header_sys_event_h" = xyes; then :
|
16230
|
+
cat >>confdefs.h <<_ACEOF
|
16231
|
+
#define HAVE_SYS_EVENT_H 1
|
16232
|
+
_ACEOF
|
16233
|
+
|
16204
16234
|
fi
|
16205
16235
|
|
16206
16236
|
done
|
@@ -16739,13 +16769,141 @@ fi
|
|
16739
16769
|
$as_echo "$ac_cv_epoll_works" >&6; }
|
16740
16770
|
if test "x$ac_cv_epoll_works" = "xyes"; then :
|
16741
16771
|
|
16772
|
+
$as_echo "#define HAVE_EPOLL 1" >>confdefs.h
|
16773
|
+
|
16774
|
+
fi
|
16775
|
+
|
16776
|
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if kqueue works" >&5
|
16777
|
+
$as_echo_n "checking if kqueue works... " >&6; }
|
16778
|
+
if ${ac_cv_kqueue_works+:} false; then :
|
16779
|
+
$as_echo_n "(cached) " >&6
|
16780
|
+
else
|
16781
|
+
if test "$cross_compiling" = yes; then :
|
16782
|
+
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
16783
|
+
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
16784
|
+
as_fn_error $? "cannot run test program while cross compiling
|
16785
|
+
See \`config.log' for more details" "$LINENO" 5; }
|
16786
|
+
else
|
16787
|
+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
16788
|
+
/* end confdefs.h. */
|
16789
|
+
|
16790
|
+
#include <stdio.h>
|
16791
|
+
#include <stdlib.h>
|
16792
|
+
#include <sys/types.h>
|
16793
|
+
#include <sys/event.h>
|
16794
|
+
#include <sys/time.h>
|
16795
|
+
int
|
16796
|
+
main(int argc, char **argv)
|
16797
|
+
{
|
16798
|
+
int fd;
|
16799
|
+
|
16800
|
+
fd = kqueue();
|
16801
|
+
if (fd < 0) {
|
16802
|
+
perror("kqueue:");
|
16803
|
+
exit(1);
|
16804
|
+
}
|
16805
|
+
exit(0);
|
16806
|
+
}
|
16807
|
+
|
16808
|
+
_ACEOF
|
16809
|
+
if ac_fn_c_try_run "$LINENO"; then :
|
16810
|
+
ac_cv_kqueue_works=yes
|
16811
|
+
else
|
16812
|
+
ac_cv_kqueue_works=no
|
16813
|
+
fi
|
16814
|
+
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
16815
|
+
conftest.$ac_objext conftest.beam conftest.$ac_ext
|
16816
|
+
fi
|
16817
|
+
|
16818
|
+
fi
|
16819
|
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_kqueue_works" >&5
|
16820
|
+
$as_echo "$ac_cv_kqueue_works" >&6; }
|
16821
|
+
if test "x$ac_cv_kqueue_works" = "xyes"; then :
|
16822
|
+
|
16823
|
+
$as_echo "#define HAVE_KQUEUE 1" >>confdefs.h
|
16824
|
+
|
16825
|
+
fi
|
16826
|
+
|
16827
|
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if event ports works" >&5
|
16828
|
+
$as_echo_n "checking if event ports works... " >&6; }
|
16829
|
+
if ${ac_cv_evports_works+:} false; then :
|
16830
|
+
$as_echo_n "(cached) " >&6
|
16742
16831
|
else
|
16832
|
+
if test "$cross_compiling" = yes; then :
|
16743
16833
|
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
|
16744
16834
|
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
|
16745
|
-
as_fn_error $? "
|
16835
|
+
as_fn_error $? "cannot run test program while cross compiling
|
16746
16836
|
See \`config.log' for more details" "$LINENO" 5; }
|
16837
|
+
else
|
16838
|
+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
16839
|
+
/* end confdefs.h. */
|
16840
|
+
|
16841
|
+
#include <stdio.h>
|
16842
|
+
#include <stdlib.h>
|
16843
|
+
#include <port.h>
|
16844
|
+
int
|
16845
|
+
main(int argc, char **argv)
|
16846
|
+
{
|
16847
|
+
int fd;
|
16848
|
+
|
16849
|
+
fd = port_create();
|
16850
|
+
if (fd < 0) {
|
16851
|
+
perror("port_create:");
|
16852
|
+
exit(1);
|
16853
|
+
}
|
16854
|
+
exit(0);
|
16855
|
+
}
|
16856
|
+
|
16857
|
+
_ACEOF
|
16858
|
+
if ac_fn_c_try_run "$LINENO"; then :
|
16859
|
+
ac_cv_evports_works=yes
|
16860
|
+
else
|
16861
|
+
ac_cv_evports_works=no
|
16862
|
+
fi
|
16863
|
+
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
|
16864
|
+
conftest.$ac_objext conftest.beam conftest.$ac_ext
|
16865
|
+
fi
|
16866
|
+
|
16867
|
+
fi
|
16868
|
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_evports_works" >&5
|
16869
|
+
$as_echo "$ac_cv_evports_works" >&6; }
|
16870
|
+
if test "x$ac_cv_evports_works" = "xyes"; then :
|
16871
|
+
|
16872
|
+
$as_echo "#define HAVE_EVENT_PORTS 1" >>confdefs.h
|
16873
|
+
|
16874
|
+
fi
|
16875
|
+
|
16876
|
+
if test "x$ac_cv_epoll_works" = "xno" &&
|
16877
|
+
test "x$ac_cv_kqueue_works" = "xno" &&
|
16878
|
+
test "x$ac_cv_evports_works" = "xno"; then :
|
16879
|
+
as_fn_error $? "either epoll or kqueue or event ports support is required" "$LINENO" 5
|
16880
|
+
fi
|
16881
|
+
|
16882
|
+
if test "x$ac_cv_epoll_works" = "xyes"; then
|
16883
|
+
OS_LINUX_TRUE=
|
16884
|
+
OS_LINUX_FALSE='#'
|
16885
|
+
else
|
16886
|
+
OS_LINUX_TRUE='#'
|
16887
|
+
OS_LINUX_FALSE=
|
16747
16888
|
fi
|
16748
16889
|
|
16890
|
+
if test "x$ac_cv_kqueue_works" = "xyes"; then
|
16891
|
+
OS_BSD_TRUE=
|
16892
|
+
OS_BSD_FALSE='#'
|
16893
|
+
else
|
16894
|
+
OS_BSD_TRUE='#'
|
16895
|
+
OS_BSD_FALSE=
|
16896
|
+
fi
|
16897
|
+
|
16898
|
+
if test "x$ac_cv_evports_works" = "xyes"; then
|
16899
|
+
OS_SOLARIS_TRUE=
|
16900
|
+
OS_SOLARIS_FALSE='#'
|
16901
|
+
else
|
16902
|
+
OS_SOLARIS_TRUE='#'
|
16903
|
+
OS_SOLARIS_FALSE=
|
16904
|
+
fi
|
16905
|
+
|
16906
|
+
|
16749
16907
|
# Package options
|
16750
16908
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable debug logs and asserts" >&5
|
16751
16909
|
$as_echo_n "checking whether to enable debug logs and asserts... " >&6; }
|
@@ -16817,7 +16975,7 @@ subdirs="$subdirs contrib/yaml-0.1.4"
|
|
16817
16975
|
|
16818
16976
|
|
16819
16977
|
# Define Makefiles
|
16820
|
-
ac_config_files="$ac_config_files Makefile contrib/Makefile src/Makefile src/hashkit/Makefile src/proto/Makefile"
|
16978
|
+
ac_config_files="$ac_config_files Makefile contrib/Makefile src/Makefile src/hashkit/Makefile src/proto/Makefile src/event/Makefile"
|
16821
16979
|
|
16822
16980
|
|
16823
16981
|
# Generate the "configure" script
|
@@ -16950,6 +17108,18 @@ if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
|
|
16950
17108
|
as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
|
16951
17109
|
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
16952
17110
|
fi
|
17111
|
+
if test -z "${OS_LINUX_TRUE}" && test -z "${OS_LINUX_FALSE}"; then
|
17112
|
+
as_fn_error $? "conditional \"OS_LINUX\" was never defined.
|
17113
|
+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
17114
|
+
fi
|
17115
|
+
if test -z "${OS_BSD_TRUE}" && test -z "${OS_BSD_FALSE}"; then
|
17116
|
+
as_fn_error $? "conditional \"OS_BSD\" was never defined.
|
17117
|
+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
17118
|
+
fi
|
17119
|
+
if test -z "${OS_SOLARIS_TRUE}" && test -z "${OS_SOLARIS_FALSE}"; then
|
17120
|
+
as_fn_error $? "conditional \"OS_SOLARIS\" was never defined.
|
17121
|
+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
|
17122
|
+
fi
|
16953
17123
|
tar xvfz contrib/yaml-0.1.4.tar.gz -C contrib
|
16954
17124
|
|
16955
17125
|
: "${CONFIG_STATUS=./config.status}"
|
@@ -17360,7 +17530,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
|
17360
17530
|
# report actual input values of CONFIG_FILES etc. instead of their
|
17361
17531
|
# values after options handling.
|
17362
17532
|
ac_log="
|
17363
|
-
This file was extended by nutcracker $as_me 0.
|
17533
|
+
This file was extended by nutcracker $as_me 0.3.0, which was
|
17364
17534
|
generated by GNU Autoconf 2.68. Invocation command line was
|
17365
17535
|
|
17366
17536
|
CONFIG_FILES = $CONFIG_FILES
|
@@ -17420,13 +17590,13 @@ $config_headers
|
|
17420
17590
|
Configuration commands:
|
17421
17591
|
$config_commands
|
17422
17592
|
|
17423
|
-
Report bugs to <manj@
|
17593
|
+
Report bugs to <manj@cs.stanford.edu>."
|
17424
17594
|
|
17425
17595
|
_ACEOF
|
17426
17596
|
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
17427
17597
|
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
17428
17598
|
ac_cs_version="\\
|
17429
|
-
nutcracker config.status 0.
|
17599
|
+
nutcracker config.status 0.3.0
|
17430
17600
|
configured by $0, generated by GNU Autoconf 2.68,
|
17431
17601
|
with options \\"\$ac_cs_config\\"
|
17432
17602
|
|
@@ -17938,6 +18108,7 @@ do
|
|
17938
18108
|
"src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
|
17939
18109
|
"src/hashkit/Makefile") CONFIG_FILES="$CONFIG_FILES src/hashkit/Makefile" ;;
|
17940
18110
|
"src/proto/Makefile") CONFIG_FILES="$CONFIG_FILES src/proto/Makefile" ;;
|
18111
|
+
"src/event/Makefile") CONFIG_FILES="$CONFIG_FILES src/event/Makefile" ;;
|
17941
18112
|
|
17942
18113
|
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
17943
18114
|
esac
|
data/ext/nutcracker/configure.ac
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Define the package version numbers and the bug reporting address
|
2
2
|
m4_define([NC_MAJOR], 0)
|
3
|
-
m4_define([NC_MINOR],
|
4
|
-
m4_define([NC_PATCH],
|
5
|
-
m4_define([NC_BUGS], [manj@
|
3
|
+
m4_define([NC_MINOR], 3)
|
4
|
+
m4_define([NC_PATCH], 0)
|
5
|
+
m4_define([NC_BUGS], [manj@cs.stanford.edu])
|
6
6
|
|
7
7
|
# Initialize autoconf
|
8
8
|
AC_PREREQ([2.64])
|
@@ -67,7 +67,10 @@ AC_CHECK_HEADERS([fcntl.h float.h limits.h stddef.h stdlib.h string.h unistd.h])
|
|
67
67
|
AC_CHECK_HEADERS([inttypes.h stdint.h])
|
68
68
|
AC_CHECK_HEADERS([sys/ioctl.h sys/time.h sys/uio.h])
|
69
69
|
AC_CHECK_HEADERS([sys/socket.h sys/un.h netinet/in.h arpa/inet.h netdb.h])
|
70
|
-
AC_CHECK_HEADERS([
|
70
|
+
AC_CHECK_HEADERS([execinfo.h],
|
71
|
+
[AC_DEFINE(HAVE_BACKTRACE, [1], [Define to 1 if backtrace is supported])], [])
|
72
|
+
AC_CHECK_HEADERS([sys/epoll.h], [], [])
|
73
|
+
AC_CHECK_HEADERS([sys/event.h], [], [])
|
71
74
|
|
72
75
|
# Checks for libraries
|
73
76
|
AC_CHECK_LIB([m], [pow])
|
@@ -100,7 +103,61 @@ main(int argc, char **argv)
|
|
100
103
|
exit(0);
|
101
104
|
}
|
102
105
|
], [ac_cv_epoll_works=yes], [ac_cv_epoll_works=no]))
|
103
|
-
AS_IF([test "x$ac_cv_epoll_works" = "xyes"],
|
106
|
+
AS_IF([test "x$ac_cv_epoll_works" = "xyes"],
|
107
|
+
[AC_DEFINE([HAVE_EPOLL], [1], [Define to 1 if epoll is supported])], [])
|
108
|
+
|
109
|
+
AC_CACHE_CHECK([if kqueue works], [ac_cv_kqueue_works],
|
110
|
+
AC_TRY_RUN([
|
111
|
+
#include <stdio.h>
|
112
|
+
#include <stdlib.h>
|
113
|
+
#include <sys/types.h>
|
114
|
+
#include <sys/event.h>
|
115
|
+
#include <sys/time.h>
|
116
|
+
int
|
117
|
+
main(int argc, char **argv)
|
118
|
+
{
|
119
|
+
int fd;
|
120
|
+
|
121
|
+
fd = kqueue();
|
122
|
+
if (fd < 0) {
|
123
|
+
perror("kqueue:");
|
124
|
+
exit(1);
|
125
|
+
}
|
126
|
+
exit(0);
|
127
|
+
}
|
128
|
+
], [ac_cv_kqueue_works=yes], [ac_cv_kqueue_works=no]))
|
129
|
+
AS_IF([test "x$ac_cv_kqueue_works" = "xyes"],
|
130
|
+
[AC_DEFINE([HAVE_KQUEUE], [1], [Define to 1 if kqueue is supported])], [])
|
131
|
+
|
132
|
+
AC_CACHE_CHECK([if event ports works], [ac_cv_evports_works],
|
133
|
+
AC_TRY_RUN([
|
134
|
+
#include <stdio.h>
|
135
|
+
#include <stdlib.h>
|
136
|
+
#include <port.h>
|
137
|
+
int
|
138
|
+
main(int argc, char **argv)
|
139
|
+
{
|
140
|
+
int fd;
|
141
|
+
|
142
|
+
fd = port_create();
|
143
|
+
if (fd < 0) {
|
144
|
+
perror("port_create:");
|
145
|
+
exit(1);
|
146
|
+
}
|
147
|
+
exit(0);
|
148
|
+
}
|
149
|
+
], [ac_cv_evports_works=yes], [ac_cv_evports_works=no]))
|
150
|
+
AS_IF([test "x$ac_cv_evports_works" = "xyes"],
|
151
|
+
[AC_DEFINE([HAVE_EVENT_PORTS], [1], [Define to 1 if event ports is supported])], [])
|
152
|
+
|
153
|
+
AS_IF([test "x$ac_cv_epoll_works" = "xno" &&
|
154
|
+
test "x$ac_cv_kqueue_works" = "xno" &&
|
155
|
+
test "x$ac_cv_evports_works" = "xno"],
|
156
|
+
[AC_MSG_ERROR([either epoll or kqueue or event ports support is required])], [])
|
157
|
+
|
158
|
+
AM_CONDITIONAL([OS_LINUX], [test "x$ac_cv_epoll_works" = "xyes"])
|
159
|
+
AM_CONDITIONAL([OS_BSD], [test "x$ac_cv_kqueue_works" = "xyes"])
|
160
|
+
AM_CONDITIONAL([OS_SOLARIS], [test "x$ac_cv_evports_works" = "xyes"])
|
104
161
|
|
105
162
|
# Package options
|
106
163
|
AC_MSG_CHECKING([whether to enable debug logs and asserts])
|
@@ -149,7 +206,8 @@ AC_CONFIG_FILES([Makefile
|
|
149
206
|
contrib/Makefile
|
150
207
|
src/Makefile
|
151
208
|
src/hashkit/Makefile
|
152
|
-
src/proto/Makefile
|
209
|
+
src/proto/Makefile
|
210
|
+
src/event/Makefile])
|
153
211
|
|
154
212
|
# Generate the "configure" script
|
155
213
|
AC_OUTPUT
|
data/ext/nutcracker/extconf.rb
CHANGED
@@ -0,0 +1,76 @@
|
|
1
|
+
.TH NUTCRACKER 8 "June 13, 2013"
|
2
|
+
.SH NAME
|
3
|
+
nutcracker \- Fast, light-weight proxy for memcached and Redis
|
4
|
+
.SH SYNOPSIS
|
5
|
+
.B nutcracker
|
6
|
+
.RI [ options ]
|
7
|
+
.SH DESCRIPTION
|
8
|
+
\fBnutcracker\fP, also known as \fBtwemproxy\fP (pronounced "two-em-proxy"), is
|
9
|
+
a fast and lightweight proxy for the memcached and Redis protocols.
|
10
|
+
.PP
|
11
|
+
It was primarily built to reduce the connection count on backend caching
|
12
|
+
servers, but it has a number of features, such as:
|
13
|
+
.IP \[bu]
|
14
|
+
Maintains persistent server connections to backend servers.
|
15
|
+
.IP \[bu]
|
16
|
+
Enables pipelining of requests and responses.
|
17
|
+
.IP \[bu]
|
18
|
+
Supports multiple server pools simultaneously.
|
19
|
+
.IP \[bu]
|
20
|
+
Shard data automatically across multiple servers.
|
21
|
+
.IP \[bu]
|
22
|
+
Supports multiple hashing modes including consistent hashing and
|
23
|
+
distribution.
|
24
|
+
.IP \[bu]
|
25
|
+
High-availability by disabling nodes on failures.
|
26
|
+
.IP \[bu]
|
27
|
+
Observability through stats exposed on stats monitoring port.
|
28
|
+
.SH OPTIONS
|
29
|
+
.TP
|
30
|
+
.BR \-h ", " \-\-help
|
31
|
+
Show usage information and exit.
|
32
|
+
.TP
|
33
|
+
.BR \-V ", " \-\-version
|
34
|
+
Show version and exit.
|
35
|
+
.TP
|
36
|
+
.BR \-t ", " \-\-test-conf
|
37
|
+
Test configuration for syntax errors and exit.
|
38
|
+
.TP
|
39
|
+
.BR \-D ", " \-\-describe-stats
|
40
|
+
Print stats description and exit.
|
41
|
+
.TP
|
42
|
+
.BR \-v ", " \-\-verbosity=\fIN\fP
|
43
|
+
Set logging level to \fIN\fP. (default: 5, min: 0, max: 11)
|
44
|
+
.TP
|
45
|
+
.BR \-o ", " \-\-output=\fIfilename\fP
|
46
|
+
Set logging file to \fIfilename\fP.
|
47
|
+
.TP
|
48
|
+
.BR \-c ", " \-\-conf-file=\fIfilename\fP
|
49
|
+
Set configuration file to \fIfilename\fP.
|
50
|
+
.TP
|
51
|
+
.BR \-s ", " \-\-stats-port=\fIport\fP
|
52
|
+
Set stats monitoring port to \fIport\fP.
|
53
|
+
(default: 22222)
|
54
|
+
.TP
|
55
|
+
.BR \-a ", " \-\-stats-addr=\fIaddress\fP
|
56
|
+
Set stats monitoring IP to \fIaddress\fP.
|
57
|
+
(default: 0.0.0.0)
|
58
|
+
.TP
|
59
|
+
.BR \-i ", " \-\-stats-interval=\fIinterval\fP
|
60
|
+
Set stats aggregation interval in msec to \fIinterval\fP.
|
61
|
+
(default: 30000 msec)
|
62
|
+
.TP
|
63
|
+
.BR \-m ", " \-\-mbuf-size=\fIsize\fP
|
64
|
+
Set size of mbuf chunk in bytes to \fIsize\fP. (default: 16384 bytes)
|
65
|
+
.TP
|
66
|
+
.BR \-d ", " \-\-daemonize
|
67
|
+
Run as a daemon.
|
68
|
+
.TP
|
69
|
+
.BR \-p ", " \-\-pid-file=\fIfilename\fP
|
70
|
+
Set pid file to \fIfilename\fP.
|
71
|
+
.SH SEE ALSO
|
72
|
+
.BR memcached (8),
|
73
|
+
.BR redis-server (1)
|
74
|
+
.br
|
75
|
+
.SH AUTHOR
|
76
|
+
nutcracker was written by Twitter, Inc.
|
@@ -1,22 +1,6 @@
|
|
1
1
|
- strace
|
2
2
|
strace -o strace.txt -ttT -s 1024 -p `pgrep nutcracker`
|
3
3
|
|
4
|
-
- epoll
|
5
|
-
|
6
|
-
EPOLLIN = 0x001,
|
7
|
-
EPOLLPRI = 0x002,
|
8
|
-
EPOLLOUT = 0x004,
|
9
|
-
EPOLLERR = 0x008,
|
10
|
-
EPOLLHUP = 0x010,
|
11
|
-
EPOLLRDNORM = 0x040,
|
12
|
-
EPOLLRDBAND = 0x080,
|
13
|
-
EPOLLWRNORM = 0x100,
|
14
|
-
EPOLLWRBAND = 0x200,
|
15
|
-
EPOLLMSG = 0x400,
|
16
|
-
EPOLLRDHUP = 0x2000,
|
17
|
-
EPOLLONESHOT = (1 << 30),
|
18
|
-
EPOLLET = (1 << 31)
|
19
|
-
|
20
4
|
- libyaml (yaml-0.1.4)
|
21
5
|
|
22
6
|
- yaml tokens:
|
@@ -94,3 +78,119 @@
|
|
94
78
|
http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_2.html
|
95
79
|
/usr/include/asm-generic/errno-base.h
|
96
80
|
/usr/include/asm-generic/errno.h
|
81
|
+
|
82
|
+
- epoll (linux)
|
83
|
+
|
84
|
+
union epoll_data {
|
85
|
+
void *ptr;
|
86
|
+
int fd;
|
87
|
+
uint32_t u32;
|
88
|
+
uint64_t u64;
|
89
|
+
};
|
90
|
+
|
91
|
+
struct epoll_event {
|
92
|
+
uint32_t events; /* epoll events */
|
93
|
+
struct epoll_data data; /* user data variable */
|
94
|
+
};
|
95
|
+
|
96
|
+
/* events */
|
97
|
+
EPOLLIN = 0x001,
|
98
|
+
EPOLLPRI = 0x002,
|
99
|
+
EPOLLOUT = 0x004,
|
100
|
+
EPOLLERR = 0x008,
|
101
|
+
EPOLLHUP = 0x010,
|
102
|
+
EPOLLRDNORM = 0x040,
|
103
|
+
EPOLLRDBAND = 0x080,
|
104
|
+
EPOLLWRNORM = 0x100,
|
105
|
+
EPOLLWRBAND = 0x200,
|
106
|
+
EPOLLMSG = 0x400,
|
107
|
+
EPOLLRDHUP = 0x2000,
|
108
|
+
EPOLLONESHOT = (1 << 30),
|
109
|
+
EPOLLET = (1 << 31)
|
110
|
+
|
111
|
+
/* opcodes */
|
112
|
+
EPOLL_CTL_ADD = 1 /* add a file decriptor to the interface */
|
113
|
+
EPOLL_CTL_DEL = 2 /* remove a file decriptor from the interface */
|
114
|
+
EPOLL_CTL_MOD = 3 /* change file decriptor epoll_event structure */
|
115
|
+
|
116
|
+
- kqueue (bsd)
|
117
|
+
|
118
|
+
struct kevent {
|
119
|
+
uintptr_t ident; /* identifier for this event */
|
120
|
+
int16_t filter; /* filter for event */
|
121
|
+
uint16_t flags; /* general flags */
|
122
|
+
uint32_t fflags; /* filter-specific flags */
|
123
|
+
intptr_t data; /* filter-specific data */
|
124
|
+
void *udata; /* opaque user data identifier */
|
125
|
+
};
|
126
|
+
|
127
|
+
/* flags / events */
|
128
|
+
EV_ADD = 0x0001 /* action - add event to kq (implies enable) */
|
129
|
+
EV_DELETE = 0x0002 /* action - delete event from kq */
|
130
|
+
EV_ENABLE = 0x0004 /* action - enable event */
|
131
|
+
EV_DISABLE = 0x0008 /* action - disable event (not reported) */
|
132
|
+
EV_RECEIPT = 0x0040 /* action - force EV_ERROR on success, data == 0 */
|
133
|
+
|
134
|
+
EV_ONESHOT = 0x0010 /* flags - only report one occurrence */
|
135
|
+
EV_CLEAR = 0x0020 /* flags - clear event state after reporting */
|
136
|
+
EV_DISPATCH = 0x0080 /* flags - disable event after reporting */
|
137
|
+
EV_SYSFLAGS = 0xF000 /* flags - reserved by system */
|
138
|
+
EV_FLAG0 = 0x1000 /* flags - filter-specific flag */
|
139
|
+
EV_FLAG1 = 0x2000 /* flags - filter-specific flag */
|
140
|
+
|
141
|
+
EV_EOF = 0x8000 /* returned values - EOF detected */
|
142
|
+
EV_ERROR = 0x4000 /* returned values - error, data contains errno */
|
143
|
+
|
144
|
+
/* filters */
|
145
|
+
EVFILT_READ (-1) /* readable */
|
146
|
+
EVFILT_WRITE (-2) /* writable */
|
147
|
+
EVFILT_AIO (-3) /* attached to aio requests */
|
148
|
+
EVFILT_VNODE (-4) /* attached to vnodes */
|
149
|
+
EVFILT_PROC (-5) /* attached to struct proc */
|
150
|
+
EVFILT_SIGNAL (-6) /* attached to struct proc */
|
151
|
+
EVFILT_TIMER (-7) /* timers */
|
152
|
+
EVFILT_MACHPORT (-8) /* mach portsets */
|
153
|
+
EVFILT_FS (-9) /* filesystem events */
|
154
|
+
EVFILT_USER (-10) /* user events */
|
155
|
+
EVFILT_VM (-12) /* virtual memory events */
|
156
|
+
|
157
|
+
EV_CLEAR behaves like EPOLLET because it resets the event after it is
|
158
|
+
returned; without this flag, the event would be repeatedly returned.
|
159
|
+
|
160
|
+
- poll (unix)
|
161
|
+
|
162
|
+
POLLIN 0x001 /* there is data to read */
|
163
|
+
POLLPRI 0x002 /* there is urgent data to read */
|
164
|
+
POLLOUT 0x004 /* writing now will not block */
|
165
|
+
|
166
|
+
POLLRDNORM 0x040 /* normal data may be read */
|
167
|
+
POLLRDBAND 0x080 /* priority data may be read */
|
168
|
+
POLLWRNORM 0x100 /* writing now will not block */
|
169
|
+
POLLWRBAND 0x200 /* priority data may be written */
|
170
|
+
|
171
|
+
POLLMSG 0x400
|
172
|
+
POLLREMOVE 0x1000
|
173
|
+
POLLRDHUP 0x2000
|
174
|
+
|
175
|
+
POLLERR 0x008 /* error condition */
|
176
|
+
POLLHUP 0x010 /* hung up */
|
177
|
+
POLLNVAL 0x020 /* invalid polling request */
|
178
|
+
|
179
|
+
- event ports (solaris)
|
180
|
+
|
181
|
+
typedef struct port_event {
|
182
|
+
int portev_events; /* event data is source specific */
|
183
|
+
ushort_t portev_source; /* event source */
|
184
|
+
ushort_t portev_pad; /* port internal use */
|
185
|
+
uintptr_t portev_object; /* source specific object */
|
186
|
+
void *portev_user; /* user cookie */
|
187
|
+
} port_event_t;
|
188
|
+
|
189
|
+
/* port sources */
|
190
|
+
PORT_SOURCE_AIO 1
|
191
|
+
PORT_SOURCE_TIMER 2
|
192
|
+
PORT_SOURCE_USER 3
|
193
|
+
PORT_SOURCE_FD 4
|
194
|
+
PORT_SOURCE_ALERT 5
|
195
|
+
PORT_SOURCE_MQ 6
|
196
|
+
PORT_SOURCE_FILE 7
|
Binary file
|