nutcracker 0.2.4.12 → 0.3.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|