Copy disabled (too large)
Download .txt
Showing preview only (16,383K chars total). Download the full file to get everything.
Repository: CodisLabs/codis
Branch: master
Commit: de1ad026e329
Files: 2968
Total size: 28.1 MB
Directory structure:
gitextract_xkncrmnj/
├── .gitignore
├── .travis.yml
├── Dockerfile
├── Godeps/
│ ├── Godeps.json
│ └── Readme
├── MIT-LICENSE.txt
├── Makefile
├── README.md
├── admin/
│ ├── codis-dashboard-admin.sh
│ ├── codis-fe-admin.sh
│ ├── codis-proxy-admin.sh
│ └── codis-server-admin.sh
├── ansible/
│ ├── group_vars/
│ │ └── all
│ ├── hosts
│ ├── roles/
│ │ ├── codis-dashboard/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── templates/
│ │ │ ├── codis-dashboard-admin.sh
│ │ │ └── dashboard.toml
│ │ ├── codis-fe/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── templates/
│ │ │ └── codis-fe-admin.sh
│ │ ├── codis-proxy/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── templates/
│ │ │ ├── codis-proxy-admin.sh
│ │ │ └── proxy.toml
│ │ ├── codis-server/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── templates/
│ │ │ ├── codis-server-admin.sh
│ │ │ └── redis.conf
│ │ ├── common/
│ │ │ └── tasks/
│ │ │ └── main.yml
│ │ └── redis-sentinel/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── templates/
│ │ ├── redis-sentinel-admin.sh
│ │ └── sentinel.conf
│ └── site.yml
├── cmd/
│ ├── admin/
│ │ ├── admin.go
│ │ ├── dashboard.go
│ │ ├── main.go
│ │ └── proxy.go
│ ├── dashboard/
│ │ └── main.go
│ ├── fe/
│ │ ├── assets/
│ │ │ ├── css/
│ │ │ │ └── main.css
│ │ │ ├── dashboard-fe.js
│ │ │ ├── index.html
│ │ │ └── package.json
│ │ └── main.go
│ ├── ha/
│ │ └── main.go
│ └── proxy/
│ └── main.go
├── config/
│ ├── dashboard.toml
│ ├── proxy.toml
│ ├── redis.conf
│ └── sentinel.conf
├── deploy/
│ ├── Makefile
│ ├── products/
│ │ ├── alpha/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── config.json
│ │ │ ├── gen.py
│ │ │ └── render.py
│ │ └── beta/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── config.json
│ │ ├── gen.py
│ │ └── render.py
│ ├── root/
│ │ └── opt/
│ │ └── codis/
│ │ └── etc/
│ │ ├── 10.2.16.200_19000/
│ │ │ ├── codis_proxy_19000.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.2.16.200_19002/
│ │ │ ├── codis_proxy_19002.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.2.16.201_19000/
│ │ │ ├── codis_proxy_19000.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.2.16.201_19002/
│ │ │ ├── codis_proxy_19002.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.2.16.202_19000/
│ │ │ ├── codis_proxy_19000.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.2.16.202_19002/
│ │ │ ├── codis_proxy_19002.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.4.10.100_18080/
│ │ │ ├── codis_dashboard_18080.service
│ │ │ ├── dashboard.toml
│ │ │ ├── dashboard_admin
│ │ │ ├── foreach_proxy
│ │ │ ├── foreach_proxy_online
│ │ │ └── foreach_proxy_reinit
│ │ ├── 10.4.10.200_19000/
│ │ │ ├── codis_proxy_19000.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.4.10.200_19002/
│ │ │ ├── codis_proxy_19002.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.4.10.201_19000/
│ │ │ ├── codis_proxy_19000.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 10.4.10.201_19002/
│ │ │ ├── codis_proxy_19002.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 127.0.0.1_18080/
│ │ │ ├── codis_dashboard_18080.service
│ │ │ ├── dashboard.toml
│ │ │ ├── dashboard_admin
│ │ │ ├── foreach_proxy
│ │ │ ├── foreach_proxy_online
│ │ │ └── foreach_proxy_reinit
│ │ ├── 127.0.0.1_19000/
│ │ │ ├── codis_proxy_19000.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ ├── 127.0.0.1_19001/
│ │ │ ├── codis_proxy_19001.service
│ │ │ ├── proxy.toml
│ │ │ └── proxy_admin
│ │ └── 127.0.0.1_19002/
│ │ ├── codis_proxy_19002.service
│ │ ├── proxy.toml
│ │ └── proxy_admin
│ └── templates/
│ ├── dashboard.service.template
│ ├── dashboard.toml.template
│ ├── proxy.service.template
│ └── proxy.toml.template
├── doc/
│ ├── FAQ_en.md
│ ├── FAQ_zh.md
│ ├── bench1/
│ │ ├── Makefile
│ │ ├── bench.plot
│ │ ├── input1
│ │ ├── input2
│ │ └── input3
│ ├── bench2/
│ │ ├── Makefile
│ │ ├── bench.plot
│ │ ├── input1
│ │ ├── input2
│ │ ├── input3
│ │ ├── input4
│ │ └── input5
│ ├── benchmark.md
│ ├── pictures/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ └── architecture.tex
│ ├── redis_change_zh.md
│ ├── tutorial_en.md
│ ├── tutorial_zh.md
│ └── unsupported_cmds.md
├── example/
│ ├── .gitignore
│ ├── Makefile
│ ├── dashboard.py
│ ├── fe.py
│ ├── proxy.py
│ ├── sentinel.py
│ ├── sentinel_notify.sh
│ ├── sentinel_reconfig.sh
│ ├── server.py
│ ├── setup.py
│ └── utils.py
├── extern/
│ ├── .gitignore
│ ├── README.md
│ ├── deprecated/
│ │ ├── redis-2.8.21/
│ │ │ ├── .gitignore
│ │ │ ├── 00-RELEASENOTES
│ │ │ ├── 0000-redis.patch
│ │ │ ├── 0001-slotsscan.patch
│ │ │ ├── 0002-rehash.patch
│ │ │ ├── BUGS
│ │ │ ├── CONTRIBUTING
│ │ │ ├── COPYING
│ │ │ ├── INSTALL
│ │ │ ├── MANIFESTO
│ │ │ ├── Makefile
│ │ │ ├── README
│ │ │ ├── deps/
│ │ │ │ ├── Makefile
│ │ │ │ ├── hiredis/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .travis.yml
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── COPYING
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── adapters/
│ │ │ │ │ │ ├── ae.h
│ │ │ │ │ │ ├── libev.h
│ │ │ │ │ │ ├── libevent.h
│ │ │ │ │ │ └── libuv.h
│ │ │ │ │ ├── async.c
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── dict.c
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── examples/
│ │ │ │ │ │ ├── example-ae.c
│ │ │ │ │ │ ├── example-libev.c
│ │ │ │ │ │ ├── example-libevent.c
│ │ │ │ │ │ ├── example-libuv.c
│ │ │ │ │ │ └── example.c
│ │ │ │ │ ├── fmacros.h
│ │ │ │ │ ├── hiredis.c
│ │ │ │ │ ├── hiredis.h
│ │ │ │ │ ├── net.c
│ │ │ │ │ ├── net.h
│ │ │ │ │ ├── sds.c
│ │ │ │ │ ├── sds.h
│ │ │ │ │ ├── test.c
│ │ │ │ │ └── zmalloc.h
│ │ │ │ ├── jemalloc/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── COPYING
│ │ │ │ │ ├── ChangeLog
│ │ │ │ │ ├── INSTALL
│ │ │ │ │ ├── Makefile.in
│ │ │ │ │ ├── README
│ │ │ │ │ ├── autogen.sh
│ │ │ │ │ ├── bin/
│ │ │ │ │ │ ├── jemalloc.sh.in
│ │ │ │ │ │ └── pprof
│ │ │ │ │ ├── config.guess
│ │ │ │ │ ├── config.stamp.in
│ │ │ │ │ ├── config.sub
│ │ │ │ │ ├── configure.ac
│ │ │ │ │ ├── coverage.sh
│ │ │ │ │ ├── doc/
│ │ │ │ │ │ ├── html.xsl.in
│ │ │ │ │ │ ├── jemalloc.xml.in
│ │ │ │ │ │ ├── manpages.xsl.in
│ │ │ │ │ │ └── stylesheet.xsl
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ │ ├── internal/
│ │ │ │ │ │ │ │ ├── arena.h
│ │ │ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ │ │ ├── base.h
│ │ │ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ │ │ ├── chunk.h
│ │ │ │ │ │ │ │ ├── chunk_dss.h
│ │ │ │ │ │ │ │ ├── chunk_mmap.h
│ │ │ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ │ │ ├── extent.h
│ │ │ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ │ │ ├── huge.h
│ │ │ │ │ │ │ │ ├── jemalloc_internal.h.in
│ │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ │ │ ├── mb.h
│ │ │ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ │ │ ├── private_symbols.txt
│ │ │ │ │ │ │ │ ├── private_unnamespace.sh
│ │ │ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ │ │ ├── prof.h
│ │ │ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ │ │ ├── quarantine.h
│ │ │ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ │ │ ├── tcache.h
│ │ │ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ │ │ └── util.h
│ │ │ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ │ │ └── jemalloc_rename.sh
│ │ │ │ │ │ └── msvc_compat/
│ │ │ │ │ │ ├── inttypes.h
│ │ │ │ │ │ ├── stdbool.h
│ │ │ │ │ │ ├── stdint.h
│ │ │ │ │ │ └── strings.h
│ │ │ │ │ ├── install-sh
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── arena.c
│ │ │ │ │ │ ├── atomic.c
│ │ │ │ │ │ ├── base.c
│ │ │ │ │ │ ├── bitmap.c
│ │ │ │ │ │ ├── chunk.c
│ │ │ │ │ │ ├── chunk_dss.c
│ │ │ │ │ │ ├── chunk_mmap.c
│ │ │ │ │ │ ├── ckh.c
│ │ │ │ │ │ ├── ctl.c
│ │ │ │ │ │ ├── extent.c
│ │ │ │ │ │ ├── hash.c
│ │ │ │ │ │ ├── huge.c
│ │ │ │ │ │ ├── jemalloc.c
│ │ │ │ │ │ ├── mb.c
│ │ │ │ │ │ ├── mutex.c
│ │ │ │ │ │ ├── prof.c
│ │ │ │ │ │ ├── quarantine.c
│ │ │ │ │ │ ├── rtree.c
│ │ │ │ │ │ ├── stats.c
│ │ │ │ │ │ ├── tcache.c
│ │ │ │ │ │ ├── tsd.c
│ │ │ │ │ │ ├── util.c
│ │ │ │ │ │ └── zone.c
│ │ │ │ │ └── test/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ ├── SFMT-alti.h
│ │ │ │ │ │ ├── SFMT-params.h
│ │ │ │ │ │ ├── SFMT-params11213.h
│ │ │ │ │ │ ├── SFMT-params1279.h
│ │ │ │ │ │ ├── SFMT-params132049.h
│ │ │ │ │ │ ├── SFMT-params19937.h
│ │ │ │ │ │ ├── SFMT-params216091.h
│ │ │ │ │ │ ├── SFMT-params2281.h
│ │ │ │ │ │ ├── SFMT-params4253.h
│ │ │ │ │ │ ├── SFMT-params44497.h
│ │ │ │ │ │ ├── SFMT-params607.h
│ │ │ │ │ │ ├── SFMT-params86243.h
│ │ │ │ │ │ ├── SFMT-sse2.h
│ │ │ │ │ │ ├── SFMT.h
│ │ │ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ │ │ ├── math.h
│ │ │ │ │ │ ├── mq.h
│ │ │ │ │ │ ├── mtx.h
│ │ │ │ │ │ ├── test.h
│ │ │ │ │ │ └── thd.h
│ │ │ │ │ ├── integration/
│ │ │ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ │ │ ├── aligned_alloc.c
│ │ │ │ │ │ ├── allocated.c
│ │ │ │ │ │ ├── allocm.c
│ │ │ │ │ │ ├── mallocx.c
│ │ │ │ │ │ ├── mremap.c
│ │ │ │ │ │ ├── posix_memalign.c
│ │ │ │ │ │ ├── rallocm.c
│ │ │ │ │ │ ├── rallocx.c
│ │ │ │ │ │ ├── thread_arena.c
│ │ │ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ │ │ └── xallocx.c
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── SFMT.c
│ │ │ │ │ │ ├── math.c
│ │ │ │ │ │ ├── mtx.c
│ │ │ │ │ │ ├── test.c
│ │ │ │ │ │ └── thd.c
│ │ │ │ │ ├── test.sh.in
│ │ │ │ │ └── unit/
│ │ │ │ │ ├── SFMT.c
│ │ │ │ │ ├── bitmap.c
│ │ │ │ │ ├── ckh.c
│ │ │ │ │ ├── hash.c
│ │ │ │ │ ├── junk.c
│ │ │ │ │ ├── mallctl.c
│ │ │ │ │ ├── math.c
│ │ │ │ │ ├── mq.c
│ │ │ │ │ ├── mtx.c
│ │ │ │ │ ├── prof_accum.c
│ │ │ │ │ ├── prof_accum.h
│ │ │ │ │ ├── prof_accum_a.c
│ │ │ │ │ ├── prof_accum_b.c
│ │ │ │ │ ├── prof_gdump.c
│ │ │ │ │ ├── prof_idump.c
│ │ │ │ │ ├── ql.c
│ │ │ │ │ ├── qr.c
│ │ │ │ │ ├── quarantine.c
│ │ │ │ │ ├── rb.c
│ │ │ │ │ ├── rtree.c
│ │ │ │ │ ├── stats.c
│ │ │ │ │ ├── tsd.c
│ │ │ │ │ ├── util.c
│ │ │ │ │ └── zero.c
│ │ │ │ ├── linenoise/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README.markdown
│ │ │ │ │ ├── example.c
│ │ │ │ │ ├── linenoise.c
│ │ │ │ │ └── linenoise.h
│ │ │ │ ├── lua/
│ │ │ │ │ ├── COPYRIGHT
│ │ │ │ │ ├── HISTORY
│ │ │ │ │ ├── INSTALL
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README
│ │ │ │ │ ├── doc/
│ │ │ │ │ │ ├── contents.html
│ │ │ │ │ │ ├── lua.1
│ │ │ │ │ │ ├── lua.css
│ │ │ │ │ │ ├── lua.html
│ │ │ │ │ │ ├── luac.1
│ │ │ │ │ │ ├── luac.html
│ │ │ │ │ │ ├── manual.css
│ │ │ │ │ │ ├── manual.html
│ │ │ │ │ │ └── readme.html
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── README
│ │ │ │ │ │ ├── all.c
│ │ │ │ │ │ ├── lua.hpp
│ │ │ │ │ │ ├── lua.pc
│ │ │ │ │ │ ├── luavs.bat
│ │ │ │ │ │ ├── min.c
│ │ │ │ │ │ ├── noparser.c
│ │ │ │ │ │ └── strict.lua
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── fpconv.c
│ │ │ │ │ │ ├── fpconv.h
│ │ │ │ │ │ ├── lapi.c
│ │ │ │ │ │ ├── lapi.h
│ │ │ │ │ │ ├── lauxlib.c
│ │ │ │ │ │ ├── lauxlib.h
│ │ │ │ │ │ ├── lbaselib.c
│ │ │ │ │ │ ├── lcode.c
│ │ │ │ │ │ ├── lcode.h
│ │ │ │ │ │ ├── ldblib.c
│ │ │ │ │ │ ├── ldebug.c
│ │ │ │ │ │ ├── ldebug.h
│ │ │ │ │ │ ├── ldo.c
│ │ │ │ │ │ ├── ldo.h
│ │ │ │ │ │ ├── ldump.c
│ │ │ │ │ │ ├── lfunc.c
│ │ │ │ │ │ ├── lfunc.h
│ │ │ │ │ │ ├── lgc.c
│ │ │ │ │ │ ├── lgc.h
│ │ │ │ │ │ ├── linit.c
│ │ │ │ │ │ ├── liolib.c
│ │ │ │ │ │ ├── llex.c
│ │ │ │ │ │ ├── llex.h
│ │ │ │ │ │ ├── llimits.h
│ │ │ │ │ │ ├── lmathlib.c
│ │ │ │ │ │ ├── lmem.c
│ │ │ │ │ │ ├── lmem.h
│ │ │ │ │ │ ├── loadlib.c
│ │ │ │ │ │ ├── lobject.c
│ │ │ │ │ │ ├── lobject.h
│ │ │ │ │ │ ├── lopcodes.c
│ │ │ │ │ │ ├── lopcodes.h
│ │ │ │ │ │ ├── loslib.c
│ │ │ │ │ │ ├── lparser.c
│ │ │ │ │ │ ├── lparser.h
│ │ │ │ │ │ ├── lstate.c
│ │ │ │ │ │ ├── lstate.h
│ │ │ │ │ │ ├── lstring.c
│ │ │ │ │ │ ├── lstring.h
│ │ │ │ │ │ ├── lstrlib.c
│ │ │ │ │ │ ├── ltable.c
│ │ │ │ │ │ ├── ltable.h
│ │ │ │ │ │ ├── ltablib.c
│ │ │ │ │ │ ├── ltm.c
│ │ │ │ │ │ ├── ltm.h
│ │ │ │ │ │ ├── lua.c
│ │ │ │ │ │ ├── lua.h
│ │ │ │ │ │ ├── lua_bit.c
│ │ │ │ │ │ ├── lua_cjson.c
│ │ │ │ │ │ ├── lua_cmsgpack.c
│ │ │ │ │ │ ├── lua_struct.c
│ │ │ │ │ │ ├── luac.c
│ │ │ │ │ │ ├── luaconf.h
│ │ │ │ │ │ ├── lualib.h
│ │ │ │ │ │ ├── lundump.c
│ │ │ │ │ │ ├── lundump.h
│ │ │ │ │ │ ├── lvm.c
│ │ │ │ │ │ ├── lvm.h
│ │ │ │ │ │ ├── lzio.c
│ │ │ │ │ │ ├── lzio.h
│ │ │ │ │ │ ├── print.c
│ │ │ │ │ │ ├── strbuf.c
│ │ │ │ │ │ └── strbuf.h
│ │ │ │ │ └── test/
│ │ │ │ │ ├── README
│ │ │ │ │ ├── bisect.lua
│ │ │ │ │ ├── cf.lua
│ │ │ │ │ ├── echo.lua
│ │ │ │ │ ├── env.lua
│ │ │ │ │ ├── factorial.lua
│ │ │ │ │ ├── fib.lua
│ │ │ │ │ ├── fibfor.lua
│ │ │ │ │ ├── globals.lua
│ │ │ │ │ ├── hello.lua
│ │ │ │ │ ├── life.lua
│ │ │ │ │ ├── luac.lua
│ │ │ │ │ ├── printf.lua
│ │ │ │ │ ├── readonly.lua
│ │ │ │ │ ├── sieve.lua
│ │ │ │ │ ├── sort.lua
│ │ │ │ │ ├── table.lua
│ │ │ │ │ ├── trace-calls.lua
│ │ │ │ │ ├── trace-globals.lua
│ │ │ │ │ └── xd.lua
│ │ │ │ └── update-jemalloc.sh
│ │ │ ├── redis.conf
│ │ │ ├── runtest
│ │ │ ├── runtest-sentinel
│ │ │ ├── sentinel.conf
│ │ │ ├── src/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.dep
│ │ │ │ ├── adlist.c
│ │ │ │ ├── adlist.h
│ │ │ │ ├── ae.c
│ │ │ │ ├── ae.h
│ │ │ │ ├── ae_epoll.c
│ │ │ │ ├── ae_evport.c
│ │ │ │ ├── ae_kqueue.c
│ │ │ │ ├── ae_select.c
│ │ │ │ ├── anet.c
│ │ │ │ ├── anet.h
│ │ │ │ ├── aof.c
│ │ │ │ ├── asciilogo.h
│ │ │ │ ├── bio.c
│ │ │ │ ├── bio.h
│ │ │ │ ├── bitops.c
│ │ │ │ ├── config.c
│ │ │ │ ├── config.h
│ │ │ │ ├── crc32.c
│ │ │ │ ├── crc64.c
│ │ │ │ ├── crc64.h
│ │ │ │ ├── db.c
│ │ │ │ ├── debug.c
│ │ │ │ ├── dict.c
│ │ │ │ ├── dict.h
│ │ │ │ ├── endianconv.c
│ │ │ │ ├── endianconv.h
│ │ │ │ ├── fmacros.h
│ │ │ │ ├── help.h
│ │ │ │ ├── hyperloglog.c
│ │ │ │ ├── intset.c
│ │ │ │ ├── intset.h
│ │ │ │ ├── latency.c
│ │ │ │ ├── latency.h
│ │ │ │ ├── lzf.h
│ │ │ │ ├── lzfP.h
│ │ │ │ ├── lzf_c.c
│ │ │ │ ├── lzf_d.c
│ │ │ │ ├── memtest.c
│ │ │ │ ├── migrate.c
│ │ │ │ ├── mkreleasehdr.sh
│ │ │ │ ├── multi.c
│ │ │ │ ├── networking.c
│ │ │ │ ├── notify.c
│ │ │ │ ├── object.c
│ │ │ │ ├── pqsort.c
│ │ │ │ ├── pqsort.h
│ │ │ │ ├── pubsub.c
│ │ │ │ ├── rand.c
│ │ │ │ ├── rand.h
│ │ │ │ ├── rdb.c
│ │ │ │ ├── rdb.h
│ │ │ │ ├── redis-benchmark.c
│ │ │ │ ├── redis-check-aof.c
│ │ │ │ ├── redis-check-dump.c
│ │ │ │ ├── redis-cli.c
│ │ │ │ ├── redis.c
│ │ │ │ ├── redis.h
│ │ │ │ ├── redisassert.h
│ │ │ │ ├── release.c
│ │ │ │ ├── replication.c
│ │ │ │ ├── rio.c
│ │ │ │ ├── rio.h
│ │ │ │ ├── scripting.c
│ │ │ │ ├── sds.c
│ │ │ │ ├── sds.h
│ │ │ │ ├── sentinel.c
│ │ │ │ ├── setproctitle.c
│ │ │ │ ├── sha1.c
│ │ │ │ ├── sha1.h
│ │ │ │ ├── slots.c
│ │ │ │ ├── slowlog.c
│ │ │ │ ├── slowlog.h
│ │ │ │ ├── solarisfixes.h
│ │ │ │ ├── sort.c
│ │ │ │ ├── sparkline.c
│ │ │ │ ├── sparkline.h
│ │ │ │ ├── syncio.c
│ │ │ │ ├── t_hash.c
│ │ │ │ ├── t_list.c
│ │ │ │ ├── t_set.c
│ │ │ │ ├── t_string.c
│ │ │ │ ├── t_zset.c
│ │ │ │ ├── testhelp.h
│ │ │ │ ├── util.c
│ │ │ │ ├── util.h
│ │ │ │ ├── valgrind.sup
│ │ │ │ ├── version.h
│ │ │ │ ├── ziplist.c
│ │ │ │ ├── ziplist.h
│ │ │ │ ├── zipmap.c
│ │ │ │ ├── zipmap.h
│ │ │ │ ├── zmalloc.c
│ │ │ │ └── zmalloc.h
│ │ │ ├── tests/
│ │ │ │ ├── assets/
│ │ │ │ │ └── default.conf
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── bg_complex_data.tcl
│ │ │ │ │ └── gen_write_load.tcl
│ │ │ │ ├── instances.tcl
│ │ │ │ ├── integration/
│ │ │ │ │ ├── aof-race.tcl
│ │ │ │ │ ├── aof.tcl
│ │ │ │ │ ├── convert-zipmap-hash-on-load.tcl
│ │ │ │ │ ├── rdb.tcl
│ │ │ │ │ ├── redis-cli.tcl
│ │ │ │ │ ├── replication-2.tcl
│ │ │ │ │ ├── replication-3.tcl
│ │ │ │ │ ├── replication-4.tcl
│ │ │ │ │ ├── replication-psync.tcl
│ │ │ │ │ └── replication.tcl
│ │ │ │ ├── sentinel/
│ │ │ │ │ ├── run.tcl
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ ├── 00-base.tcl
│ │ │ │ │ │ ├── 01-conf-update.tcl
│ │ │ │ │ │ ├── 02-slaves-reconf.tcl
│ │ │ │ │ │ ├── 03-runtime-reconf.tcl
│ │ │ │ │ │ ├── 04-slave-selection.tcl
│ │ │ │ │ │ ├── 05-manual.tcl
│ │ │ │ │ │ ├── 06-ckquorum.tcl
│ │ │ │ │ │ └── includes/
│ │ │ │ │ │ └── init-tests.tcl
│ │ │ │ │ └── tmp/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── support/
│ │ │ │ │ ├── redis.tcl
│ │ │ │ │ ├── server.tcl
│ │ │ │ │ ├── test.tcl
│ │ │ │ │ ├── tmpfile.tcl
│ │ │ │ │ └── util.tcl
│ │ │ │ ├── test_helper.tcl
│ │ │ │ └── unit/
│ │ │ │ ├── aofrw.tcl
│ │ │ │ ├── auth.tcl
│ │ │ │ ├── basic.tcl
│ │ │ │ ├── bitops.tcl
│ │ │ │ ├── dump.tcl
│ │ │ │ ├── expire.tcl
│ │ │ │ ├── hyperloglog.tcl
│ │ │ │ ├── introspection.tcl
│ │ │ │ ├── latency-monitor.tcl
│ │ │ │ ├── limits.tcl
│ │ │ │ ├── maxmemory.tcl
│ │ │ │ ├── memefficiency.tcl
│ │ │ │ ├── multi.tcl
│ │ │ │ ├── obuf-limits.tcl
│ │ │ │ ├── other.tcl
│ │ │ │ ├── printver.tcl
│ │ │ │ ├── protocol.tcl
│ │ │ │ ├── pubsub.tcl
│ │ │ │ ├── quit.tcl
│ │ │ │ ├── scan.tcl
│ │ │ │ ├── scripting.tcl
│ │ │ │ ├── slowlog.tcl
│ │ │ │ ├── sort.tcl
│ │ │ │ └── type/
│ │ │ │ ├── hash.tcl
│ │ │ │ ├── list-2.tcl
│ │ │ │ ├── list-3.tcl
│ │ │ │ ├── list-common.tcl
│ │ │ │ ├── list.tcl
│ │ │ │ ├── set.tcl
│ │ │ │ └── zset.tcl
│ │ │ └── utils/
│ │ │ ├── build-static-symbols.tcl
│ │ │ ├── generate-command-help.rb
│ │ │ ├── hyperloglog/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── hll-err.rb
│ │ │ │ └── hll-gnuplot-graph.rb
│ │ │ ├── install_server.sh
│ │ │ ├── mkrelease.sh
│ │ │ ├── redis-copy.rb
│ │ │ ├── redis-sha1.rb
│ │ │ ├── redis_init_script
│ │ │ ├── redis_init_script.tpl
│ │ │ ├── speed-regression.tcl
│ │ │ └── whatisdoing.sh
│ │ ├── redis-3.2.4/
│ │ │ ├── .gitignore
│ │ │ ├── 00-RELEASENOTES
│ │ │ ├── 0000-redis.patch
│ │ │ ├── 0001-slotsscan.patch
│ │ │ ├── 0002-rehash.patch
│ │ │ ├── BUGS
│ │ │ ├── CONTRIBUTING
│ │ │ ├── COPYING
│ │ │ ├── INSTALL
│ │ │ ├── MANIFESTO
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── deps/
│ │ │ │ ├── Makefile
│ │ │ │ ├── README.md
│ │ │ │ ├── geohash-int/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── geohash.c
│ │ │ │ │ ├── geohash.h
│ │ │ │ │ ├── geohash_helper.c
│ │ │ │ │ └── geohash_helper.h
│ │ │ │ ├── hiredis/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .travis.yml
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── COPYING
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── adapters/
│ │ │ │ │ │ ├── ae.h
│ │ │ │ │ │ ├── libev.h
│ │ │ │ │ │ ├── libevent.h
│ │ │ │ │ │ └── libuv.h
│ │ │ │ │ ├── async.c
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── dict.c
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── examples/
│ │ │ │ │ │ ├── example-ae.c
│ │ │ │ │ │ ├── example-libev.c
│ │ │ │ │ │ ├── example-libevent.c
│ │ │ │ │ │ ├── example-libuv.c
│ │ │ │ │ │ └── example.c
│ │ │ │ │ ├── fmacros.h
│ │ │ │ │ ├── hiredis.c
│ │ │ │ │ ├── hiredis.h
│ │ │ │ │ ├── net.c
│ │ │ │ │ ├── net.h
│ │ │ │ │ ├── sds.c
│ │ │ │ │ ├── sds.h
│ │ │ │ │ ├── sdsalloc.h
│ │ │ │ │ ├── test.c
│ │ │ │ │ └── zmalloc.h
│ │ │ │ ├── jemalloc/
│ │ │ │ │ ├── .autom4te.cfg
│ │ │ │ │ ├── .gitattributes
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── COPYING
│ │ │ │ │ ├── ChangeLog
│ │ │ │ │ ├── INSTALL
│ │ │ │ │ ├── Makefile.in
│ │ │ │ │ ├── README
│ │ │ │ │ ├── autogen.sh
│ │ │ │ │ ├── bin/
│ │ │ │ │ │ ├── jemalloc-config.in
│ │ │ │ │ │ ├── jemalloc.sh.in
│ │ │ │ │ │ └── jeprof.in
│ │ │ │ │ ├── build-aux/
│ │ │ │ │ │ ├── config.guess
│ │ │ │ │ │ ├── config.sub
│ │ │ │ │ │ └── install-sh
│ │ │ │ │ ├── config.stamp.in
│ │ │ │ │ ├── configure.ac
│ │ │ │ │ ├── coverage.sh
│ │ │ │ │ ├── doc/
│ │ │ │ │ │ ├── html.xsl.in
│ │ │ │ │ │ ├── jemalloc.xml.in
│ │ │ │ │ │ ├── manpages.xsl.in
│ │ │ │ │ │ └── stylesheet.xsl
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ │ ├── internal/
│ │ │ │ │ │ │ │ ├── arena.h
│ │ │ │ │ │ │ │ ├── assert.h
│ │ │ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ │ │ ├── base.h
│ │ │ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ │ │ ├── chunk.h
│ │ │ │ │ │ │ │ ├── chunk_dss.h
│ │ │ │ │ │ │ │ ├── chunk_mmap.h
│ │ │ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ │ │ ├── extent.h
│ │ │ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ │ │ ├── huge.h
│ │ │ │ │ │ │ │ ├── jemalloc_internal.h.in
│ │ │ │ │ │ │ │ ├── jemalloc_internal_decls.h
│ │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ │ │ ├── mb.h
│ │ │ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ │ │ ├── nstime.h
│ │ │ │ │ │ │ │ ├── pages.h
│ │ │ │ │ │ │ │ ├── ph.h
│ │ │ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ │ │ ├── private_symbols.txt
│ │ │ │ │ │ │ │ ├── private_unnamespace.sh
│ │ │ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ │ │ ├── prof.h
│ │ │ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ │ │ ├── quarantine.h
│ │ │ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ │ │ ├── smoothstep.h
│ │ │ │ │ │ │ │ ├── smoothstep.sh
│ │ │ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ │ │ ├── tcache.h
│ │ │ │ │ │ │ │ ├── ticker.h
│ │ │ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ │ │ ├── util.h
│ │ │ │ │ │ │ │ ├── valgrind.h
│ │ │ │ │ │ │ │ └── witness.h
│ │ │ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ │ │ ├── jemalloc_rename.sh
│ │ │ │ │ │ │ └── jemalloc_typedefs.h.in
│ │ │ │ │ │ └── msvc_compat/
│ │ │ │ │ │ ├── C99/
│ │ │ │ │ │ │ ├── stdbool.h
│ │ │ │ │ │ │ └── stdint.h
│ │ │ │ │ │ ├── strings.h
│ │ │ │ │ │ └── windows_extra.h
│ │ │ │ │ ├── jemalloc.pc.in
│ │ │ │ │ ├── msvc/
│ │ │ │ │ │ ├── ReadMe.txt
│ │ │ │ │ │ ├── jemalloc_vc2015.sln
│ │ │ │ │ │ └── projects/
│ │ │ │ │ │ └── vc2015/
│ │ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ │ ├── jemalloc.vcxproj
│ │ │ │ │ │ │ └── jemalloc.vcxproj.filters
│ │ │ │ │ │ └── test_threads/
│ │ │ │ │ │ ├── test_threads.cpp
│ │ │ │ │ │ ├── test_threads.h
│ │ │ │ │ │ ├── test_threads.vcxproj
│ │ │ │ │ │ ├── test_threads.vcxproj.filters
│ │ │ │ │ │ └── test_threads_main.cpp
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── arena.c
│ │ │ │ │ │ ├── atomic.c
│ │ │ │ │ │ ├── base.c
│ │ │ │ │ │ ├── bitmap.c
│ │ │ │ │ │ ├── chunk.c
│ │ │ │ │ │ ├── chunk_dss.c
│ │ │ │ │ │ ├── chunk_mmap.c
│ │ │ │ │ │ ├── ckh.c
│ │ │ │ │ │ ├── ctl.c
│ │ │ │ │ │ ├── extent.c
│ │ │ │ │ │ ├── hash.c
│ │ │ │ │ │ ├── huge.c
│ │ │ │ │ │ ├── jemalloc.c
│ │ │ │ │ │ ├── mb.c
│ │ │ │ │ │ ├── mutex.c
│ │ │ │ │ │ ├── nstime.c
│ │ │ │ │ │ ├── pages.c
│ │ │ │ │ │ ├── prng.c
│ │ │ │ │ │ ├── prof.c
│ │ │ │ │ │ ├── quarantine.c
│ │ │ │ │ │ ├── rtree.c
│ │ │ │ │ │ ├── stats.c
│ │ │ │ │ │ ├── tcache.c
│ │ │ │ │ │ ├── ticker.c
│ │ │ │ │ │ ├── tsd.c
│ │ │ │ │ │ ├── util.c
│ │ │ │ │ │ ├── valgrind.c
│ │ │ │ │ │ ├── witness.c
│ │ │ │ │ │ └── zone.c
│ │ │ │ │ └── test/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ ├── SFMT-alti.h
│ │ │ │ │ │ ├── SFMT-params.h
│ │ │ │ │ │ ├── SFMT-params11213.h
│ │ │ │ │ │ ├── SFMT-params1279.h
│ │ │ │ │ │ ├── SFMT-params132049.h
│ │ │ │ │ │ ├── SFMT-params19937.h
│ │ │ │ │ │ ├── SFMT-params216091.h
│ │ │ │ │ │ ├── SFMT-params2281.h
│ │ │ │ │ │ ├── SFMT-params4253.h
│ │ │ │ │ │ ├── SFMT-params44497.h
│ │ │ │ │ │ ├── SFMT-params607.h
│ │ │ │ │ │ ├── SFMT-params86243.h
│ │ │ │ │ │ ├── SFMT-sse2.h
│ │ │ │ │ │ ├── SFMT.h
│ │ │ │ │ │ ├── btalloc.h
│ │ │ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ │ │ ├── math.h
│ │ │ │ │ │ ├── mq.h
│ │ │ │ │ │ ├── mtx.h
│ │ │ │ │ │ ├── test.h
│ │ │ │ │ │ ├── thd.h
│ │ │ │ │ │ └── timer.h
│ │ │ │ │ ├── integration/
│ │ │ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ │ │ ├── aligned_alloc.c
│ │ │ │ │ │ ├── allocated.c
│ │ │ │ │ │ ├── chunk.c
│ │ │ │ │ │ ├── mallocx.c
│ │ │ │ │ │ ├── overflow.c
│ │ │ │ │ │ ├── posix_memalign.c
│ │ │ │ │ │ ├── rallocx.c
│ │ │ │ │ │ ├── sdallocx.c
│ │ │ │ │ │ ├── thread_arena.c
│ │ │ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ │ │ └── xallocx.c
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── SFMT.c
│ │ │ │ │ │ ├── btalloc.c
│ │ │ │ │ │ ├── btalloc_0.c
│ │ │ │ │ │ ├── btalloc_1.c
│ │ │ │ │ │ ├── math.c
│ │ │ │ │ │ ├── mq.c
│ │ │ │ │ │ ├── mtx.c
│ │ │ │ │ │ ├── test.c
│ │ │ │ │ │ ├── thd.c
│ │ │ │ │ │ └── timer.c
│ │ │ │ │ ├── stress/
│ │ │ │ │ │ └── microbench.c
│ │ │ │ │ ├── test.sh.in
│ │ │ │ │ └── unit/
│ │ │ │ │ ├── SFMT.c
│ │ │ │ │ ├── a0.c
│ │ │ │ │ ├── arena_reset.c
│ │ │ │ │ ├── atomic.c
│ │ │ │ │ ├── bitmap.c
│ │ │ │ │ ├── ckh.c
│ │ │ │ │ ├── decay.c
│ │ │ │ │ ├── fork.c
│ │ │ │ │ ├── hash.c
│ │ │ │ │ ├── junk.c
│ │ │ │ │ ├── junk_alloc.c
│ │ │ │ │ ├── junk_free.c
│ │ │ │ │ ├── lg_chunk.c
│ │ │ │ │ ├── mallctl.c
│ │ │ │ │ ├── math.c
│ │ │ │ │ ├── mq.c
│ │ │ │ │ ├── mtx.c
│ │ │ │ │ ├── nstime.c
│ │ │ │ │ ├── ph.c
│ │ │ │ │ ├── prng.c
│ │ │ │ │ ├── prof_accum.c
│ │ │ │ │ ├── prof_active.c
│ │ │ │ │ ├── prof_gdump.c
│ │ │ │ │ ├── prof_idump.c
│ │ │ │ │ ├── prof_reset.c
│ │ │ │ │ ├── prof_thread_name.c
│ │ │ │ │ ├── ql.c
│ │ │ │ │ ├── qr.c
│ │ │ │ │ ├── quarantine.c
│ │ │ │ │ ├── rb.c
│ │ │ │ │ ├── rtree.c
│ │ │ │ │ ├── run_quantize.c
│ │ │ │ │ ├── size_classes.c
│ │ │ │ │ ├── smoothstep.c
│ │ │ │ │ ├── stats.c
│ │ │ │ │ ├── ticker.c
│ │ │ │ │ ├── tsd.c
│ │ │ │ │ ├── util.c
│ │ │ │ │ ├── witness.c
│ │ │ │ │ └── zero.c
│ │ │ │ ├── linenoise/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README.markdown
│ │ │ │ │ ├── example.c
│ │ │ │ │ ├── linenoise.c
│ │ │ │ │ └── linenoise.h
│ │ │ │ ├── lua/
│ │ │ │ │ ├── COPYRIGHT
│ │ │ │ │ ├── HISTORY
│ │ │ │ │ ├── INSTALL
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README
│ │ │ │ │ ├── doc/
│ │ │ │ │ │ ├── contents.html
│ │ │ │ │ │ ├── lua.1
│ │ │ │ │ │ ├── lua.css
│ │ │ │ │ │ ├── lua.html
│ │ │ │ │ │ ├── luac.1
│ │ │ │ │ │ ├── luac.html
│ │ │ │ │ │ ├── manual.css
│ │ │ │ │ │ ├── manual.html
│ │ │ │ │ │ └── readme.html
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── README
│ │ │ │ │ │ ├── all.c
│ │ │ │ │ │ ├── lua.hpp
│ │ │ │ │ │ ├── lua.pc
│ │ │ │ │ │ ├── luavs.bat
│ │ │ │ │ │ ├── min.c
│ │ │ │ │ │ ├── noparser.c
│ │ │ │ │ │ └── strict.lua
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── fpconv.c
│ │ │ │ │ │ ├── fpconv.h
│ │ │ │ │ │ ├── lapi.c
│ │ │ │ │ │ ├── lapi.h
│ │ │ │ │ │ ├── lauxlib.c
│ │ │ │ │ │ ├── lauxlib.h
│ │ │ │ │ │ ├── lbaselib.c
│ │ │ │ │ │ ├── lcode.c
│ │ │ │ │ │ ├── lcode.h
│ │ │ │ │ │ ├── ldblib.c
│ │ │ │ │ │ ├── ldebug.c
│ │ │ │ │ │ ├── ldebug.h
│ │ │ │ │ │ ├── ldo.c
│ │ │ │ │ │ ├── ldo.h
│ │ │ │ │ │ ├── ldump.c
│ │ │ │ │ │ ├── lfunc.c
│ │ │ │ │ │ ├── lfunc.h
│ │ │ │ │ │ ├── lgc.c
│ │ │ │ │ │ ├── lgc.h
│ │ │ │ │ │ ├── linit.c
│ │ │ │ │ │ ├── liolib.c
│ │ │ │ │ │ ├── llex.c
│ │ │ │ │ │ ├── llex.h
│ │ │ │ │ │ ├── llimits.h
│ │ │ │ │ │ ├── lmathlib.c
│ │ │ │ │ │ ├── lmem.c
│ │ │ │ │ │ ├── lmem.h
│ │ │ │ │ │ ├── loadlib.c
│ │ │ │ │ │ ├── lobject.c
│ │ │ │ │ │ ├── lobject.h
│ │ │ │ │ │ ├── lopcodes.c
│ │ │ │ │ │ ├── lopcodes.h
│ │ │ │ │ │ ├── loslib.c
│ │ │ │ │ │ ├── lparser.c
│ │ │ │ │ │ ├── lparser.h
│ │ │ │ │ │ ├── lstate.c
│ │ │ │ │ │ ├── lstate.h
│ │ │ │ │ │ ├── lstring.c
│ │ │ │ │ │ ├── lstring.h
│ │ │ │ │ │ ├── lstrlib.c
│ │ │ │ │ │ ├── ltable.c
│ │ │ │ │ │ ├── ltable.h
│ │ │ │ │ │ ├── ltablib.c
│ │ │ │ │ │ ├── ltm.c
│ │ │ │ │ │ ├── ltm.h
│ │ │ │ │ │ ├── lua.c
│ │ │ │ │ │ ├── lua.h
│ │ │ │ │ │ ├── lua_bit.c
│ │ │ │ │ │ ├── lua_cjson.c
│ │ │ │ │ │ ├── lua_cmsgpack.c
│ │ │ │ │ │ ├── lua_struct.c
│ │ │ │ │ │ ├── luac.c
│ │ │ │ │ │ ├── luaconf.h
│ │ │ │ │ │ ├── lualib.h
│ │ │ │ │ │ ├── lundump.c
│ │ │ │ │ │ ├── lundump.h
│ │ │ │ │ │ ├── lvm.c
│ │ │ │ │ │ ├── lvm.h
│ │ │ │ │ │ ├── lzio.c
│ │ │ │ │ │ ├── lzio.h
│ │ │ │ │ │ ├── print.c
│ │ │ │ │ │ ├── strbuf.c
│ │ │ │ │ │ └── strbuf.h
│ │ │ │ │ └── test/
│ │ │ │ │ ├── README
│ │ │ │ │ ├── bisect.lua
│ │ │ │ │ ├── cf.lua
│ │ │ │ │ ├── echo.lua
│ │ │ │ │ ├── env.lua
│ │ │ │ │ ├── factorial.lua
│ │ │ │ │ ├── fib.lua
│ │ │ │ │ ├── fibfor.lua
│ │ │ │ │ ├── globals.lua
│ │ │ │ │ ├── hello.lua
│ │ │ │ │ ├── life.lua
│ │ │ │ │ ├── luac.lua
│ │ │ │ │ ├── printf.lua
│ │ │ │ │ ├── readonly.lua
│ │ │ │ │ ├── sieve.lua
│ │ │ │ │ ├── sort.lua
│ │ │ │ │ ├── table.lua
│ │ │ │ │ ├── trace-calls.lua
│ │ │ │ │ ├── trace-globals.lua
│ │ │ │ │ └── xd.lua
│ │ │ │ └── update-jemalloc.sh
│ │ │ ├── redis.conf
│ │ │ ├── runtest
│ │ │ ├── runtest-cluster
│ │ │ ├── runtest-sentinel
│ │ │ ├── sentinel.conf
│ │ │ ├── src/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.dep
│ │ │ │ ├── adlist.c
│ │ │ │ ├── adlist.h
│ │ │ │ ├── ae.c
│ │ │ │ ├── ae.h
│ │ │ │ ├── ae_epoll.c
│ │ │ │ ├── ae_evport.c
│ │ │ │ ├── ae_kqueue.c
│ │ │ │ ├── ae_select.c
│ │ │ │ ├── anet.c
│ │ │ │ ├── anet.h
│ │ │ │ ├── aof.c
│ │ │ │ ├── asciilogo.h
│ │ │ │ ├── bio.c
│ │ │ │ ├── bio.h
│ │ │ │ ├── bitops.c
│ │ │ │ ├── blocked.c
│ │ │ │ ├── cluster.c
│ │ │ │ ├── cluster.h
│ │ │ │ ├── config.c
│ │ │ │ ├── config.h
│ │ │ │ ├── crc16.c
│ │ │ │ ├── crc32.c
│ │ │ │ ├── crc64.c
│ │ │ │ ├── crc64.h
│ │ │ │ ├── db.c
│ │ │ │ ├── debug.c
│ │ │ │ ├── debugmacro.h
│ │ │ │ ├── dict.c
│ │ │ │ ├── dict.h
│ │ │ │ ├── endianconv.c
│ │ │ │ ├── endianconv.h
│ │ │ │ ├── fmacros.h
│ │ │ │ ├── geo.c
│ │ │ │ ├── geo.h
│ │ │ │ ├── help.h
│ │ │ │ ├── hyperloglog.c
│ │ │ │ ├── intset.c
│ │ │ │ ├── intset.h
│ │ │ │ ├── latency.c
│ │ │ │ ├── latency.h
│ │ │ │ ├── lzf.h
│ │ │ │ ├── lzfP.h
│ │ │ │ ├── lzf_c.c
│ │ │ │ ├── lzf_d.c
│ │ │ │ ├── memtest.c
│ │ │ │ ├── mkreleasehdr.sh
│ │ │ │ ├── multi.c
│ │ │ │ ├── networking.c
│ │ │ │ ├── notify.c
│ │ │ │ ├── object.c
│ │ │ │ ├── pqsort.c
│ │ │ │ ├── pqsort.h
│ │ │ │ ├── pubsub.c
│ │ │ │ ├── quicklist.c
│ │ │ │ ├── quicklist.h
│ │ │ │ ├── rand.c
│ │ │ │ ├── rand.h
│ │ │ │ ├── rdb.c
│ │ │ │ ├── rdb.h
│ │ │ │ ├── redis-benchmark.c
│ │ │ │ ├── redis-check-aof.c
│ │ │ │ ├── redis-check-rdb.c
│ │ │ │ ├── redis-cli.c
│ │ │ │ ├── redis-trib.rb
│ │ │ │ ├── redisassert.h
│ │ │ │ ├── release.c
│ │ │ │ ├── replication.c
│ │ │ │ ├── rio.c
│ │ │ │ ├── rio.h
│ │ │ │ ├── scripting.c
│ │ │ │ ├── sds.c
│ │ │ │ ├── sds.h
│ │ │ │ ├── sdsalloc.h
│ │ │ │ ├── sentinel.c
│ │ │ │ ├── server.c
│ │ │ │ ├── server.h
│ │ │ │ ├── setproctitle.c
│ │ │ │ ├── sha1.c
│ │ │ │ ├── sha1.h
│ │ │ │ ├── slots.c
│ │ │ │ ├── slowlog.c
│ │ │ │ ├── slowlog.h
│ │ │ │ ├── solarisfixes.h
│ │ │ │ ├── sort.c
│ │ │ │ ├── sparkline.c
│ │ │ │ ├── sparkline.h
│ │ │ │ ├── syncio.c
│ │ │ │ ├── t_hash.c
│ │ │ │ ├── t_list.c
│ │ │ │ ├── t_set.c
│ │ │ │ ├── t_string.c
│ │ │ │ ├── t_zset.c
│ │ │ │ ├── testhelp.h
│ │ │ │ ├── util.c
│ │ │ │ ├── util.h
│ │ │ │ ├── valgrind.sup
│ │ │ │ ├── version.h
│ │ │ │ ├── ziplist.c
│ │ │ │ ├── ziplist.h
│ │ │ │ ├── zipmap.c
│ │ │ │ ├── zipmap.h
│ │ │ │ ├── zmalloc.c
│ │ │ │ └── zmalloc.h
│ │ │ ├── tests/
│ │ │ │ ├── assets/
│ │ │ │ │ └── default.conf
│ │ │ │ ├── cluster/
│ │ │ │ │ ├── cluster.tcl
│ │ │ │ │ ├── run.tcl
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ ├── 00-base.tcl
│ │ │ │ │ │ ├── 01-faildet.tcl
│ │ │ │ │ │ ├── 02-failover.tcl
│ │ │ │ │ │ ├── 03-failover-loop.tcl
│ │ │ │ │ │ ├── 04-resharding.tcl
│ │ │ │ │ │ ├── 05-slave-selection.tcl
│ │ │ │ │ │ ├── 06-slave-stop-cond.tcl
│ │ │ │ │ │ ├── 07-replica-migration.tcl
│ │ │ │ │ │ ├── 08-update-msg.tcl
│ │ │ │ │ │ ├── 09-pubsub.tcl
│ │ │ │ │ │ ├── 10-manual-failover.tcl
│ │ │ │ │ │ ├── 11-manual-takeover.tcl
│ │ │ │ │ │ ├── 12-replica-migration-2.tcl
│ │ │ │ │ │ ├── helpers/
│ │ │ │ │ │ │ └── onlydots.tcl
│ │ │ │ │ │ └── includes/
│ │ │ │ │ │ └── init-tests.tcl
│ │ │ │ │ └── tmp/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── bg_complex_data.tcl
│ │ │ │ │ └── gen_write_load.tcl
│ │ │ │ ├── instances.tcl
│ │ │ │ ├── integration/
│ │ │ │ │ ├── aof-race.tcl
│ │ │ │ │ ├── aof.tcl
│ │ │ │ │ ├── convert-zipmap-hash-on-load.tcl
│ │ │ │ │ ├── logging.tcl
│ │ │ │ │ ├── rdb.tcl
│ │ │ │ │ ├── redis-cli.tcl
│ │ │ │ │ ├── replication-2.tcl
│ │ │ │ │ ├── replication-3.tcl
│ │ │ │ │ ├── replication-4.tcl
│ │ │ │ │ ├── replication-psync.tcl
│ │ │ │ │ └── replication.tcl
│ │ │ │ ├── sentinel/
│ │ │ │ │ ├── run.tcl
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ ├── 00-base.tcl
│ │ │ │ │ │ ├── 01-conf-update.tcl
│ │ │ │ │ │ ├── 02-slaves-reconf.tcl
│ │ │ │ │ │ ├── 03-runtime-reconf.tcl
│ │ │ │ │ │ ├── 04-slave-selection.tcl
│ │ │ │ │ │ ├── 05-manual.tcl
│ │ │ │ │ │ ├── 06-ckquorum.tcl
│ │ │ │ │ │ ├── 07-down-conditions.tcl
│ │ │ │ │ │ └── includes/
│ │ │ │ │ │ └── init-tests.tcl
│ │ │ │ │ └── tmp/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── support/
│ │ │ │ │ ├── cluster.tcl
│ │ │ │ │ ├── redis.tcl
│ │ │ │ │ ├── server.tcl
│ │ │ │ │ ├── test.tcl
│ │ │ │ │ ├── tmpfile.tcl
│ │ │ │ │ └── util.tcl
│ │ │ │ ├── test_helper.tcl
│ │ │ │ └── unit/
│ │ │ │ ├── aofrw.tcl
│ │ │ │ ├── auth.tcl
│ │ │ │ ├── bitfield.tcl
│ │ │ │ ├── bitops.tcl
│ │ │ │ ├── dump.tcl
│ │ │ │ ├── expire.tcl
│ │ │ │ ├── geo.tcl
│ │ │ │ ├── hyperloglog.tcl
│ │ │ │ ├── introspection-2.tcl
│ │ │ │ ├── introspection.tcl
│ │ │ │ ├── keyspace.tcl
│ │ │ │ ├── latency-monitor.tcl
│ │ │ │ ├── limits.tcl
│ │ │ │ ├── maxmemory.tcl
│ │ │ │ ├── memefficiency.tcl
│ │ │ │ ├── multi.tcl
│ │ │ │ ├── obuf-limits.tcl
│ │ │ │ ├── other.tcl
│ │ │ │ ├── printver.tcl
│ │ │ │ ├── protocol.tcl
│ │ │ │ ├── pubsub.tcl
│ │ │ │ ├── quit.tcl
│ │ │ │ ├── scan.tcl
│ │ │ │ ├── scripting.tcl
│ │ │ │ ├── slowlog.tcl
│ │ │ │ ├── sort.tcl
│ │ │ │ └── type/
│ │ │ │ ├── hash.tcl
│ │ │ │ ├── incr.tcl
│ │ │ │ ├── list-2.tcl
│ │ │ │ ├── list-3.tcl
│ │ │ │ ├── list-common.tcl
│ │ │ │ ├── list.tcl
│ │ │ │ ├── set.tcl
│ │ │ │ ├── string.tcl
│ │ │ │ └── zset.tcl
│ │ │ └── utils/
│ │ │ ├── build-static-symbols.tcl
│ │ │ ├── cluster_fail_time.tcl
│ │ │ ├── corrupt_rdb.c
│ │ │ ├── create-cluster/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README
│ │ │ │ └── create-cluster
│ │ │ ├── generate-command-help.rb
│ │ │ ├── hashtable/
│ │ │ │ ├── README
│ │ │ │ └── rehashing.c
│ │ │ ├── hyperloglog/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── hll-err.rb
│ │ │ │ └── hll-gnuplot-graph.rb
│ │ │ ├── install_server.sh
│ │ │ ├── lru/
│ │ │ │ ├── README
│ │ │ │ └── test-lru.rb
│ │ │ ├── redis-copy.rb
│ │ │ ├── redis-sha1.rb
│ │ │ ├── redis_init_script
│ │ │ ├── redis_init_script.tpl
│ │ │ ├── releasetools/
│ │ │ │ ├── 01_create_tarball.sh
│ │ │ │ ├── 02_upload_tarball.sh
│ │ │ │ ├── 03_test_release.sh
│ │ │ │ └── 04_release_hash.sh
│ │ │ ├── speed-regression.tcl
│ │ │ └── whatisdoing.sh
│ │ ├── redis-3.2.8/
│ │ │ ├── .gitignore
│ │ │ ├── 00-RELEASENOTES
│ │ │ ├── BUGS
│ │ │ ├── CONTRIBUTING
│ │ │ ├── COPYING
│ │ │ ├── INSTALL
│ │ │ ├── MANIFESTO
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── deps/
│ │ │ │ ├── Makefile
│ │ │ │ ├── README.md
│ │ │ │ ├── geohash-int/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── geohash.c
│ │ │ │ │ ├── geohash.h
│ │ │ │ │ ├── geohash_helper.c
│ │ │ │ │ └── geohash_helper.h
│ │ │ │ ├── hiredis/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .travis.yml
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── COPYING
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── adapters/
│ │ │ │ │ │ ├── ae.h
│ │ │ │ │ │ ├── libev.h
│ │ │ │ │ │ ├── libevent.h
│ │ │ │ │ │ └── libuv.h
│ │ │ │ │ ├── async.c
│ │ │ │ │ ├── async.h
│ │ │ │ │ ├── dict.c
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── examples/
│ │ │ │ │ │ ├── example-ae.c
│ │ │ │ │ │ ├── example-libev.c
│ │ │ │ │ │ ├── example-libevent.c
│ │ │ │ │ │ ├── example-libuv.c
│ │ │ │ │ │ └── example.c
│ │ │ │ │ ├── fmacros.h
│ │ │ │ │ ├── hiredis.c
│ │ │ │ │ ├── hiredis.h
│ │ │ │ │ ├── net.c
│ │ │ │ │ ├── net.h
│ │ │ │ │ ├── sds.c
│ │ │ │ │ ├── sds.h
│ │ │ │ │ ├── sdsalloc.h
│ │ │ │ │ ├── test.c
│ │ │ │ │ └── zmalloc.h
│ │ │ │ ├── jemalloc/
│ │ │ │ │ ├── .autom4te.cfg
│ │ │ │ │ ├── .gitattributes
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── COPYING
│ │ │ │ │ ├── ChangeLog
│ │ │ │ │ ├── INSTALL
│ │ │ │ │ ├── Makefile.in
│ │ │ │ │ ├── README
│ │ │ │ │ ├── VERSION
│ │ │ │ │ ├── autogen.sh
│ │ │ │ │ ├── bin/
│ │ │ │ │ │ ├── jemalloc-config.in
│ │ │ │ │ │ ├── jemalloc.sh.in
│ │ │ │ │ │ └── jeprof.in
│ │ │ │ │ ├── config.guess
│ │ │ │ │ ├── config.stamp.in
│ │ │ │ │ ├── config.sub
│ │ │ │ │ ├── configure
│ │ │ │ │ ├── configure.ac
│ │ │ │ │ ├── coverage.sh
│ │ │ │ │ ├── doc/
│ │ │ │ │ │ ├── html.xsl.in
│ │ │ │ │ │ ├── jemalloc.xml.in
│ │ │ │ │ │ ├── manpages.xsl.in
│ │ │ │ │ │ └── stylesheet.xsl
│ │ │ │ │ ├── include/
│ │ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ │ ├── internal/
│ │ │ │ │ │ │ │ ├── arena.h
│ │ │ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ │ │ ├── base.h
│ │ │ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ │ │ ├── chunk.h
│ │ │ │ │ │ │ │ ├── chunk_dss.h
│ │ │ │ │ │ │ │ ├── chunk_mmap.h
│ │ │ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ │ │ ├── extent.h
│ │ │ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ │ │ ├── huge.h
│ │ │ │ │ │ │ │ ├── jemalloc_internal.h.in
│ │ │ │ │ │ │ │ ├── jemalloc_internal_decls.h
│ │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ │ │ ├── mb.h
│ │ │ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ │ │ ├── pages.h
│ │ │ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ │ │ ├── private_symbols.txt
│ │ │ │ │ │ │ │ ├── private_unnamespace.sh
│ │ │ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ │ │ ├── prof.h
│ │ │ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ │ │ ├── quarantine.h
│ │ │ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ │ │ ├── tcache.h
│ │ │ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ │ │ ├── util.h
│ │ │ │ │ │ │ │ └── valgrind.h
│ │ │ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ │ │ ├── jemalloc_rename.sh
│ │ │ │ │ │ │ └── jemalloc_typedefs.h.in
│ │ │ │ │ │ └── msvc_compat/
│ │ │ │ │ │ ├── C99/
│ │ │ │ │ │ │ ├── stdbool.h
│ │ │ │ │ │ │ └── stdint.h
│ │ │ │ │ │ ├── strings.h
│ │ │ │ │ │ └── windows_extra.h
│ │ │ │ │ ├── install-sh
│ │ │ │ │ ├── jemalloc.pc.in
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── arena.c
│ │ │ │ │ │ ├── atomic.c
│ │ │ │ │ │ ├── base.c
│ │ │ │ │ │ ├── bitmap.c
│ │ │ │ │ │ ├── chunk.c
│ │ │ │ │ │ ├── chunk_dss.c
│ │ │ │ │ │ ├── chunk_mmap.c
│ │ │ │ │ │ ├── ckh.c
│ │ │ │ │ │ ├── ctl.c
│ │ │ │ │ │ ├── extent.c
│ │ │ │ │ │ ├── hash.c
│ │ │ │ │ │ ├── huge.c
│ │ │ │ │ │ ├── jemalloc.c
│ │ │ │ │ │ ├── mb.c
│ │ │ │ │ │ ├── mutex.c
│ │ │ │ │ │ ├── pages.c
│ │ │ │ │ │ ├── prof.c
│ │ │ │ │ │ ├── quarantine.c
│ │ │ │ │ │ ├── rtree.c
│ │ │ │ │ │ ├── stats.c
│ │ │ │ │ │ ├── tcache.c
│ │ │ │ │ │ ├── tsd.c
│ │ │ │ │ │ ├── util.c
│ │ │ │ │ │ ├── valgrind.c
│ │ │ │ │ │ └── zone.c
│ │ │ │ │ └── test/
│ │ │ │ │ ├── include/
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ ├── SFMT-alti.h
│ │ │ │ │ │ ├── SFMT-params.h
│ │ │ │ │ │ ├── SFMT-params11213.h
│ │ │ │ │ │ ├── SFMT-params1279.h
│ │ │ │ │ │ ├── SFMT-params132049.h
│ │ │ │ │ │ ├── SFMT-params19937.h
│ │ │ │ │ │ ├── SFMT-params216091.h
│ │ │ │ │ │ ├── SFMT-params2281.h
│ │ │ │ │ │ ├── SFMT-params4253.h
│ │ │ │ │ │ ├── SFMT-params44497.h
│ │ │ │ │ │ ├── SFMT-params607.h
│ │ │ │ │ │ ├── SFMT-params86243.h
│ │ │ │ │ │ ├── SFMT-sse2.h
│ │ │ │ │ │ ├── SFMT.h
│ │ │ │ │ │ ├── btalloc.h
│ │ │ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ │ │ ├── math.h
│ │ │ │ │ │ ├── mq.h
│ │ │ │ │ │ ├── mtx.h
│ │ │ │ │ │ ├── test.h
│ │ │ │ │ │ ├── thd.h
│ │ │ │ │ │ └── timer.h
│ │ │ │ │ ├── integration/
│ │ │ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ │ │ ├── aligned_alloc.c
│ │ │ │ │ │ ├── allocated.c
│ │ │ │ │ │ ├── chunk.c
│ │ │ │ │ │ ├── mallocx.c
│ │ │ │ │ │ ├── overflow.c
│ │ │ │ │ │ ├── posix_memalign.c
│ │ │ │ │ │ ├── rallocx.c
│ │ │ │ │ │ ├── sdallocx.c
│ │ │ │ │ │ ├── thread_arena.c
│ │ │ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ │ │ └── xallocx.c
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── SFMT.c
│ │ │ │ │ │ ├── btalloc.c
│ │ │ │ │ │ ├── btalloc_0.c
│ │ │ │ │ │ ├── btalloc_1.c
│ │ │ │ │ │ ├── math.c
│ │ │ │ │ │ ├── mq.c
│ │ │ │ │ │ ├── mtx.c
│ │ │ │ │ │ ├── test.c
│ │ │ │ │ │ ├── thd.c
│ │ │ │ │ │ └── timer.c
│ │ │ │ │ ├── stress/
│ │ │ │ │ │ └── microbench.c
│ │ │ │ │ ├── test.sh.in
│ │ │ │ │ └── unit/
│ │ │ │ │ ├── SFMT.c
│ │ │ │ │ ├── atomic.c
│ │ │ │ │ ├── bitmap.c
│ │ │ │ │ ├── ckh.c
│ │ │ │ │ ├── hash.c
│ │ │ │ │ ├── junk.c
│ │ │ │ │ ├── junk_alloc.c
│ │ │ │ │ ├── junk_free.c
│ │ │ │ │ ├── lg_chunk.c
│ │ │ │ │ ├── mallctl.c
│ │ │ │ │ ├── math.c
│ │ │ │ │ ├── mq.c
│ │ │ │ │ ├── mtx.c
│ │ │ │ │ ├── prof_accum.c
│ │ │ │ │ ├── prof_active.c
│ │ │ │ │ ├── prof_gdump.c
│ │ │ │ │ ├── prof_idump.c
│ │ │ │ │ ├── prof_reset.c
│ │ │ │ │ ├── prof_thread_name.c
│ │ │ │ │ ├── ql.c
│ │ │ │ │ ├── qr.c
│ │ │ │ │ ├── quarantine.c
│ │ │ │ │ ├── rb.c
│ │ │ │ │ ├── rtree.c
│ │ │ │ │ ├── size_classes.c
│ │ │ │ │ ├── stats.c
│ │ │ │ │ ├── tsd.c
│ │ │ │ │ ├── util.c
│ │ │ │ │ └── zero.c
│ │ │ │ ├── linenoise/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README.markdown
│ │ │ │ │ ├── example.c
│ │ │ │ │ ├── linenoise.c
│ │ │ │ │ └── linenoise.h
│ │ │ │ ├── lua/
│ │ │ │ │ ├── COPYRIGHT
│ │ │ │ │ ├── HISTORY
│ │ │ │ │ ├── INSTALL
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── README
│ │ │ │ │ ├── doc/
│ │ │ │ │ │ ├── contents.html
│ │ │ │ │ │ ├── lua.1
│ │ │ │ │ │ ├── lua.css
│ │ │ │ │ │ ├── lua.html
│ │ │ │ │ │ ├── luac.1
│ │ │ │ │ │ ├── luac.html
│ │ │ │ │ │ ├── manual.css
│ │ │ │ │ │ ├── manual.html
│ │ │ │ │ │ └── readme.html
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── README
│ │ │ │ │ │ ├── all.c
│ │ │ │ │ │ ├── lua.hpp
│ │ │ │ │ │ ├── lua.pc
│ │ │ │ │ │ ├── luavs.bat
│ │ │ │ │ │ ├── min.c
│ │ │ │ │ │ ├── noparser.c
│ │ │ │ │ │ └── strict.lua
│ │ │ │ │ ├── src/
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── fpconv.c
│ │ │ │ │ │ ├── fpconv.h
│ │ │ │ │ │ ├── lapi.c
│ │ │ │ │ │ ├── lapi.h
│ │ │ │ │ │ ├── lauxlib.c
│ │ │ │ │ │ ├── lauxlib.h
│ │ │ │ │ │ ├── lbaselib.c
│ │ │ │ │ │ ├── lcode.c
│ │ │ │ │ │ ├── lcode.h
│ │ │ │ │ │ ├── ldblib.c
│ │ │ │ │ │ ├── ldebug.c
│ │ │ │ │ │ ├── ldebug.h
│ │ │ │ │ │ ├── ldo.c
│ │ │ │ │ │ ├── ldo.h
│ │ │ │ │ │ ├── ldump.c
│ │ │ │ │ │ ├── lfunc.c
│ │ │ │ │ │ ├── lfunc.h
│ │ │ │ │ │ ├── lgc.c
│ │ │ │ │ │ ├── lgc.h
│ │ │ │ │ │ ├── linit.c
│ │ │ │ │ │ ├── liolib.c
│ │ │ │ │ │ ├── llex.c
│ │ │ │ │ │ ├── llex.h
│ │ │ │ │ │ ├── llimits.h
│ │ │ │ │ │ ├── lmathlib.c
│ │ │ │ │ │ ├── lmem.c
│ │ │ │ │ │ ├── lmem.h
│ │ │ │ │ │ ├── loadlib.c
│ │ │ │ │ │ ├── lobject.c
│ │ │ │ │ │ ├── lobject.h
│ │ │ │ │ │ ├── lopcodes.c
│ │ │ │ │ │ ├── lopcodes.h
│ │ │ │ │ │ ├── loslib.c
│ │ │ │ │ │ ├── lparser.c
│ │ │ │ │ │ ├── lparser.h
│ │ │ │ │ │ ├── lstate.c
│ │ │ │ │ │ ├── lstate.h
│ │ │ │ │ │ ├── lstring.c
│ │ │ │ │ │ ├── lstring.h
│ │ │ │ │ │ ├── lstrlib.c
│ │ │ │ │ │ ├── ltable.c
│ │ │ │ │ │ ├── ltable.h
│ │ │ │ │ │ ├── ltablib.c
│ │ │ │ │ │ ├── ltm.c
│ │ │ │ │ │ ├── ltm.h
│ │ │ │ │ │ ├── lua.c
│ │ │ │ │ │ ├── lua.h
│ │ │ │ │ │ ├── lua_bit.c
│ │ │ │ │ │ ├── lua_cjson.c
│ │ │ │ │ │ ├── lua_cmsgpack.c
│ │ │ │ │ │ ├── lua_struct.c
│ │ │ │ │ │ ├── luac.c
│ │ │ │ │ │ ├── luaconf.h
│ │ │ │ │ │ ├── lualib.h
│ │ │ │ │ │ ├── lundump.c
│ │ │ │ │ │ ├── lundump.h
│ │ │ │ │ │ ├── lvm.c
│ │ │ │ │ │ ├── lvm.h
│ │ │ │ │ │ ├── lzio.c
│ │ │ │ │ │ ├── lzio.h
│ │ │ │ │ │ ├── print.c
│ │ │ │ │ │ ├── strbuf.c
│ │ │ │ │ │ └── strbuf.h
│ │ │ │ │ └── test/
│ │ │ │ │ ├── README
│ │ │ │ │ ├── bisect.lua
│ │ │ │ │ ├── cf.lua
│ │ │ │ │ ├── echo.lua
│ │ │ │ │ ├── env.lua
│ │ │ │ │ ├── factorial.lua
│ │ │ │ │ ├── fib.lua
│ │ │ │ │ ├── fibfor.lua
│ │ │ │ │ ├── globals.lua
│ │ │ │ │ ├── hello.lua
│ │ │ │ │ ├── life.lua
│ │ │ │ │ ├── luac.lua
│ │ │ │ │ ├── printf.lua
│ │ │ │ │ ├── readonly.lua
│ │ │ │ │ ├── sieve.lua
│ │ │ │ │ ├── sort.lua
│ │ │ │ │ ├── table.lua
│ │ │ │ │ ├── trace-calls.lua
│ │ │ │ │ ├── trace-globals.lua
│ │ │ │ │ └── xd.lua
│ │ │ │ └── update-jemalloc.sh
│ │ │ ├── patch/
│ │ │ │ ├── Makefile
│ │ │ │ ├── codis/
│ │ │ │ │ ├── 0000-redis.patch
│ │ │ │ │ ├── 0001-slotsscan.patch
│ │ │ │ │ ├── 0002-rehash.patch
│ │ │ │ │ ├── 0003-slots_async1.patch
│ │ │ │ │ ├── 0004-slots_async2.patch
│ │ │ │ │ ├── 0005-slots_async3_lazyfree.patch
│ │ │ │ │ ├── 0006-slots_async4_bugfix_1184.patch
│ │ │ │ │ ├── 0007-slots_async5_cleanup.patch
│ │ │ │ │ └── 0008-slots_async6_select.patch
│ │ │ │ ├── redis/
│ │ │ │ │ ├── 0001-Don-t-leak-file-descriptor-on-syncWithMaster.patch
│ │ │ │ │ ├── 0002-fix-2883-2857-pipe-fds-leak-when-fork-failed-on-bg-a.patch
│ │ │ │ │ ├── 0003-Implement-getKeys-procedure-for-georadius-and-georad.patch
│ │ │ │ │ ├── 0004-Test-fix-hopefully-false-PSYNC-failure-like-in-issue.patch
│ │ │ │ │ ├── 0005-update-block-free-after-some-diff-data-are-written-t.patch
│ │ │ │ │ ├── 0006-Fix-3848-by-closing-the-descriptor-on-error.patch
│ │ │ │ │ ├── 0007-Set-lua-time-limit-default-value-at-safe-place.patch
│ │ │ │ │ ├── 0008-Fix-zmalloc_get_memory_size-ifdefs-to-actually-use-t.patch
│ │ │ │ │ ├── 0009-Fix-preprocessor-if-else-chain-broken-in-order-to-fi.patch
│ │ │ │ │ ├── 0010-redis-cli-bigkeys-show-error-when-TYPE-fails.patch
│ │ │ │ │ ├── 0011-Redis-3.2.9.patch
│ │ │ │ │ ├── 0012-fix-Update-create-cluster-README.patch
│ │ │ │ │ ├── 0013-cli-Only-print-elapsed-time-on-OUTPUT_STANDARD.patch
│ │ │ │ │ ├── 0014-Fixed-comments-of-slowlog-duration.patch
│ │ │ │ │ ├── 0015-fix-server.stat_net_output_bytes-calc-bug.patch
│ │ │ │ │ ├── 0016-Fix-set-with-ex-px-option-when-propagated-to-aof.patch
│ │ │ │ │ ├── 0017-redis-benchmark-add-t-hset-target.patch
│ │ │ │ │ ├── 0018-Optimize-set-command-with-ex-px-when-updating-aof.patch
│ │ │ │ │ └── 0019-Aesthetic-changes-to-4068-PR-to-conform-to-Redis-cod.patch
│ │ │ │ └── run.sh
│ │ │ ├── redis.conf
│ │ │ ├── runtest
│ │ │ ├── runtest-cluster
│ │ │ ├── runtest-sentinel
│ │ │ ├── sentinel.conf
│ │ │ ├── src/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── Makefile.dep
│ │ │ │ ├── adlist.c
│ │ │ │ ├── adlist.h
│ │ │ │ ├── ae.c
│ │ │ │ ├── ae.h
│ │ │ │ ├── ae_epoll.c
│ │ │ │ ├── ae_evport.c
│ │ │ │ ├── ae_kqueue.c
│ │ │ │ ├── ae_select.c
│ │ │ │ ├── anet.c
│ │ │ │ ├── anet.h
│ │ │ │ ├── aof.c
│ │ │ │ ├── asciilogo.h
│ │ │ │ ├── bio.c
│ │ │ │ ├── bio.h
│ │ │ │ ├── bitops.c
│ │ │ │ ├── blocked.c
│ │ │ │ ├── cluster.c
│ │ │ │ ├── cluster.h
│ │ │ │ ├── config.c
│ │ │ │ ├── config.h
│ │ │ │ ├── crc16.c
│ │ │ │ ├── crc32.c
│ │ │ │ ├── crc64.c
│ │ │ │ ├── crc64.h
│ │ │ │ ├── db.c
│ │ │ │ ├── debug.c
│ │ │ │ ├── debugmacro.h
│ │ │ │ ├── dict.c
│ │ │ │ ├── dict.h
│ │ │ │ ├── endianconv.c
│ │ │ │ ├── endianconv.h
│ │ │ │ ├── fmacros.h
│ │ │ │ ├── geo.c
│ │ │ │ ├── geo.h
│ │ │ │ ├── help.h
│ │ │ │ ├── hyperloglog.c
│ │ │ │ ├── intset.c
│ │ │ │ ├── intset.h
│ │ │ │ ├── latency.c
│ │ │ │ ├── latency.h
│ │ │ │ ├── lzf.h
│ │ │ │ ├── lzfP.h
│ │ │ │ ├── lzf_c.c
│ │ │ │ ├── lzf_d.c
│ │ │ │ ├── memtest.c
│ │ │ │ ├── mkreleasehdr.sh
│ │ │ │ ├── multi.c
│ │ │ │ ├── networking.c
│ │ │ │ ├── notify.c
│ │ │ │ ├── object.c
│ │ │ │ ├── pqsort.c
│ │ │ │ ├── pqsort.h
│ │ │ │ ├── pubsub.c
│ │ │ │ ├── quicklist.c
│ │ │ │ ├── quicklist.h
│ │ │ │ ├── rand.c
│ │ │ │ ├── rand.h
│ │ │ │ ├── rdb.c
│ │ │ │ ├── rdb.h
│ │ │ │ ├── redis-benchmark.c
│ │ │ │ ├── redis-check-aof.c
│ │ │ │ ├── redis-check-rdb.c
│ │ │ │ ├── redis-cli.c
│ │ │ │ ├── redis-trib.rb
│ │ │ │ ├── redisassert.h
│ │ │ │ ├── release.c
│ │ │ │ ├── replication.c
│ │ │ │ ├── rio.c
│ │ │ │ ├── rio.h
│ │ │ │ ├── scripting.c
│ │ │ │ ├── sds.c
│ │ │ │ ├── sds.h
│ │ │ │ ├── sdsalloc.h
│ │ │ │ ├── sentinel.c
│ │ │ │ ├── server.c
│ │ │ │ ├── server.h
│ │ │ │ ├── setproctitle.c
│ │ │ │ ├── sha1.c
│ │ │ │ ├── sha1.h
│ │ │ │ ├── slots.c
│ │ │ │ ├── slots_async.c
│ │ │ │ ├── slowlog.c
│ │ │ │ ├── slowlog.h
│ │ │ │ ├── solarisfixes.h
│ │ │ │ ├── sort.c
│ │ │ │ ├── sparkline.c
│ │ │ │ ├── sparkline.h
│ │ │ │ ├── syncio.c
│ │ │ │ ├── t_hash.c
│ │ │ │ ├── t_list.c
│ │ │ │ ├── t_set.c
│ │ │ │ ├── t_string.c
│ │ │ │ ├── t_zset.c
│ │ │ │ ├── testhelp.h
│ │ │ │ ├── util.c
│ │ │ │ ├── util.h
│ │ │ │ ├── valgrind.sup
│ │ │ │ ├── version.h
│ │ │ │ ├── ziplist.c
│ │ │ │ ├── ziplist.h
│ │ │ │ ├── zipmap.c
│ │ │ │ ├── zipmap.h
│ │ │ │ ├── zmalloc.c
│ │ │ │ └── zmalloc.h
│ │ │ ├── tests/
│ │ │ │ ├── assets/
│ │ │ │ │ └── default.conf
│ │ │ │ ├── cluster/
│ │ │ │ │ ├── cluster.tcl
│ │ │ │ │ ├── run.tcl
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ ├── 00-base.tcl
│ │ │ │ │ │ ├── 01-faildet.tcl
│ │ │ │ │ │ ├── 02-failover.tcl
│ │ │ │ │ │ ├── 03-failover-loop.tcl
│ │ │ │ │ │ ├── 04-resharding.tcl
│ │ │ │ │ │ ├── 05-slave-selection.tcl
│ │ │ │ │ │ ├── 06-slave-stop-cond.tcl
│ │ │ │ │ │ ├── 07-replica-migration.tcl
│ │ │ │ │ │ ├── 08-update-msg.tcl
│ │ │ │ │ │ ├── 09-pubsub.tcl
│ │ │ │ │ │ ├── 10-manual-failover.tcl
│ │ │ │ │ │ ├── 11-manual-takeover.tcl
│ │ │ │ │ │ ├── 12-replica-migration-2.tcl
│ │ │ │ │ │ ├── helpers/
│ │ │ │ │ │ │ └── onlydots.tcl
│ │ │ │ │ │ └── includes/
│ │ │ │ │ │ └── init-tests.tcl
│ │ │ │ │ └── tmp/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── bg_complex_data.tcl
│ │ │ │ │ └── gen_write_load.tcl
│ │ │ │ ├── instances.tcl
│ │ │ │ ├── integration/
│ │ │ │ │ ├── aof-race.tcl
│ │ │ │ │ ├── aof.tcl
│ │ │ │ │ ├── convert-zipmap-hash-on-load.tcl
│ │ │ │ │ ├── logging.tcl
│ │ │ │ │ ├── rdb.tcl
│ │ │ │ │ ├── redis-cli.tcl
│ │ │ │ │ ├── replication-2.tcl
│ │ │ │ │ ├── replication-3.tcl
│ │ │ │ │ ├── replication-4.tcl
│ │ │ │ │ ├── replication-psync.tcl
│ │ │ │ │ └── replication.tcl
│ │ │ │ ├── sentinel/
│ │ │ │ │ ├── run.tcl
│ │ │ │ │ ├── tests/
│ │ │ │ │ │ ├── 00-base.tcl
│ │ │ │ │ │ ├── 01-conf-update.tcl
│ │ │ │ │ │ ├── 02-slaves-reconf.tcl
│ │ │ │ │ │ ├── 03-runtime-reconf.tcl
│ │ │ │ │ │ ├── 04-slave-selection.tcl
│ │ │ │ │ │ ├── 05-manual.tcl
│ │ │ │ │ │ ├── 06-ckquorum.tcl
│ │ │ │ │ │ ├── 07-down-conditions.tcl
│ │ │ │ │ │ └── includes/
│ │ │ │ │ │ └── init-tests.tcl
│ │ │ │ │ └── tmp/
│ │ │ │ │ └── .gitignore
│ │ │ │ ├── support/
│ │ │ │ │ ├── cluster.tcl
│ │ │ │ │ ├── redis.tcl
│ │ │ │ │ ├── server.tcl
│ │ │ │ │ ├── test.tcl
│ │ │ │ │ ├── tmpfile.tcl
│ │ │ │ │ └── util.tcl
│ │ │ │ ├── test_helper.tcl
│ │ │ │ └── unit/
│ │ │ │ ├── aofrw.tcl
│ │ │ │ ├── auth.tcl
│ │ │ │ ├── bitfield.tcl
│ │ │ │ ├── bitops.tcl
│ │ │ │ ├── dump.tcl
│ │ │ │ ├── expire.tcl
│ │ │ │ ├── geo.tcl
│ │ │ │ ├── hyperloglog.tcl
│ │ │ │ ├── introspection-2.tcl
│ │ │ │ ├── introspection.tcl
│ │ │ │ ├── keyspace.tcl
│ │ │ │ ├── latency-monitor.tcl
│ │ │ │ ├── limits.tcl
│ │ │ │ ├── maxmemory.tcl
│ │ │ │ ├── memefficiency.tcl
│ │ │ │ ├── multi.tcl
│ │ │ │ ├── obuf-limits.tcl
│ │ │ │ ├── other.tcl
│ │ │ │ ├── printver.tcl
│ │ │ │ ├── protocol.tcl
│ │ │ │ ├── pubsub.tcl
│ │ │ │ ├── quit.tcl
│ │ │ │ ├── scan.tcl
│ │ │ │ ├── scripting.tcl
│ │ │ │ ├── slowlog.tcl
│ │ │ │ ├── sort.tcl
│ │ │ │ └── type/
│ │ │ │ ├── hash.tcl
│ │ │ │ ├── incr.tcl
│ │ │ │ ├── list-2.tcl
│ │ │ │ ├── list-3.tcl
│ │ │ │ ├── list-common.tcl
│ │ │ │ ├── list.tcl
│ │ │ │ ├── set.tcl
│ │ │ │ ├── string.tcl
│ │ │ │ └── zset.tcl
│ │ │ └── utils/
│ │ │ ├── build-static-symbols.tcl
│ │ │ ├── cluster_fail_time.tcl
│ │ │ ├── corrupt_rdb.c
│ │ │ ├── create-cluster/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── README
│ │ │ │ └── create-cluster
│ │ │ ├── generate-command-help.rb
│ │ │ ├── hashtable/
│ │ │ │ ├── README
│ │ │ │ └── rehashing.c
│ │ │ ├── hyperloglog/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── hll-err.rb
│ │ │ │ └── hll-gnuplot-graph.rb
│ │ │ ├── install_server.sh
│ │ │ ├── lru/
│ │ │ │ ├── README
│ │ │ │ └── test-lru.rb
│ │ │ ├── redis-copy.rb
│ │ │ ├── redis-sha1.rb
│ │ │ ├── redis_init_script
│ │ │ ├── redis_init_script.tpl
│ │ │ ├── releasetools/
│ │ │ │ ├── 01_create_tarball.sh
│ │ │ │ ├── 02_upload_tarball.sh
│ │ │ │ ├── 03_test_release.sh
│ │ │ │ └── 04_release_hash.sh
│ │ │ ├── speed-regression.tcl
│ │ │ └── whatisdoing.sh
│ │ ├── redis-test/
│ │ │ ├── .gitignore
│ │ │ ├── basic_hash.go
│ │ │ ├── basic_incr.go
│ │ │ ├── basic_mgrt.go
│ │ │ ├── bench/
│ │ │ │ ├── Makefile
│ │ │ │ └── benchmark.go
│ │ │ ├── conf/
│ │ │ │ ├── 6379.conf
│ │ │ │ ├── 6380.conf
│ │ │ │ ├── 6479.conf
│ │ │ │ └── 6480.conf
│ │ │ ├── extra_del.go
│ │ │ ├── extra_incr.go
│ │ │ ├── extra_memleak.go
│ │ │ ├── extra_mget.go
│ │ │ ├── run_test.sh
│ │ │ ├── tcl/
│ │ │ │ ├── runtest
│ │ │ │ └── tests/
│ │ │ │ ├── assets/
│ │ │ │ │ └── default.conf
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── bg_complex_data.tcl
│ │ │ │ │ └── gen_write_load.tcl
│ │ │ │ ├── instances.tcl
│ │ │ │ ├── support/
│ │ │ │ │ ├── redis.tcl
│ │ │ │ │ ├── server.tcl
│ │ │ │ │ ├── test.tcl
│ │ │ │ │ ├── tmpfile.tcl
│ │ │ │ │ └── util.tcl
│ │ │ │ ├── test_helper.tcl
│ │ │ │ └── unit/
│ │ │ │ ├── aofrw.tcl
│ │ │ │ ├── basic.tcl
│ │ │ │ ├── bitops.tcl
│ │ │ │ ├── dump.tcl
│ │ │ │ ├── expire.tcl
│ │ │ │ ├── hyperloglog.tcl
│ │ │ │ ├── latency-monitor.tcl
│ │ │ │ ├── memefficiency.tcl
│ │ │ │ ├── other.tcl
│ │ │ │ ├── protocol.tcl
│ │ │ │ ├── scripting.tcl
│ │ │ │ └── type/
│ │ │ │ ├── hash.tcl
│ │ │ │ ├── list-2.tcl
│ │ │ │ ├── list-3.tcl
│ │ │ │ ├── list-common.tcl
│ │ │ │ ├── list.tcl
│ │ │ │ ├── set.tcl
│ │ │ │ └── zset.tcl
│ │ │ ├── test_hset.go
│ │ │ ├── test_incr1.go
│ │ │ ├── test_incr2.go
│ │ │ ├── test_list.go
│ │ │ ├── test_mget.go
│ │ │ ├── test_mset.go
│ │ │ ├── test_pttl.go
│ │ │ ├── test_string.go
│ │ │ └── utils.go
│ │ └── scala-client/
│ │ ├── project/
│ │ │ ├── Build.scala
│ │ │ ├── build.properties
│ │ │ └── plugins.sbt
│ │ └── src/
│ │ ├── main/
│ │ │ └── scala/
│ │ │ ├── codis/
│ │ │ │ ├── CodisClient.scala
│ │ │ │ └── CodisLogSource.scala
│ │ │ └── redis/
│ │ │ └── DynamicRedisClientPool.scala
│ │ └── test/
│ │ └── scala/
│ │ ├── codis/
│ │ │ └── CodisClientSpec.scala
│ │ └── redis/
│ │ └── DynamicRedisClientPoolSpec.scala
│ └── redis-3.2.11/
│ ├── .gitignore
│ ├── 00-RELEASENOTES
│ ├── BUGS
│ ├── CONTRIBUTING
│ ├── COPYING
│ ├── INSTALL
│ ├── MANIFESTO
│ ├── Makefile
│ ├── README.md
│ ├── deps/
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── geohash-int/
│ │ │ ├── Makefile
│ │ │ ├── geohash.c
│ │ │ ├── geohash.h
│ │ │ ├── geohash_helper.c
│ │ │ └── geohash_helper.h
│ │ ├── hiredis/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── COPYING
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── adapters/
│ │ │ │ ├── ae.h
│ │ │ │ ├── libev.h
│ │ │ │ ├── libevent.h
│ │ │ │ └── libuv.h
│ │ │ ├── async.c
│ │ │ ├── async.h
│ │ │ ├── dict.c
│ │ │ ├── dict.h
│ │ │ ├── examples/
│ │ │ │ ├── example-ae.c
│ │ │ │ ├── example-libev.c
│ │ │ │ ├── example-libevent.c
│ │ │ │ ├── example-libuv.c
│ │ │ │ └── example.c
│ │ │ ├── fmacros.h
│ │ │ ├── hiredis.c
│ │ │ ├── hiredis.h
│ │ │ ├── net.c
│ │ │ ├── net.h
│ │ │ ├── sds.c
│ │ │ ├── sds.h
│ │ │ ├── sdsalloc.h
│ │ │ ├── test.c
│ │ │ └── zmalloc.h
│ │ ├── jemalloc/
│ │ │ ├── .autom4te.cfg
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── COPYING
│ │ │ ├── ChangeLog
│ │ │ ├── INSTALL
│ │ │ ├── Makefile.in
│ │ │ ├── README
│ │ │ ├── VERSION
│ │ │ ├── autogen.sh
│ │ │ ├── bin/
│ │ │ │ ├── jemalloc-config.in
│ │ │ │ ├── jemalloc.sh.in
│ │ │ │ └── jeprof.in
│ │ │ ├── config.guess
│ │ │ ├── config.stamp.in
│ │ │ ├── config.sub
│ │ │ ├── configure
│ │ │ ├── configure.ac
│ │ │ ├── coverage.sh
│ │ │ ├── doc/
│ │ │ │ ├── html.xsl.in
│ │ │ │ ├── jemalloc.xml.in
│ │ │ │ ├── manpages.xsl.in
│ │ │ │ └── stylesheet.xsl
│ │ │ ├── include/
│ │ │ │ ├── jemalloc/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ ├── arena.h
│ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ ├── base.h
│ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ ├── chunk.h
│ │ │ │ │ │ ├── chunk_dss.h
│ │ │ │ │ │ ├── chunk_mmap.h
│ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ ├── extent.h
│ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ ├── huge.h
│ │ │ │ │ │ ├── jemalloc_internal.h.in
│ │ │ │ │ │ ├── jemalloc_internal_decls.h
│ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ ├── mb.h
│ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ ├── pages.h
│ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ ├── private_symbols.txt
│ │ │ │ │ │ ├── private_unnamespace.sh
│ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ ├── prof.h
│ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ ├── quarantine.h
│ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ ├── tcache.h
│ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ ├── util.h
│ │ │ │ │ │ └── valgrind.h
│ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ ├── jemalloc_rename.sh
│ │ │ │ │ └── jemalloc_typedefs.h.in
│ │ │ │ └── msvc_compat/
│ │ │ │ ├── C99/
│ │ │ │ │ ├── stdbool.h
│ │ │ │ │ └── stdint.h
│ │ │ │ ├── strings.h
│ │ │ │ └── windows_extra.h
│ │ │ ├── install-sh
│ │ │ ├── jemalloc.pc.in
│ │ │ ├── src/
│ │ │ │ ├── arena.c
│ │ │ │ ├── atomic.c
│ │ │ │ ├── base.c
│ │ │ │ ├── bitmap.c
│ │ │ │ ├── chunk.c
│ │ │ │ ├── chunk_dss.c
│ │ │ │ ├── chunk_mmap.c
│ │ │ │ ├── ckh.c
│ │ │ │ ├── ctl.c
│ │ │ │ ├── extent.c
│ │ │ │ ├── hash.c
│ │ │ │ ├── huge.c
│ │ │ │ ├── jemalloc.c
│ │ │ │ ├── mb.c
│ │ │ │ ├── mutex.c
│ │ │ │ ├── pages.c
│ │ │ │ ├── prof.c
│ │ │ │ ├── quarantine.c
│ │ │ │ ├── rtree.c
│ │ │ │ ├── stats.c
│ │ │ │ ├── tcache.c
│ │ │ │ ├── tsd.c
│ │ │ │ ├── util.c
│ │ │ │ ├── valgrind.c
│ │ │ │ └── zone.c
│ │ │ └── test/
│ │ │ ├── include/
│ │ │ │ └── test/
│ │ │ │ ├── SFMT-alti.h
│ │ │ │ ├── SFMT-params.h
│ │ │ │ ├── SFMT-params11213.h
│ │ │ │ ├── SFMT-params1279.h
│ │ │ │ ├── SFMT-params132049.h
│ │ │ │ ├── SFMT-params19937.h
│ │ │ │ ├── SFMT-params216091.h
│ │ │ │ ├── SFMT-params2281.h
│ │ │ │ ├── SFMT-params4253.h
│ │ │ │ ├── SFMT-params44497.h
│ │ │ │ ├── SFMT-params607.h
│ │ │ │ ├── SFMT-params86243.h
│ │ │ │ ├── SFMT-sse2.h
│ │ │ │ ├── SFMT.h
│ │ │ │ ├── btalloc.h
│ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ ├── math.h
│ │ │ │ ├── mq.h
│ │ │ │ ├── mtx.h
│ │ │ │ ├── test.h
│ │ │ │ ├── thd.h
│ │ │ │ └── timer.h
│ │ │ ├── integration/
│ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ ├── aligned_alloc.c
│ │ │ │ ├── allocated.c
│ │ │ │ ├── chunk.c
│ │ │ │ ├── mallocx.c
│ │ │ │ ├── overflow.c
│ │ │ │ ├── posix_memalign.c
│ │ │ │ ├── rallocx.c
│ │ │ │ ├── sdallocx.c
│ │ │ │ ├── thread_arena.c
│ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ └── xallocx.c
│ │ │ ├── src/
│ │ │ │ ├── SFMT.c
│ │ │ │ ├── btalloc.c
│ │ │ │ ├── btalloc_0.c
│ │ │ │ ├── btalloc_1.c
│ │ │ │ ├── math.c
│ │ │ │ ├── mq.c
│ │ │ │ ├── mtx.c
│ │ │ │ ├── test.c
│ │ │ │ ├── thd.c
│ │ │ │ └── timer.c
│ │ │ ├── stress/
│ │ │ │ └── microbench.c
│ │ │ ├── test.sh.in
│ │ │ └── unit/
│ │ │ ├── SFMT.c
│ │ │ ├── atomic.c
│ │ │ ├── bitmap.c
│ │ │ ├── ckh.c
│ │ │ ├── hash.c
│ │ │ ├── junk.c
│ │ │ ├── junk_alloc.c
│ │ │ ├── junk_free.c
│ │ │ ├── lg_chunk.c
│ │ │ ├── mallctl.c
│ │ │ ├── math.c
│ │ │ ├── mq.c
│ │ │ ├── mtx.c
│ │ │ ├── prof_accum.c
│ │ │ ├── prof_active.c
│ │ │ ├── prof_gdump.c
│ │ │ ├── prof_idump.c
│ │ │ ├── prof_reset.c
│ │ │ ├── prof_thread_name.c
│ │ │ ├── ql.c
│ │ │ ├── qr.c
│ │ │ ├── quarantine.c
│ │ │ ├── rb.c
│ │ │ ├── rtree.c
│ │ │ ├── size_classes.c
│ │ │ ├── stats.c
│ │ │ ├── tsd.c
│ │ │ ├── util.c
│ │ │ └── zero.c
│ │ ├── linenoise/
│ │ │ ├── .gitignore
│ │ │ ├── Makefile
│ │ │ ├── README.markdown
│ │ │ ├── example.c
│ │ │ ├── linenoise.c
│ │ │ └── linenoise.h
│ │ ├── lua/
│ │ │ ├── COPYRIGHT
│ │ │ ├── HISTORY
│ │ │ ├── INSTALL
│ │ │ ├── Makefile
│ │ │ ├── README
│ │ │ ├── doc/
│ │ │ │ ├── contents.html
│ │ │ │ ├── lua.1
│ │ │ │ ├── lua.css
│ │ │ │ ├── lua.html
│ │ │ │ ├── luac.1
│ │ │ │ ├── luac.html
│ │ │ │ ├── manual.css
│ │ │ │ ├── manual.html
│ │ │ │ └── readme.html
│ │ │ ├── etc/
│ │ │ │ ├── Makefile
│ │ │ │ ├── README
│ │ │ │ ├── all.c
│ │ │ │ ├── lua.hpp
│ │ │ │ ├── lua.pc
│ │ │ │ ├── luavs.bat
│ │ │ │ ├── min.c
│ │ │ │ ├── noparser.c
│ │ │ │ └── strict.lua
│ │ │ ├── src/
│ │ │ │ ├── Makefile
│ │ │ │ ├── fpconv.c
│ │ │ │ ├── fpconv.h
│ │ │ │ ├── lapi.c
│ │ │ │ ├── lapi.h
│ │ │ │ ├── lauxlib.c
│ │ │ │ ├── lauxlib.h
│ │ │ │ ├── lbaselib.c
│ │ │ │ ├── lcode.c
│ │ │ │ ├── lcode.h
│ │ │ │ ├── ldblib.c
│ │ │ │ ├── ldebug.c
│ │ │ │ ├── ldebug.h
│ │ │ │ ├── ldo.c
│ │ │ │ ├── ldo.h
│ │ │ │ ├── ldump.c
│ │ │ │ ├── lfunc.c
│ │ │ │ ├── lfunc.h
│ │ │ │ ├── lgc.c
│ │ │ │ ├── lgc.h
│ │ │ │ ├── linit.c
│ │ │ │ ├── liolib.c
│ │ │ │ ├── llex.c
│ │ │ │ ├── llex.h
│ │ │ │ ├── llimits.h
│ │ │ │ ├── lmathlib.c
│ │ │ │ ├── lmem.c
│ │ │ │ ├── lmem.h
│ │ │ │ ├── loadlib.c
│ │ │ │ ├── lobject.c
│ │ │ │ ├── lobject.h
│ │ │ │ ├── lopcodes.c
│ │ │ │ ├── lopcodes.h
│ │ │ │ ├── loslib.c
│ │ │ │ ├── lparser.c
│ │ │ │ ├── lparser.h
│ │ │ │ ├── lstate.c
│ │ │ │ ├── lstate.h
│ │ │ │ ├── lstring.c
│ │ │ │ ├── lstring.h
│ │ │ │ ├── lstrlib.c
│ │ │ │ ├── ltable.c
│ │ │ │ ├── ltable.h
│ │ │ │ ├── ltablib.c
│ │ │ │ ├── ltm.c
│ │ │ │ ├── ltm.h
│ │ │ │ ├── lua.c
│ │ │ │ ├── lua.h
│ │ │ │ ├── lua_bit.c
│ │ │ │ ├── lua_cjson.c
│ │ │ │ ├── lua_cmsgpack.c
│ │ │ │ ├── lua_struct.c
│ │ │ │ ├── luac.c
│ │ │ │ ├── luaconf.h
│ │ │ │ ├── lualib.h
│ │ │ │ ├── lundump.c
│ │ │ │ ├── lundump.h
│ │ │ │ ├── lvm.c
│ │ │ │ ├── lvm.h
│ │ │ │ ├── lzio.c
│ │ │ │ ├── lzio.h
│ │ │ │ ├── print.c
│ │ │ │ ├── strbuf.c
│ │ │ │ └── strbuf.h
│ │ │ └── test/
│ │ │ ├── README
│ │ │ ├── bisect.lua
│ │ │ ├── cf.lua
│ │ │ ├── echo.lua
│ │ │ ├── env.lua
│ │ │ ├── factorial.lua
│ │ │ ├── fib.lua
│ │ │ ├── fibfor.lua
│ │ │ ├── globals.lua
│ │ │ ├── hello.lua
│ │ │ ├── life.lua
│ │ │ ├── luac.lua
│ │ │ ├── printf.lua
│ │ │ ├── readonly.lua
│ │ │ ├── sieve.lua
│ │ │ ├── sort.lua
│ │ │ ├── table.lua
│ │ │ ├── trace-calls.lua
│ │ │ ├── trace-globals.lua
│ │ │ └── xd.lua
│ │ └── update-jemalloc.sh
│ ├── patch/
│ │ ├── Makefile
│ │ ├── codis/
│ │ │ ├── 0000-redis.patch
│ │ │ ├── 0001-slotsscan.patch
│ │ │ ├── 0002-rehash.patch
│ │ │ ├── 0003-slots_async1.patch
│ │ │ ├── 0004-slots_async2.patch
│ │ │ ├── 0005-slots_async3_lazyfree.patch
│ │ │ ├── 0006-slots_async4_bugfix_1184.patch
│ │ │ ├── 0007-slots_async5_cleanup.patch
│ │ │ └── 0008-slots_async6_select.patch
│ │ ├── redis/
│ │ │ ├── 0001-Don-t-leak-file-descriptor-on-syncWithMaster.patch
│ │ │ ├── 0002-fix-2883-2857-pipe-fds-leak-when-fork-failed-on-bg-a.patch
│ │ │ ├── 0003-Implement-getKeys-procedure-for-georadius-and-georad.patch
│ │ │ ├── 0004-Test-fix-hopefully-false-PSYNC-failure-like-in-issue.patch
│ │ │ ├── 0005-update-block-free-after-some-diff-data-are-written-t.patch
│ │ │ ├── 0006-Fix-3848-by-closing-the-descriptor-on-error.patch
│ │ │ ├── 0007-Set-lua-time-limit-default-value-at-safe-place.patch
│ │ │ ├── 0008-Fix-zmalloc_get_memory_size-ifdefs-to-actually-use-t.patch
│ │ │ ├── 0009-Fix-preprocessor-if-else-chain-broken-in-order-to-fi.patch
│ │ │ ├── 0010-redis-cli-bigkeys-show-error-when-TYPE-fails.patch
│ │ │ ├── 0011-Redis-3.2.9.patch
│ │ │ ├── 0012-fix-Update-create-cluster-README.patch
│ │ │ ├── 0013-cli-Only-print-elapsed-time-on-OUTPUT_STANDARD.patch
│ │ │ ├── 0014-Fixed-comments-of-slowlog-duration.patch
│ │ │ ├── 0015-fix-server.stat_net_output_bytes-calc-bug.patch
│ │ │ ├── 0016-Fix-set-with-ex-px-option-when-propagated-to-aof.patch
│ │ │ ├── 0017-redis-benchmark-add-t-hset-target.patch
│ │ │ ├── 0018-Optimize-set-command-with-ex-px-when-updating-aof.patch
│ │ │ ├── 0019-Aesthetic-changes-to-4068-PR-to-conform-to-Redis-cod.patch
│ │ │ ├── 0020-Collect-fork-timing-info-only-if-fork-succeeded.patch
│ │ │ ├── 0021-Prevent-expirations-and-evictions-while-paused.patch
│ │ │ ├── 0022-Removed-duplicate-sys-socket.h-include.patch
│ │ │ ├── 0023-Fix-PERSIST-expired-key-resuscitation-issue-4048.patch
│ │ │ ├── 0024-Fix-brpop-command-table-entry-and-redirect-blocked-c.patch
│ │ │ ├── 0025-Fix-following-issues-in-blocking-commands.patch
│ │ │ ├── 0026-Added-GEORADIUS-BYMEMBER-_RO-variants-for-read-only-.patch
│ │ │ ├── 0027-Fix-abort-typo-in-Lua-debugger-help-screen.patch
│ │ │ ├── 0028-Fix-isHLLObjectOrReply-to-handle-integer-encoded-str.patch
│ │ │ ├── 0029-Make-representClusterNodeFlags-more-robust.patch
│ │ │ ├── 0030-Fix-lua-ldb-command-log.patch
│ │ │ ├── 0031-fix-mismatch-argument.patch
│ │ │ ├── 0032-fix-return-wrong-value-of-clusterDelNodeSlots.patch
│ │ │ ├── 0033-Don-t-use-extended-Regexp-Syntax.patch
│ │ │ ├── 0034-Fixed-issue-1996-Missing-in-help-message-for-redis-b.patch
│ │ │ ├── 0035-fix-rewrite-config-auto-aof-rewrite-min-size.patch
│ │ │ ├── 0036-Check-that-the-whole-first-argument-is-a-number.patch
│ │ │ ├── 0037-Redis-3.2.10.patch
│ │ │ ├── 0038-Flush-append-only-buffers-before-existing.patch
│ │ │ └── 0039-Redis-3.2.11.patch
│ │ └── run.sh
│ ├── redis.conf
│ ├── runtest
│ ├── runtest-cluster
│ ├── runtest-sentinel
│ ├── sentinel.conf
│ ├── src/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── Makefile.dep
│ │ ├── adlist.c
│ │ ├── adlist.h
│ │ ├── ae.c
│ │ ├── ae.h
│ │ ├── ae_epoll.c
│ │ ├── ae_evport.c
│ │ ├── ae_kqueue.c
│ │ ├── ae_select.c
│ │ ├── anet.c
│ │ ├── anet.h
│ │ ├── aof.c
│ │ ├── asciilogo.h
│ │ ├── bio.c
│ │ ├── bio.h
│ │ ├── bitops.c
│ │ ├── blocked.c
│ │ ├── cluster.c
│ │ ├── cluster.h
│ │ ├── config.c
│ │ ├── config.h
│ │ ├── crc16.c
│ │ ├── crc32.c
│ │ ├── crc64.c
│ │ ├── crc64.h
│ │ ├── db.c
│ │ ├── debug.c
│ │ ├── debugmacro.h
│ │ ├── dict.c
│ │ ├── dict.h
│ │ ├── endianconv.c
│ │ ├── endianconv.h
│ │ ├── fmacros.h
│ │ ├── geo.c
│ │ ├── geo.h
│ │ ├── help.h
│ │ ├── hyperloglog.c
│ │ ├── intset.c
│ │ ├── intset.h
│ │ ├── latency.c
│ │ ├── latency.h
│ │ ├── lzf.h
│ │ ├── lzfP.h
│ │ ├── lzf_c.c
│ │ ├── lzf_d.c
│ │ ├── memtest.c
│ │ ├── mkreleasehdr.sh
│ │ ├── multi.c
│ │ ├── networking.c
│ │ ├── notify.c
│ │ ├── object.c
│ │ ├── pqsort.c
│ │ ├── pqsort.h
│ │ ├── pubsub.c
│ │ ├── quicklist.c
│ │ ├── quicklist.h
│ │ ├── rand.c
│ │ ├── rand.h
│ │ ├── rdb.c
│ │ ├── rdb.h
│ │ ├── redis-benchmark.c
│ │ ├── redis-check-aof.c
│ │ ├── redis-check-rdb.c
│ │ ├── redis-cli.c
│ │ ├── redis-trib.rb
│ │ ├── redisassert.h
│ │ ├── release.c
│ │ ├── replication.c
│ │ ├── rio.c
│ │ ├── rio.h
│ │ ├── scripting.c
│ │ ├── sds.c
│ │ ├── sds.h
│ │ ├── sdsalloc.h
│ │ ├── sentinel.c
│ │ ├── server.c
│ │ ├── server.h
│ │ ├── setproctitle.c
│ │ ├── sha1.c
│ │ ├── sha1.h
│ │ ├── slots.c
│ │ ├── slots_async.c
│ │ ├── slowlog.c
│ │ ├── slowlog.h
│ │ ├── solarisfixes.h
│ │ ├── sort.c
│ │ ├── sparkline.c
│ │ ├── sparkline.h
│ │ ├── syncio.c
│ │ ├── t_hash.c
│ │ ├── t_list.c
│ │ ├── t_set.c
│ │ ├── t_string.c
│ │ ├── t_zset.c
│ │ ├── testhelp.h
│ │ ├── util.c
│ │ ├── util.h
│ │ ├── valgrind.sup
│ │ ├── version.h
│ │ ├── ziplist.c
│ │ ├── ziplist.h
│ │ ├── zipmap.c
│ │ ├── zipmap.h
│ │ ├── zmalloc.c
│ │ └── zmalloc.h
│ ├── tests/
│ │ ├── assets/
│ │ │ └── default.conf
│ │ ├── cluster/
│ │ │ ├── cluster.tcl
│ │ │ ├── run.tcl
│ │ │ ├── tests/
│ │ │ │ ├── 00-base.tcl
│ │ │ │ ├── 01-faildet.tcl
│ │ │ │ ├── 02-failover.tcl
│ │ │ │ ├── 03-failover-loop.tcl
│ │ │ │ ├── 04-resharding.tcl
│ │ │ │ ├── 05-slave-selection.tcl
│ │ │ │ ├── 06-slave-stop-cond.tcl
│ │ │ │ ├── 07-replica-migration.tcl
│ │ │ │ ├── 08-update-msg.tcl
│ │ │ │ ├── 09-pubsub.tcl
│ │ │ │ ├── 10-manual-failover.tcl
│ │ │ │ ├── 11-manual-takeover.tcl
│ │ │ │ ├── 12-replica-migration-2.tcl
│ │ │ │ ├── helpers/
│ │ │ │ │ └── onlydots.tcl
│ │ │ │ └── includes/
│ │ │ │ └── init-tests.tcl
│ │ │ └── tmp/
│ │ │ └── .gitignore
│ │ ├── helpers/
│ │ │ ├── bg_complex_data.tcl
│ │ │ └── gen_write_load.tcl
│ │ ├── instances.tcl
│ │ ├── integration/
│ │ │ ├── aof-race.tcl
│ │ │ ├── aof.tcl
│ │ │ ├── convert-zipmap-hash-on-load.tcl
│ │ │ ├── logging.tcl
│ │ │ ├── rdb.tcl
│ │ │ ├── redis-cli.tcl
│ │ │ ├── replication-2.tcl
│ │ │ ├── replication-3.tcl
│ │ │ ├── replication-4.tcl
│ │ │ ├── replication-psync.tcl
│ │ │ └── replication.tcl
│ │ ├── sentinel/
│ │ │ ├── run.tcl
│ │ │ ├── tests/
│ │ │ │ ├── 00-base.tcl
│ │ │ │ ├── 01-conf-update.tcl
│ │ │ │ ├── 02-slaves-reconf.tcl
│ │ │ │ ├── 03-runtime-reconf.tcl
│ │ │ │ ├── 04-slave-selection.tcl
│ │ │ │ ├── 05-manual.tcl
│ │ │ │ ├── 06-ckquorum.tcl
│ │ │ │ ├── 07-down-conditions.tcl
│ │ │ │ └── includes/
│ │ │ │ └── init-tests.tcl
│ │ │ └── tmp/
│ │ │ └── .gitignore
│ │ ├── support/
│ │ │ ├── cluster.tcl
│ │ │ ├── redis.tcl
│ │ │ ├── server.tcl
│ │ │ ├── test.tcl
│ │ │ ├── tmpfile.tcl
│ │ │ └── util.tcl
│ │ ├── test_helper.tcl
│ │ └── unit/
│ │ ├── aofrw.tcl
│ │ ├── auth.tcl
│ │ ├── bitfield.tcl
│ │ ├── bitops.tcl
│ │ ├── dump.tcl
│ │ ├── expire.tcl
│ │ ├── geo.tcl
│ │ ├── hyperloglog.tcl
│ │ ├── introspection-2.tcl
│ │ ├── introspection.tcl
│ │ ├── keyspace.tcl
│ │ ├── latency-monitor.tcl
│ │ ├── limits.tcl
│ │ ├── maxmemory.tcl
│ │ ├── memefficiency.tcl
│ │ ├── multi.tcl
│ │ ├── obuf-limits.tcl
│ │ ├── other.tcl
│ │ ├── printver.tcl
│ │ ├── protocol.tcl
│ │ ├── pubsub.tcl
│ │ ├── quit.tcl
│ │ ├── scan.tcl
│ │ ├── scripting.tcl
│ │ ├── slowlog.tcl
│ │ ├── sort.tcl
│ │ └── type/
│ │ ├── hash.tcl
│ │ ├── incr.tcl
│ │ ├── list-2.tcl
│ │ ├── list-3.tcl
│ │ ├── list-common.tcl
│ │ ├── list.tcl
│ │ ├── set.tcl
│ │ ├── string.tcl
│ │ └── zset.tcl
│ └── utils/
│ ├── build-static-symbols.tcl
│ ├── cluster_fail_time.tcl
│ ├── corrupt_rdb.c
│ ├── create-cluster/
│ │ ├── .gitignore
│ │ ├── README
│ │ └── create-cluster
│ ├── generate-command-help.rb
│ ├── hashtable/
│ │ ├── README
│ │ └── rehashing.c
│ ├── hyperloglog/
│ │ ├── .gitignore
│ │ ├── hll-err.rb
│ │ └── hll-gnuplot-graph.rb
│ ├── install_server.sh
│ ├── lru/
│ │ ├── README
│ │ └── test-lru.rb
│ ├── redis-copy.rb
│ ├── redis-sha1.rb
│ ├── redis_init_script
│ ├── redis_init_script.tpl
│ ├── releasetools/
│ │ ├── 01_create_tarball.sh
│ │ ├── 02_upload_tarball.sh
│ │ ├── 03_test_release.sh
│ │ └── 04_release_hash.sh
│ ├── speed-regression.tcl
│ └── whatisdoing.sh
├── kubernetes/
│ ├── README.md
│ ├── codis-dashboard.yaml
│ ├── codis-fe.yaml
│ ├── codis-ha.yaml
│ ├── codis-proxy.yaml
│ ├── codis-server.yaml
│ ├── codis-service.yaml
│ ├── start.sh
│ └── zookeeper/
│ ├── zookeeper-service.yaml
│ └── zookeeper.yaml
├── pkg/
│ ├── models/
│ │ ├── action.go
│ │ ├── client.go
│ │ ├── encode.go
│ │ ├── etcd/
│ │ │ └── etcdclient.go
│ │ ├── fs/
│ │ │ └── fsclient.go
│ │ ├── group.go
│ │ ├── proxy.go
│ │ ├── sentinel.go
│ │ ├── slots.go
│ │ ├── sorter.go
│ │ ├── store.go
│ │ ├── topom.go
│ │ └── zk/
│ │ └── zkclient.go
│ ├── proxy/
│ │ ├── backend.go
│ │ ├── backend_test.go
│ │ ├── config.go
│ │ ├── delay.go
│ │ ├── forward.go
│ │ ├── jodis.go
│ │ ├── mapper.go
│ │ ├── mapper_test.go
│ │ ├── metrics.go
│ │ ├── proxy.go
│ │ ├── proxy_api.go
│ │ ├── proxy_test.go
│ │ ├── redis/
│ │ │ ├── conn.go
│ │ │ ├── conn_test.go
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── resp.go
│ │ ├── request.go
│ │ ├── request_test.go
│ │ ├── router.go
│ │ ├── session.go
│ │ ├── slots.go
│ │ └── stats.go
│ ├── topom/
│ │ ├── .gitignore
│ │ ├── config.go
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── topom.go
│ │ ├── topom_action.go
│ │ ├── topom_action_test.go
│ │ ├── topom_api.go
│ │ ├── topom_api_test.go
│ │ ├── topom_cache.go
│ │ ├── topom_cache_test.go
│ │ ├── topom_group.go
│ │ ├── topom_group_test.go
│ │ ├── topom_proxy.go
│ │ ├── topom_proxy_test.go
│ │ ├── topom_sentinel.go
│ │ ├── topom_slots.go
│ │ ├── topom_slots_test.go
│ │ ├── topom_stats.go
│ │ ├── topom_stats_test.go
│ │ └── topom_test.go
│ └── utils/
│ ├── args.go
│ ├── assert/
│ │ └── assert.go
│ ├── bufio2/
│ │ ├── bufio.go
│ │ ├── bufio_test.go
│ │ └── slice.go
│ ├── bytesize/
│ │ ├── bytesize.go
│ │ └── bytesize_test.go
│ ├── errors/
│ │ └── errors.go
│ ├── log/
│ │ ├── log.go
│ │ └── rolling.go
│ ├── math2/
│ │ ├── math.go
│ │ └── math_test.go
│ ├── redis/
│ │ ├── client.go
│ │ └── sentinel.go
│ ├── resolver.go
│ ├── resolver_test.go
│ ├── rpc/
│ │ ├── api.go
│ │ └── crypto.go
│ ├── sync2/
│ │ ├── atomic2/
│ │ │ ├── atomic64.go
│ │ │ └── bool.go
│ │ └── future.go
│ ├── timesize/
│ │ ├── timesize.go
│ │ └── timesize_test.go
│ ├── trace/
│ │ └── trace.go
│ ├── unsafe2/
│ │ ├── cgo_malloc.go
│ │ ├── cgo_slice.go
│ │ ├── go_slice.go
│ │ ├── je_malloc.go
│ │ ├── slice.go
│ │ ├── slice_test.go
│ │ ├── string.go
│ │ └── string_test.go
│ ├── usage.go
│ ├── usage_linux.go
│ └── usage_rusage.go
├── scripts/
│ ├── .gitignore
│ ├── docker.sh
│ └── static_slots.py
├── vendor/
│ ├── github.com/
│ │ ├── BurntSushi/
│ │ │ └── toml/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── COMPATIBLE
│ │ │ ├── COPYING
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── decode.go
│ │ │ ├── decode_meta.go
│ │ │ ├── doc.go
│ │ │ ├── encode.go
│ │ │ ├── encoding_types.go
│ │ │ ├── encoding_types_1.1.go
│ │ │ ├── lex.go
│ │ │ ├── parse.go
│ │ │ ├── session.vim
│ │ │ ├── type_check.go
│ │ │ └── type_fields.go
│ │ ├── coreos/
│ │ │ └── etcd/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── client/
│ │ │ │ ├── README.md
│ │ │ │ ├── auth_role.go
│ │ │ │ ├── auth_user.go
│ │ │ │ ├── cancelreq.go
│ │ │ │ ├── client.go
│ │ │ │ ├── cluster_error.go
│ │ │ │ ├── curl.go
│ │ │ │ ├── discover.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── keys.generated.go
│ │ │ │ ├── keys.go
│ │ │ │ ├── members.go
│ │ │ │ ├── srv.go
│ │ │ │ └── util.go
│ │ │ └── pkg/
│ │ │ ├── pathutil/
│ │ │ │ └── path.go
│ │ │ └── types/
│ │ │ ├── doc.go
│ │ │ ├── id.go
│ │ │ ├── set.go
│ │ │ ├── slice.go
│ │ │ ├── urls.go
│ │ │ └── urlsmap.go
│ │ ├── docopt/
│ │ │ └── docopt-go/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── docopt.go
│ │ │ ├── test_golang.docopt
│ │ │ └── testcases.docopt
│ │ ├── emirpasic/
│ │ │ └── gods/
│ │ │ ├── LICENSE
│ │ │ ├── containers/
│ │ │ │ ├── containers.go
│ │ │ │ ├── enumerable.go
│ │ │ │ ├── iterator.go
│ │ │ │ └── serialization.go
│ │ │ ├── trees/
│ │ │ │ ├── redblacktree/
│ │ │ │ │ ├── iterator.go
│ │ │ │ │ ├── redblacktree.go
│ │ │ │ │ └── serialization.go
│ │ │ │ └── trees.go
│ │ │ └── utils/
│ │ │ ├── comparator.go
│ │ │ ├── sort.go
│ │ │ └── utils.go
│ │ ├── garyburd/
│ │ │ └── redigo/
│ │ │ ├── LICENSE
│ │ │ ├── internal/
│ │ │ │ └── commandinfo.go
│ │ │ └── redis/
│ │ │ ├── conn.go
│ │ │ ├── doc.go
│ │ │ ├── go17.go
│ │ │ ├── log.go
│ │ │ ├── pool.go
│ │ │ ├── pre_go17.go
│ │ │ ├── pubsub.go
│ │ │ ├── redis.go
│ │ │ ├── reply.go
│ │ │ ├── scan.go
│ │ │ └── script.go
│ │ ├── go-martini/
│ │ │ └── martini/
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── env.go
│ │ │ ├── go_version.go
│ │ │ ├── logger.go
│ │ │ ├── martini.go
│ │ │ ├── recovery.go
│ │ │ ├── response_writer.go
│ │ │ ├── return_handler.go
│ │ │ ├── router.go
│ │ │ ├── static.go
│ │ │ └── wercker.yml
│ │ ├── influxdata/
│ │ │ └── influxdb/
│ │ │ ├── LICENSE
│ │ │ ├── LICENSE_OF_DEPENDENCIES.md
│ │ │ ├── client/
│ │ │ │ └── v2/
│ │ │ │ ├── client.go
│ │ │ │ └── udp.go
│ │ │ ├── models/
│ │ │ │ ├── consistency.go
│ │ │ │ ├── inline_fnv.go
│ │ │ │ ├── inline_strconv_parse.go
│ │ │ │ ├── points.go
│ │ │ │ ├── rows.go
│ │ │ │ ├── statistic.go
│ │ │ │ └── time.go
│ │ │ └── pkg/
│ │ │ └── escape/
│ │ │ ├── bytes.go
│ │ │ └── strings.go
│ │ ├── martini-contrib/
│ │ │ ├── binding/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── binding.go
│ │ │ │ ├── errors.go
│ │ │ │ └── wercker.yml
│ │ │ ├── gzip/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── gzip.go
│ │ │ │ └── wercker.yml
│ │ │ └── render/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── render.go
│ │ │ └── wercker.yml
│ │ ├── oxtoacart/
│ │ │ └── bpool/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bpool.go
│ │ │ ├── bufferpool.go
│ │ │ ├── bytepool.go
│ │ │ └── sizedbufferpool.go
│ │ ├── samuel/
│ │ │ └── go-zookeeper/
│ │ │ ├── LICENSE
│ │ │ └── zk/
│ │ │ ├── conn.go
│ │ │ ├── constants.go
│ │ │ ├── dnshostprovider.go
│ │ │ ├── flw.go
│ │ │ ├── lock.go
│ │ │ ├── server_help.go
│ │ │ ├── server_java.go
│ │ │ ├── structs.go
│ │ │ └── util.go
│ │ ├── spinlock/
│ │ │ └── jemalloc-go/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── help.mk
│ │ │ ├── jemalloc-4.4.0/
│ │ │ │ ├── .appveyor.yml
│ │ │ │ ├── .autom4te.cfg
│ │ │ │ ├── .gitattributes
│ │ │ │ ├── .gitignore
│ │ │ │ ├── .travis.yml
│ │ │ │ ├── COPYING
│ │ │ │ ├── ChangeLog
│ │ │ │ ├── INSTALL
│ │ │ │ ├── Makefile.in
│ │ │ │ ├── README
│ │ │ │ ├── VERSION
│ │ │ │ ├── autogen.sh
│ │ │ │ ├── bin/
│ │ │ │ │ ├── jemalloc-config.in
│ │ │ │ │ ├── jemalloc.sh.in
│ │ │ │ │ └── jeprof.in
│ │ │ │ ├── build-aux/
│ │ │ │ │ ├── config.guess
│ │ │ │ │ ├── config.sub
│ │ │ │ │ └── install-sh
│ │ │ │ ├── config.stamp.in
│ │ │ │ ├── configure.ac
│ │ │ │ ├── coverage.sh
│ │ │ │ ├── doc/
│ │ │ │ │ ├── html.xsl.in
│ │ │ │ │ ├── jemalloc.xml.in
│ │ │ │ │ ├── manpages.xsl.in
│ │ │ │ │ └── stylesheet.xsl
│ │ │ │ ├── include/
│ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ ├── internal/
│ │ │ │ │ │ │ ├── arena.h
│ │ │ │ │ │ │ ├── assert.h
│ │ │ │ │ │ │ ├── atomic.h
│ │ │ │ │ │ │ ├── base.h
│ │ │ │ │ │ │ ├── bitmap.h
│ │ │ │ │ │ │ ├── chunk.h
│ │ │ │ │ │ │ ├── chunk_dss.h
│ │ │ │ │ │ │ ├── chunk_mmap.h
│ │ │ │ │ │ │ ├── ckh.h
│ │ │ │ │ │ │ ├── ctl.h
│ │ │ │ │ │ │ ├── extent.h
│ │ │ │ │ │ │ ├── hash.h
│ │ │ │ │ │ │ ├── huge.h
│ │ │ │ │ │ │ ├── jemalloc_internal.h.in
│ │ │ │ │ │ │ ├── jemalloc_internal_decls.h
│ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in
│ │ │ │ │ │ │ ├── jemalloc_internal_macros.h
│ │ │ │ │ │ │ ├── mb.h
│ │ │ │ │ │ │ ├── mutex.h
│ │ │ │ │ │ │ ├── nstime.h
│ │ │ │ │ │ │ ├── pages.h
│ │ │ │ │ │ │ ├── ph.h
│ │ │ │ │ │ │ ├── private_namespace.sh
│ │ │ │ │ │ │ ├── private_symbols.txt
│ │ │ │ │ │ │ ├── private_unnamespace.sh
│ │ │ │ │ │ │ ├── prng.h
│ │ │ │ │ │ │ ├── prof.h
│ │ │ │ │ │ │ ├── public_namespace.sh
│ │ │ │ │ │ │ ├── public_unnamespace.sh
│ │ │ │ │ │ │ ├── ql.h
│ │ │ │ │ │ │ ├── qr.h
│ │ │ │ │ │ │ ├── quarantine.h
│ │ │ │ │ │ │ ├── rb.h
│ │ │ │ │ │ │ ├── rtree.h
│ │ │ │ │ │ │ ├── size_classes.sh
│ │ │ │ │ │ │ ├── smoothstep.h
│ │ │ │ │ │ │ ├── smoothstep.sh
│ │ │ │ │ │ │ ├── spin.h
│ │ │ │ │ │ │ ├── stats.h
│ │ │ │ │ │ │ ├── tcache.h
│ │ │ │ │ │ │ ├── ticker.h
│ │ │ │ │ │ │ ├── tsd.h
│ │ │ │ │ │ │ ├── util.h
│ │ │ │ │ │ │ ├── valgrind.h
│ │ │ │ │ │ │ └── witness.h
│ │ │ │ │ │ ├── jemalloc.sh
│ │ │ │ │ │ ├── jemalloc_defs.h.in
│ │ │ │ │ │ ├── jemalloc_macros.h.in
│ │ │ │ │ │ ├── jemalloc_mangle.sh
│ │ │ │ │ │ ├── jemalloc_protos.h.in
│ │ │ │ │ │ ├── jemalloc_rename.sh
│ │ │ │ │ │ └── jemalloc_typedefs.h.in
│ │ │ │ │ └── msvc_compat/
│ │ │ │ │ ├── C99/
│ │ │ │ │ │ ├── stdbool.h
│ │ │ │ │ │ └── stdint.h
│ │ │ │ │ ├── strings.h
│ │ │ │ │ └── windows_extra.h
│ │ │ │ ├── jemalloc.pc.in
│ │ │ │ ├── msvc/
│ │ │ │ │ ├── ReadMe.txt
│ │ │ │ │ ├── jemalloc_vc2015.sln
│ │ │ │ │ └── projects/
│ │ │ │ │ └── vc2015/
│ │ │ │ │ ├── jemalloc/
│ │ │ │ │ │ ├── jemalloc.vcxproj
│ │ │ │ │ │ └── jemalloc.vcxproj.filters
│ │ │ │ │ └── test_threads/
│ │ │ │ │ ├── test_threads.cpp
│ │ │ │ │ ├── test_threads.h
│ │ │ │ │ ├── test_threads.vcxproj
│ │ │ │ │ ├── test_threads.vcxproj.filters
│ │ │ │ │ └── test_threads_main.cpp
│ │ │ │ ├── src/
│ │ │ │ │ ├── arena.c
│ │ │ │ │ ├── atomic.c
│ │ │ │ │ ├── base.c
│ │ │ │ │ ├── bitmap.c
│ │ │ │ │ ├── chunk.c
│ │ │ │ │ ├── chunk_dss.c
│ │ │ │ │ ├── chunk_mmap.c
│ │ │ │ │ ├── ckh.c
│ │ │ │ │ ├── ctl.c
│ │ │ │ │ ├── extent.c
│ │ │ │ │ ├── hash.c
│ │ │ │ │ ├── huge.c
│ │ │ │ │ ├── jemalloc.c
│ │ │ │ │ ├── mb.c
│ │ │ │ │ ├── mutex.c
│ │ │ │ │ ├── nstime.c
│ │ │ │ │ ├── pages.c
│ │ │ │ │ ├── prng.c
│ │ │ │ │ ├── prof.c
│ │ │ │ │ ├── quarantine.c
│ │ │ │ │ ├── rtree.c
│ │ │ │ │ ├── spin.c
│ │ │ │ │ ├── stats.c
│ │ │ │ │ ├── tcache.c
│ │ │ │ │ ├── ticker.c
│ │ │ │ │ ├── tsd.c
│ │ │ │ │ ├── util.c
│ │ │ │ │ ├── valgrind.c
│ │ │ │ │ ├── witness.c
│ │ │ │ │ └── zone.c
│ │ │ │ └── test/
│ │ │ │ ├── include/
│ │ │ │ │ └── test/
│ │ │ │ │ ├── SFMT-alti.h
│ │ │ │ │ ├── SFMT-params.h
│ │ │ │ │ ├── SFMT-params11213.h
│ │ │ │ │ ├── SFMT-params1279.h
│ │ │ │ │ ├── SFMT-params132049.h
│ │ │ │ │ ├── SFMT-params19937.h
│ │ │ │ │ ├── SFMT-params216091.h
│ │ │ │ │ ├── SFMT-params2281.h
│ │ │ │ │ ├── SFMT-params4253.h
│ │ │ │ │ ├── SFMT-params44497.h
│ │ │ │ │ ├── SFMT-params607.h
│ │ │ │ │ ├── SFMT-params86243.h
│ │ │ │ │ ├── SFMT-sse2.h
│ │ │ │ │ ├── SFMT.h
│ │ │ │ │ ├── btalloc.h
│ │ │ │ │ ├── jemalloc_test.h.in
│ │ │ │ │ ├── jemalloc_test_defs.h.in
│ │ │ │ │ ├── math.h
│ │ │ │ │ ├── mq.h
│ │ │ │ │ ├── mtx.h
│ │ │ │ │ ├── test.h
│ │ │ │ │ ├── thd.h
│ │ │ │ │ └── timer.h
│ │ │ │ ├── integration/
│ │ │ │ │ ├── MALLOCX_ARENA.c
│ │ │ │ │ ├── aligned_alloc.c
│ │ │ │ │ ├── allocated.c
│ │ │ │ │ ├── chunk.c
│ │ │ │ │ ├── mallocx.c
│ │ │ │ │ ├── overflow.c
│ │ │ │ │ ├── posix_memalign.c
│ │ │ │ │ ├── rallocx.c
│ │ │ │ │ ├── sdallocx.c
│ │ │ │ │ ├── thread_arena.c
│ │ │ │ │ ├── thread_tcache_enabled.c
│ │ │ │ │ └── xallocx.c
│ │ │ │ ├── src/
│ │ │ │ │ ├── SFMT.c
│ │ │ │ │ ├── btalloc.c
│ │ │ │ │ ├── btalloc_0.c
│ │ │ │ │ ├── btalloc_1.c
│ │ │ │ │ ├── math.c
│ │ │ │ │ ├── mq.c
│ │ │ │ │ ├── mtx.c
│ │ │ │ │ ├── test.c
│ │ │ │ │ ├── thd.c
│ │ │ │ │ └── timer.c
│ │ │ │ ├── stress/
│ │ │ │ │ └── microbench.c
│ │ │ │ ├── test.sh.in
│ │ │ │ └── unit/
│ │ │ │ ├── SFMT.c
│ │ │ │ ├── a0.c
│ │ │ │ ├── arena_reset.c
│ │ │ │ ├── atomic.c
│ │ │ │ ├── bitmap.c
│ │ │ │ ├── ckh.c
│ │ │ │ ├── decay.c
│ │ │ │ ├── fork.c
│ │ │ │ ├── hash.c
│ │ │ │ ├── junk.c
│ │ │ │ ├── junk_alloc.c
│ │ │ │ ├── junk_free.c
│ │ │ │ ├── lg_chunk.c
│ │ │ │ ├── mallctl.c
│ │ │ │ ├── math.c
│ │ │ │ ├── mq.c
│ │ │ │ ├── mtx.c
│ │ │ │ ├── nstime.c
│ │ │ │ ├── pack.c
│ │ │ │ ├── pages.c
│ │ │ │ ├── ph.c
│ │ │ │ ├── prng.c
│ │ │ │ ├── prof_accum.c
│ │ │ │ ├── prof_active.c
│ │ │ │ ├── prof_gdump.c
│ │ │ │ ├── prof_idump.c
│ │ │ │ ├── prof_reset.c
│ │ │ │ ├── prof_thread_name.c
│ │ │ │ ├── ql.c
│ │ │ │ ├── qr.c
│ │ │ │ ├── quarantine.c
│ │ │ │ ├── rb.c
│ │ │ │ ├── rtree.c
│ │ │ │ ├── run_quantize.c
│ │ │ │ ├── size_classes.c
│ │ │ │ ├── smoothstep.c
│ │ │ │ ├── stats.c
│ │ │ │ ├── ticker.c
│ │ │ │ ├── tsd.c
│ │ │ │ ├── util.c
│ │ │ │ ├── witness.c
│ │ │ │ └── zero.c
│ │ │ ├── jemalloc.go
│ │ │ └── jemalloc_test.go
│ │ └── ugorji/
│ │ └── go/
│ │ ├── LICENSE
│ │ └── codec/
│ │ ├── 0doc.go
│ │ ├── README.md
│ │ ├── binc.go
│ │ ├── cbor.go
│ │ ├── decode.go
│ │ ├── decode_go.go
│ │ ├── decode_go14.go
│ │ ├── encode.go
│ │ ├── fast-path.generated.go
│ │ ├── fast-path.go.tmpl
│ │ ├── fast-path.not.go
│ │ ├── gen-dec-array.go.tmpl
│ │ ├── gen-dec-map.go.tmpl
│ │ ├── gen-helper.generated.go
│ │ ├── gen-helper.go.tmpl
│ │ ├── gen.generated.go
│ │ ├── gen.go
│ │ ├── gen_15.go
│ │ ├── gen_16.go
│ │ ├── gen_17.go
│ │ ├── helper.go
│ │ ├── helper_internal.go
│ │ ├── helper_not_unsafe.go
│ │ ├── helper_unsafe.go
│ │ ├── json.go
│ │ ├── msgpack.go
│ │ ├── noop.go
│ │ ├── prebuild.go
│ │ ├── prebuild.sh
│ │ ├── rpc.go
│ │ ├── simple.go
│ │ ├── test-cbor-goldens.json
│ │ ├── test.py
│ │ ├── tests.sh
│ │ └── time.go
│ ├── golang.org/
│ │ └── x/
│ │ └── net/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── PATENTS
│ │ └── context/
│ │ ├── context.go
│ │ ├── go17.go
│ │ └── pre_go17.go
│ └── gopkg.in/
│ └── alexcesaro/
│ └── statsd.v2/
│ ├── .travis.yml
│ ├── CHANGELOG.md
│ ├── LICENSE
│ ├── README.md
│ ├── conn.go
│ ├── doc.go
│ ├── options.go
│ └── statsd.go
├── version
└── wandoujia_license.txt
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.log
*.swp
*.out
*.dump
*.log.*
*.tmp
*.rdb
.DS_Store
.htaccess
/bin
/tmp
/pkg/utils/version.go
makefile
================================================
FILE: .travis.yml
================================================
language: go
os:
- linux
- osx
go:
- 1.11.x
- 1.10.x
- 1.9.x
- 1.8.x
script:
- make
- make gotest
before_deploy:
- export DEPLOY_TARGET=codis${TRAVIS_TAG}-go${TRAVIS_GO_VERSION}-${TRAVIS_OS_NAME}
- mv bin ${DEPLOY_TARGET}
- zip -r ${DEPLOY_TARGET}.zip ${DEPLOY_TARGET} && tar -czvf ${DEPLOY_TARGET}.tar.gz ${DEPLOY_TARGET}
deploy:
provider: releases
overwrite: true
api_key:
secure: RKVkoCwNJej19d6KbgpxkwJ9H3bu0icS895G9BkaytUjRVO129S93L4xpHRfeIyySZNVrd4P/le01JIJ6/Fl89wKCc/5oX07aFo6l0w/+JKxSn33FsGh8pGTg5wt9Vm5aqccB6lbkylwKrvDUOwuJCbzMva8f1YrWv0a+3I6JKU=
file:
- ${DEPLOY_TARGET}.zip
- ${DEPLOY_TARGET}.tar.gz
skip_cleanup: true
on:
repo: CodisLabs/codis
tags: true
condition: $TRAVIS_GO_VERSION =~ ^1\.(1[0-9]|[8-9])\.[0-9]+$
================================================
FILE: Dockerfile
================================================
FROM golang:1.8
RUN apt-get update
RUN apt-get install -y autoconf
ENV GOPATH /gopath
ENV CODIS ${GOPATH}/src/github.com/CodisLabs/codis
ENV PATH ${GOPATH}/bin:${PATH}:${CODIS}/bin
COPY . ${CODIS}
RUN make -C ${CODIS} distclean
RUN make -C ${CODIS} build-all
WORKDIR /codis
================================================
FILE: Godeps/Godeps.json
================================================
{
"ImportPath": "github.com/CodisLabs/codis",
"GoVersion": "go1.8",
"GodepVersion": "v79",
"Packages": [
"./..."
],
"Deps": [
{
"ImportPath": "github.com/BurntSushi/toml",
"Comment": "v0.2.0-21-g9906417",
"Rev": "99064174e013895bbd9b025c31100bd1d9b590ca"
},
{
"ImportPath": "github.com/codegangsta/inject",
"Comment": "v1.0-rc1-10-g33e0aa1",
"Rev": "33e0aa1cb7c019ccc3fbe049a8262a6403d30504"
},
{
"ImportPath": "github.com/coreos/etcd/client",
"Comment": "v3.0.17",
"Rev": "cc198e22d3b8fd7ec98304c95e68ee375be54589"
},
{
"ImportPath": "github.com/coreos/etcd/pkg/pathutil",
"Comment": "v3.0.17",
"Rev": "cc198e22d3b8fd7ec98304c95e68ee375be54589"
},
{
"ImportPath": "github.com/coreos/etcd/pkg/types",
"Comment": "v3.0.17",
"Rev": "cc198e22d3b8fd7ec98304c95e68ee375be54589"
},
{
"ImportPath": "github.com/docopt/docopt-go",
"Comment": "0.6.2",
"Rev": "784ddc588536785e7299f7272f39101f7faccc3f"
},
{
"ImportPath": "github.com/emirpasic/gods/containers",
"Comment": "v1.9.0",
"Rev": "f6c17b524822278a87e3b3bd809fec33b51f5b46"
},
{
"ImportPath": "github.com/emirpasic/gods/trees",
"Comment": "v1.9.0",
"Rev": "f6c17b524822278a87e3b3bd809fec33b51f5b46"
},
{
"ImportPath": "github.com/emirpasic/gods/trees/redblacktree",
"Comment": "v1.9.0",
"Rev": "f6c17b524822278a87e3b3bd809fec33b51f5b46"
},
{
"ImportPath": "github.com/emirpasic/gods/utils",
"Comment": "v1.9.0",
"Rev": "f6c17b524822278a87e3b3bd809fec33b51f5b46"
},
{
"ImportPath": "github.com/garyburd/redigo/internal",
"Comment": "v1.0.0-20-g4854517",
"Rev": "48545177e92ae3e7bcdbd50b42f7a139e6a268da"
},
{
"ImportPath": "github.com/garyburd/redigo/redis",
"Comment": "v1.0.0-20-g4854517",
"Rev": "48545177e92ae3e7bcdbd50b42f7a139e6a268da"
},
{
"ImportPath": "github.com/go-martini/martini",
"Comment": "v1.0-186-gfe605b5",
"Rev": "fe605b5cd210047ae3bb73d2b69a5b912a9b423d"
},
{
"ImportPath": "github.com/influxdata/influxdb/client/v2",
"Comment": "v1.1.0-223-g8c2cfd14a",
"Rev": "8c2cfd14af2511580277ddfd7a834b6aaa5f19ab"
},
{
"ImportPath": "github.com/influxdata/influxdb/models",
"Comment": "v1.1.0-223-g8c2cfd14a",
"Rev": "8c2cfd14af2511580277ddfd7a834b6aaa5f19ab"
},
{
"ImportPath": "github.com/influxdata/influxdb/pkg/escape",
"Comment": "v1.1.0-223-g8c2cfd14a",
"Rev": "8c2cfd14af2511580277ddfd7a834b6aaa5f19ab"
},
{
"ImportPath": "github.com/martini-contrib/binding",
"Rev": "05d3e151b6cf34dacac6306226a33db68459a3b5"
},
{
"ImportPath": "github.com/martini-contrib/gzip",
"Rev": "6c035326b43f79aa18793d2f1db512d21253ea61"
},
{
"ImportPath": "github.com/martini-contrib/render",
"Rev": "ec18f8345a1181146728238980606fb1d6f40e8c"
},
{
"ImportPath": "github.com/oxtoacart/bpool",
"Rev": "4e1c5567d7c2dd59fa4c7c83d34c2f3528b025d6"
},
{
"ImportPath": "github.com/samuel/go-zookeeper/zk",
"Rev": "1d7be4effb13d2d908342d349d71a284a7542693"
},
{
"ImportPath": "github.com/spinlock/jemalloc-go",
"Rev": "26719b2ee6186ef794cd50b604f8d765d3be5a30"
},
{
"ImportPath": "github.com/ugorji/go/codec",
"Rev": "ded73eae5db7e7a0ef6f55aace87a2873c5d2b74"
},
{
"ImportPath": "golang.org/x/net/context",
"Rev": "242b6b35177ec3909636b6cf6a47e8c2c6324b5d"
},
{
"ImportPath": "gopkg.in/alexcesaro/statsd.v2",
"Comment": "v2.0.0",
"Rev": "7fea3f0d2fab1ad973e641e51dba45443a311a90"
}
]
}
================================================
FILE: Godeps/Readme
================================================
This directory tree is generated automatically by godep.
Please do not edit.
See https://github.com/tools/godep for more information.
================================================
FILE: MIT-LICENSE.txt
================================================
The MIT License (MIT)
Copyright (c) 2016 CodisLabs
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: Makefile
================================================
.DEFAULT_GOAL := build-all
export GO15VENDOREXPERIMENT=1
build-all: codis-server codis-dashboard codis-proxy codis-admin codis-ha codis-fe clean-gotest
codis-deps:
@mkdir -p bin config && bash version
@make --no-print-directory -C vendor/github.com/spinlock/jemalloc-go/
codis-dashboard: codis-deps
go build -i -o bin/codis-dashboard ./cmd/dashboard
@./bin/codis-dashboard --default-config > config/dashboard.toml
codis-proxy: codis-deps
go build -i -tags "cgo_jemalloc" -o bin/codis-proxy ./cmd/proxy
@./bin/codis-proxy --default-config > config/proxy.toml
codis-admin: codis-deps
go build -i -o bin/codis-admin ./cmd/admin
codis-ha: codis-deps
go build -i -o bin/codis-ha ./cmd/ha
codis-fe: codis-deps
go build -i -o bin/codis-fe ./cmd/fe
@rm -rf bin/assets; cp -rf cmd/fe/assets bin/
codis-server:
@mkdir -p bin
@rm -f bin/codis-server*
make -j4 -C extern/redis-3.2.11/
@cp -f extern/redis-3.2.11/src/redis-server bin/codis-server
@cp -f extern/redis-3.2.11/src/redis-benchmark bin/
@cp -f extern/redis-3.2.11/src/redis-cli bin/
@cp -f extern/redis-3.2.11/src/redis-sentinel bin/
@cp -f extern/redis-3.2.11/redis.conf config/
@sed -e "s/^sentinel/# sentinel/g" extern/redis-3.2.11/sentinel.conf > config/sentinel.conf
clean-gotest:
@rm -rf ./pkg/topom/gotest.tmp
clean: clean-gotest
@rm -rf bin
@rm -rf scripts/tmp
distclean: clean
@make --no-print-directory --quiet -C extern/redis-3.2.11 distclean
@make --no-print-directory --quiet -C vendor/github.com/spinlock/jemalloc-go/ distclean
gotest: codis-deps
go test ./cmd/... ./pkg/...
gobench: codis-deps
go test -gcflags -l -bench=. -v ./pkg/...
docker:
docker build --force-rm -t codis-image .
demo:
pushd example && make
================================================
FILE: README.md
================================================
<img src="doc/pictures/logo-3.png" height=80></img>
[](https://gitter.im/CodisLabs/codis?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://travis-ci.org/CodisLabs/codis)
Codis is a proxy based high performance Redis cluster solution written in Go. It is production-ready and widely used at [wandoujia.com](http://wandoujia.com) and many companies. You can see [Codis Releases](https://github.com/CodisLabs/codis/releases) for latest and most stable realeases.
## Donation
Donate if you want to help us maintaining this project. Thank you!
[See this issue for details](https://github.com/CodisLabs/codis/issues/976)
## Compared with Twemproxy and Redis Cluster
<table>
<tr><th></th><th>Codis</th><th>Twemproxy</th><th>Redis Cluster</th></tr>
<tr><td>resharding without restarting cluster</td><td>Yes</td><td>No</td><td>Yes</td></tr>
<tr><td>pipeline</td><td>Yes</td><td>Yes</td><td>No</td></tr>
<tr><td>hash tags for multi-key operations</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
<tr><td>multi-key operations while resharding</td><td>Yes</td><td>-</td><td>No(<a href="http://redis.io/topics/cluster-spec#multiple-keys-operations">details</a>)</td></tr>
<tr><td>Redis clients supporting</td><td>Any clients</td><td>Any clients</td><td>Clients have to support cluster protocol</td></tr>
</table>
"Resharding" means migrating the data in one slot from one redis server to another, usually happens while increasing/decreasing the number of redis servers.
## Other Features
* GUI website dashboard & admin tools
* Supports most of Redis commands, Fully compatible with Twemproxy(https://github.com/twitter/twemproxy)
* Proxies can register on zk/etcd, clients can avoid dead proxies, see "High Availability" section.
## Tutorial
[简体中文](doc/tutorial_zh.md)
[English (WIP) ](doc/tutorial_en.md)
## FAQ
[简体中文](doc/FAQ_zh.md)
[English (WIP) ](FAQ_en.md)
## High Availability
[简体中文](doc/tutorial_zh.md#3-jodis-与-ha)
[English (WIP) ](doc/tutorial_en.md#ha)
## Architecture

## Snapshots
Proxy

Slots

Group

Sentinel

## Benchmarks
[See benchmark results](doc/benchmark.md)
## Authors
Active authors:
* [@spinlock9](https://github.com/spinlock) [微博@斯宾洛克](http://weibo.com/spinlock9)
* [@yangzhe1991](https://github.com/yangzhe1991) [微博@\_杨肉\_](http://weibo.com/yangzhe1991)
Emeritus authors:
* [@goroutine](https://github.com/ngaut) [微博@goroutine](http://weibo.com/u/1923497393)
* [@c4pt0r](https://github.com/c4pt0r) [微博@Dongxu\_Huang](http://weibo.com/c4pt0r)
Thanks:
* [@ivanzhaowy](https://github.com/ivanzhaowy)
* [@Apache9](https://github.com/apache9) [微博@Apache9](http://weibo.com/u/1876829375)
## License
Codis is licensed under MIT, see MIT-LICENSE.txt
-------------
*You are welcome to use Codis in your product, and feel free to let us know~ :)*
================================================
FILE: admin/codis-dashboard-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_DASHBOARD_BIN=$CODIS_BIN_DIR/codis-dashboard
CODIS_ADMIN_TOOL_BIN=$CODIS_BIN_DIR/codis-admin
CODIS_DASHBOARD_PID_FILE=$CODIS_BIN_DIR/codis-dashboard.pid
CODIS_DASHBOARD_LOG_FILE=$CODIS_LOG_DIR/codis-dashboard.log
CODIS_DASHBOARD_DAEMON_FILE=$CODIS_LOG_DIR/codis-dashboard.out
CODIS_DASHBOARD_CONF_FILE=$CODIS_CONF_DIR/dashboard.toml
echo $CODIS_DASHBOARD_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-dashboard ... "
if [ -f "$CODIS_DASHBOARD_PID_FILE" ]; then
if kill -0 `cat "$CODIS_DASHBOARD_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_DASHBOARD_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_DASHBOARD_BIN" "--config=${CODIS_DASHBOARD_CONF_FILE}" \
"--log=$CODIS_DASHBOARD_LOG_FILE" "--log-level=INFO" "--pidfile=$CODIS_DASHBOARD_PID_FILE" > "$CODIS_DASHBOARD_DAEMON_FILE" 2>&1 < /dev/null &
;;
start-foreground)
$CODIS_DASHBOARD_BIN "--config=${CODIS_DASHBOARD_CONF_FILE}" \
"--log-level=DEBUG" "--pidfile=$CODIS_DASHBOARD_PID_FILE"
;;
stop)
echo "stopping codis-dashboard ... "
if [ ! -f "$CODIS_DASHBOARD_PID_FILE" ]
then
echo "no codis-dashboard to stop (could not find file $CODIS_DASHBOARD_PID_FILE)"
else
kill -2 $(cat "$CODIS_DASHBOARD_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping codis-dashboard ... "
if [ ! -f "$CODIS_DASHBOARD_PID_FILE" ]
then
echo "no codis-dashboard to stop (could not find file $CODIS_DASHBOARD_PID_FILE)"
else
kill -9 $(cat "$CODIS_DASHBOARD_PID_FILE")
rm "$CODIS_DASHBOARD_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
remove-lock)
$CODIS_ADMIN_TOOL_BIN -v --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181
;;
*)
echo "Usage: $0 {start|start-foreground|stop|stop-forced|restart|remove-lock}" >&2
esac
================================================
FILE: admin/codis-fe-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_FE_BIN=$CODIS_BIN_DIR/codis-fe
CODIS_FE_PID_FILE=$CODIS_BIN_DIR/codis-fe.pid
CODIS_FE_ASSETS_DIR=$CODIS_BIN_DIR/assets
CODIS_FE_LOG_FILE=$CODIS_LOG_DIR/codis-fe.log
CODIS_FE_DAEMON_FILE=$CODIS_LOG_DIR/codis-fe.out
COORDINATOR_NAME="filesystem"
COORDINATOR_ADDR="/tmp/codis"
CODIS_FE_ADDR="0.0.0.0:9090"
echo $CODIS_FE_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-fe ... "
if [ -f "$CODIS_FE_PID_FILE" ]; then
if kill -0 `cat "$CODIS_FE_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_FE_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_FE_BIN" "--assets-dir=${CODIS_FE_ASSETS_DIR}" "--$COORDINATOR_NAME=$COORDINATOR_ADDR" \
"--log=$CODIS_FE_LOG_FILE" "--pidfile=$CODIS_FE_PID_FILE" "--log-level=INFO" "--listen=$CODIS_FE_ADDR" > "$CODIS_FE_DAEMON_FILE" 2>&1 < /dev/null &
;;
start-foreground)
$CODIS_FE_BIN "--assets-dir=${CODIS_FE_ASSETS_DIR}" "--$COORDINATOR_NAME=$COORDINATOR_ADDR" \
"--log-level=DEBUG" "--listen=$CODIS_FE_ADDR"
;;
stop)
echo "stopping codis-fe ... "
if [ ! -f "$CODIS_FE_PID_FILE" ]
then
echo "no codis-fe to stop (could not find file $CODIS_FE_PID_FILE)"
else
kill -9 $(cat "$CODIS_FE_PID_FILE")
rm $CODIS_FE_PID_FILE
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|start-foreground|stop|restart}" >&2
esac
================================================
FILE: admin/codis-proxy-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_PROXY_BIN=$CODIS_BIN_DIR/codis-proxy
CODIS_PROXY_PID_FILE=$CODIS_BIN_DIR/codis-proxy.pid
CODIS_PROXY_LOG_FILE=$CODIS_LOG_DIR/codis-proxy.log
CODIS_PROXY_DAEMON_FILE=$CODIS_LOG_DIR/codis-proxy.out
CODIS_PROXY_CONF_FILE=$CODIS_CONF_DIR/proxy.toml
CODIS_DASHBOARD_ADDR="127.0.0.1:18080"
echo $CODIS_PROXY_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-proxy ... "
if [ -f "$CODIS_PROXY_PID_FILE" ]; then
if kill -0 `cat "$CODIS_PROXY_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_PROXY_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_PROXY_BIN" "--config=${CODIS_PROXY_CONF_FILE}" "--dashboard=${CODIS_DASHBOARD_ADDR}" \
"--log=$CODIS_PROXY_LOG_FILE" "--log-level=INFO" "--ncpu=4" "--pidfile=$CODIS_PROXY_PID_FILE" > "$CODIS_PROXY_DAEMON_FILE" 2>&1 < /dev/null &
;;
start-foreground)
$CODIS_PROXY_BIN "--config=${CODIS_PROXY_CONF_FILE}" "--dashboard=${CODIS_DASHBOARD_ADDR}" \
"--log-level=DEBUG" "--pidfile=$CODIS_PROXY_PID_FILE"
;;
stop)
echo "stopping codis-proxy ... "
if [ ! -f "$CODIS_PROXY_PID_FILE" ]
then
echo "no codis-proxy to stop (could not find file $CODIS_PROXY_PID_FILE)"
else
kill -2 $(cat "$CODIS_PROXY_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping codis-proxy ... "
if [ ! -f "$CODIS_PROXY_PID_FILE" ]
then
echo "no codis-proxy to stop (could not find file $CODIS_PROXY_PID_FILE)"
else
kill -9 $(cat "$CODIS_PROXY_PID_FILE")
rm "$CODIS_PROXY_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|start-foreground|stop|stop-forced|restart}" >&2
esac
================================================
FILE: admin/codis-server-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_SERVER_BIN=$CODIS_BIN_DIR/codis-server
CODIS_SERVER_PID_FILE=/tmp/redis_6379.pid
CODIS_SERVER_LOG_FILE=/tmp/redis_6379.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis.conf
echo $CODIS_SERVER_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-server ... "
if [ -f "$CODIS_SERVER_PID_FILE" ]; then
if kill -0 `cat "$CODIS_SERVER_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_SERVER_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_SERVER_BIN" "${CODIS_SERVER_CONF_FILE}" > "$CODIS_SERVER_DAEMON_FILE" 2>&1 < /dev/null &
;;
stop)
echo "stopping codis-server ... "
if [ ! -f "$CODIS_SERVER_PID_FILE" ]
then
echo "no codis-server to stop (could not find file $CODIS_SERVER_PID_FILE)"
else
kill -2 $(cat "$CODIS_SERVER_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping codis-server ... "
if [ ! -f "$CODIS_SERVER_PID_FILE" ]
then
echo "no codis-server to stop (could not find file $CODIS_SERVER_PID_FILE)"
else
kill -9 $(cat "$CODIS_SERVER_PID_FILE")
rm "$CODIS_SERVER_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|stop|stop-forced|restart}" >&2
esac
================================================
FILE: ansible/group_vars/all
================================================
---
codis_dir: /home/codis/codis
coordinator_name: filesystem
coordinator_addr: /tmp/codis
codis_install_dir: /data/codis-vip
product_name: codis-demo
product_auth: test
dashboard_addr: 127.0.0.1:18080
proxy_addr: 127.0.0.1:19000
proxy_admin_addr: 127.0.0.1:11080
codis_server_workdir: /data/redis-6379
codis_server_port: 6379
redis_sentinel_workdir: /data/sentinel-26379
redis_sentinel_port: 26379
================================================
FILE: ansible/hosts
================================================
[codis-dashboard-servers]
127.0.0.1
[codis-proxy-servers]
127.0.0.1
[codis-servers]
127.0.0.1
[codis-fe-servers]
127.0.0.1
[redis-sentinel-servers]
127.0.0.1
================================================
FILE: ansible/roles/codis-dashboard/tasks/main.yml
================================================
---
- name: Copy codis-admin binary
copy: src={{ codis_dir }}/bin/codis-admin dest={{ codis_install_dir }}/bin/codis-admin mode=766
- name: Copy codis-dashboard binary
copy: src={{ codis_dir }}/bin/codis-dashboard dest={{ codis_install_dir }}/bin/codis-dashboard mode=766
- name: Copy codis-dashboard configuration
template: src=dashboard.toml dest={{ codis_install_dir }}/config/dashboard.toml
- name: Copy codis-dashboard admin script
template: src=codis-dashboard-admin.sh dest={{ codis_install_dir }}/admin/codis-dashboard-admin.sh mode=766
- name: Restart codis-dashboard service
command: "{{ codis_install_dir }}/admin/codis-dashboard-admin.sh restart"
================================================
FILE: ansible/roles/codis-dashboard/templates/codis-dashboard-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_DASHBOARD_BIN=$CODIS_BIN_DIR/codis-dashboard
CODIS_ADMIN_TOOL_BIN=$CODIS_BIN_DIR/codis-admin
CODIS_DASHBOARD_PID_FILE=$CODIS_BIN_DIR/codis-dashboard.pid
CODIS_DASHBOARD_LOG_FILE=$CODIS_LOG_DIR/codis-dashboard.log
CODIS_DASHBOARD_DAEMON_FILE=$CODIS_LOG_DIR/codis-dashboard.out
CODIS_DASHBOARD_CONF_FILE=$CODIS_CONF_DIR/dashboard.toml
echo $CODIS_DASHBOARD_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-dashboard ... "
if [ -f "$CODIS_DASHBOARD_PID_FILE" ]; then
if kill -0 `cat "$CODIS_DASHBOARD_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_DASHBOARD_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_DASHBOARD_BIN" "--config=${CODIS_DASHBOARD_CONF_FILE}" \
"--log=$CODIS_DASHBOARD_LOG_FILE" "--log-level=INFO" "--pidfile=$CODIS_DASHBOARD_PID_FILE" > "$CODIS_DASHBOARD_DAEMON_FILE" 2>&1 < /dev/null &
;;
start-foreground)
$CODIS_DASHBOARD_BIN "--config=${CODIS_DASHBOARD_CONF_FILE}" \
"--log-level=DEBUG" "--pidfile=$CODIS_DASHBOARD_PID_FILE"
;;
stop)
echo "stopping codis-dashboard ... "
if [ ! -f "$CODIS_DASHBOARD_PID_FILE" ]
then
echo "no codis-dashboard to stop (could not find file $CODIS_DASHBOARD_PID_FILE)"
else
kill -2 $(cat "$CODIS_DASHBOARD_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping codis-dashboard ... "
if [ ! -f "$CODIS_DASHBOARD_PID_FILE" ]
then
echo "no codis-dashboard to stop (could not find file $CODIS_DASHBOARD_PID_FILE)"
else
kill -9 $(cat "$CODIS_DASHBOARD_PID_FILE")
rm "$CODIS_DASHBOARD_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
remove-lock)
$CODIS_ADMIN_TOOL_BIN -v --remove-lock --product={{ product_name }} --{{ coordinator_name }}={{ coordinator_addr }}
;;
*)
echo "Usage: $0 {start|start-foreground|stop|stop-forced|restart|remove-lock}" >&2
esac
================================================
FILE: ansible/roles/codis-dashboard/templates/dashboard.toml
================================================
##################################################
# #
# Codis-Dashboard #
# #
##################################################
# Set Coordinator, only accept "zookeeper" & "etcd" & "filesystem".
# Quick Start
coordinator_name = "{{ coordinator_name }}"
coordinator_addr = "{{ coordinator_addr }}"
#coordinator_name = "zookeeper"
#coordinator_addr = "127.0.0.1:2181"
# Set Codis Product Name/Auth.
product_name = "{{ product_name }}"
product_auth = "{{ product_auth }}"
# Set bind address for admin(rpc), tcp only.
admin_addr = "{{ dashboard_addr }}"
# Set arguments for data migration (only accept 'sync' & 'semi-async').
migration_method = "semi-async"
migration_parallel_slots = 100
migration_async_maxbulks = 200
migration_async_maxbytes = "32mb"
migration_async_numkeys = 500
migration_timeout = "30s"
# Set configs for redis sentinel.
sentinel_quorum = 2
sentinel_parallel_syncs = 1
sentinel_down_after = "30s"
sentinel_failover_timeout = "5m"
sentinel_notification_script = ""
sentinel_client_reconfig_script = ""
================================================
FILE: ansible/roles/codis-fe/tasks/main.yml
================================================
---
- name: Copy codis-fe binary
copy: src={{ codis_dir }}/bin/codis-fe dest={{ codis_install_dir }}/bin/codis-fe mode=766
- name: Copy codis-fe assets
copy: src={{ codis_dir }}/bin/assets dest={{ codis_install_dir }}/bin
- name: Copy codis-fe admin script
template: src=codis-fe-admin.sh dest={{ codis_install_dir }}/admin/codis-fe-admin.sh mode=766
- name: Restart codis-fe service
command: "{{ codis_install_dir }}/admin/codis-fe-admin.sh restart"
================================================
FILE: ansible/roles/codis-fe/templates/codis-fe-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_FE_BIN=$CODIS_BIN_DIR/codis-fe
CODIS_FE_PID_FILE=$CODIS_BIN_DIR/codis-fe.pid
CODIS_FE_ASSETS_DIR=$CODIS_BIN_DIR/assets
CODIS_FE_LOG_FILE=$CODIS_LOG_DIR/codis-fe.log
CODIS_FE_DAEMON_FILE=$CODIS_LOG_DIR/codis-fe.out
COORDINATOR_NAME="{{ coordinator_name }}"
COORDINATOR_ADDR="{{ coordinator_addr }}"
CODIS_FE_ADDR="0.0.0.0:9090"
echo $CODIS_FE_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-fe ... "
if [ -f "$CODIS_FE_PID_FILE" ]; then
if kill -0 `cat "$CODIS_FE_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_FE_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_FE_BIN" "--assets-dir=${CODIS_FE_ASSETS_DIR}" "--$COORDINATOR_NAME=$COORDINATOR_ADDR" \
"--log=$CODIS_FE_LOG_FILE" "--pidfile=$CODIS_FE_PID_FILE" "--log-level=INFO" "--listen=$CODIS_FE_ADDR" > "$CODIS_FE_DAEMON_FILE" 2>&1 < /dev/null &
;;
start-foreground)
$CODIS_FE_BIN "--assets-dir=${CODIS_FE_ASSETS_DIR}" "--$COORDINATOR_NAME=$COORDINATOR_ADDR" \
"--log-level=DEBUG" "--listen=$CODIS_FE_ADDR"
;;
stop)
echo "stopping codis-fe ... "
if [ ! -f "$CODIS_FE_PID_FILE" ]
then
echo "no codis-fe to stop (could not find file $CODIS_FE_PID_FILE)"
else
kill -9 $(cat "$CODIS_FE_PID_FILE")
rm $CODIS_FE_PID_FILE
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|start-foreground|stop|restart}" >&2
esac
================================================
FILE: ansible/roles/codis-proxy/tasks/main.yml
================================================
---
- name: Copy codis-proxy binary
copy: src={{ codis_dir }}/bin/codis-proxy dest={{ codis_install_dir }}/bin/codis-proxy mode=766
- name: Copy codis-proxy configuration
template: src=proxy.toml dest={{ codis_install_dir }}/config/proxy.toml
- name: Copy codis-proxy admin script
template: src=codis-proxy-admin.sh dest={{ codis_install_dir }}/admin/codis-proxy-admin.sh mode=766
- name: Restart codis-proxy service
command: "{{ codis_install_dir }}/admin/codis-proxy-admin.sh restart"
================================================
FILE: ansible/roles/codis-proxy/templates/codis-proxy-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_PROXY_BIN=$CODIS_BIN_DIR/codis-proxy
CODIS_PROXY_PID_FILE=$CODIS_BIN_DIR/codis-proxy.pid
CODIS_PROXY_LOG_FILE=$CODIS_LOG_DIR/codis-proxy.log
CODIS_PROXY_DAEMON_FILE=$CODIS_LOG_DIR/codis-proxy.out
CODIS_PROXY_CONF_FILE=$CODIS_CONF_DIR/proxy.toml
CODIS_DASHBOARD_ADDR="{{ dashboard_addr }}"
echo $CODIS_PROXY_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-proxy ... "
if [ -f "$CODIS_PROXY_PID_FILE" ]; then
if kill -0 `cat "$CODIS_PROXY_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_PROXY_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_PROXY_BIN" "--config=${CODIS_PROXY_CONF_FILE}" "--dashboard=${CODIS_DASHBOARD_ADDR}" \
"--log=$CODIS_PROXY_LOG_FILE" "--log-level=INFO" "--ncpu=4" "--pidfile=$CODIS_PROXY_PID_FILE" > "$CODIS_PROXY_DAEMON_FILE" 2>&1 < /dev/null &
;;
start-foreground)
$CODIS_PROXY_BIN "--config=${CODIS_PROXY_CONF_FILE}" "--dashboard=${CODIS_DASHBOARD_ADDR}" \
"--log-level=DEBUG" "--pidfile=$CODIS_PROXY_PID_FILE"
;;
stop)
echo "stopping codis-proxy ... "
if [ ! -f "$CODIS_PROXY_PID_FILE" ]
then
echo "no codis-proxy to stop (could not find file $CODIS_PROXY_PID_FILE)"
else
kill -2 $(cat "$CODIS_PROXY_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping codis-proxy ... "
if [ ! -f "$CODIS_PROXY_PID_FILE" ]
then
echo "no codis-proxy to stop (could not find file $CODIS_PROXY_PID_FILE)"
else
kill -9 $(cat "$CODIS_PROXY_PID_FILE")
rm "$CODIS_PROXY_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|start-foreground|stop|stop-forced|restart}" >&2
esac
================================================
FILE: ansible/roles/codis-proxy/templates/proxy.toml
================================================
##################################################
# #
# Codis-Proxy #
# #
##################################################
# Set Codis Product Name/Auth.
product_name = "{{ product_name }}"
product_auth = "{{ product_auth }}"
# Set bind address for admin(rpc), tcp only.
admin_addr = "{{ proxy_admin_addr }}"
# Set bind address for proxy, proto_type can be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
proto_type = "tcp4"
proxy_addr = "{{ proxy_addr }}"
# Set jodis address & session timeout
# 1. jodis_name is short for jodis_coordinator_name, only accept "zookeeper" & "etcd".
# 2. jodis_addr is short for jodis_coordinator_addr
# 3. proxy will be registered as node:
# if jodis_compatible = true (not suggested):
# /zk/codis/db_{PRODUCT_NAME}/proxy-{HASHID} (compatible with Codis2.0)
# or else
# /jodis/{PRODUCT_NAME}/proxy-{HASHID}
jodis_name = ""
jodis_addr = ""
jodis_timeout = "20s"
jodis_compatible = false
# Set datacenter of proxy.
proxy_datacenter = ""
# Set max number of alive sessions.
proxy_max_clients = 1000
# Set max offheap memory size. (0 to disable)
proxy_max_offheap_size = "1024mb"
# Set heap placeholder to reduce GC frequency.
proxy_heap_placeholder = "256mb"
# Proxy will ping backend redis (and clear 'MASTERDOWN' state) in a predefined interval. (0 to disable)
backend_ping_period = "5s"
# Set backend recv buffer size & timeout.
backend_recv_bufsize = "128kb"
backend_recv_timeout = "30s"
# Set backend send buffer & timeout.
backend_send_bufsize = "128kb"
backend_send_timeout = "30s"
# Set backend pipeline buffer size.
backend_max_pipeline = 1024
# Set backend never read replica groups, default is false
backend_primary_only = false
# Set backend parallel connections per server
backend_primary_parallel = 1
backend_replica_parallel = 1
# Set backend tcp keepalive period. (0 to disable)
backend_keepalive_period = "75s"
# Set number of databases of backend.
backend_number_databases = 16
# If there is no request from client for a long time, the connection will be closed. (0 to disable)
# Set session recv buffer size & timeout.
session_recv_bufsize = "128kb"
session_recv_timeout = "30m"
# Set session send buffer size & timeout.
session_send_bufsize = "64kb"
session_send_timeout = "30s"
# Make sure this is higher than the max number of requests for each pipeline request, or your client may be blocked.
# Set session pipeline buffer size.
session_max_pipeline = 10000
# Set session tcp keepalive period. (0 to disable)
session_keepalive_period = "75s"
# Set session to be sensitive to failures. Default is false, instead of closing socket, proxy will send an error response to client.
session_break_on_failure = false
# Set metrics server (such as http://localhost:28000), proxy will report json formatted metrics to specified server in a predefined period.
metrics_report_server = ""
metrics_report_period = "1s"
# Set influxdb server (such as http://localhost:8086), proxy will report metrics to influxdb.
metrics_report_influxdb_server = ""
metrics_report_influxdb_period = "1s"
metrics_report_influxdb_username = ""
metrics_report_influxdb_password = ""
metrics_report_influxdb_database = ""
# Set statsd server (such as localhost:8125), proxy will report metrics to statsd.
metrics_report_statsd_server = ""
metrics_report_statsd_period = "1s"
metrics_report_statsd_prefix = ""
================================================
FILE: ansible/roles/codis-server/tasks/main.yml
================================================
---
- name: Create codis server work directory
file: path={{ codis_server_workdir }} state=directory owner=codis group=codis
- name: Copy codis-server binary
copy: src={{ codis_dir }}/bin/codis-server dest={{ codis_install_dir }}/bin/codis-server mode=766
- name: Copy codis-server configuration
template: src=redis.conf dest={{ codis_install_dir }}/config/redis.conf
- name: Copy codis-server admin script
template: src=codis-server-admin.sh dest={{ codis_install_dir }}/admin/codis-server-admin.sh mode=766
- name: Restart codis-server service
command: "{{ codis_install_dir }}/admin/codis-server-admin.sh restart"
================================================
FILE: ansible/roles/codis-server/templates/codis-server-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
CODIS_SERVER_BIN=$CODIS_BIN_DIR/codis-server
CODIS_SERVER_PID_FILE={{ codis_server_workdir }}/redis_{{ codis_server_port }}.pid
CODIS_SERVER_LOG_FILE={{ codis_server_workdir }}/redis_{{ codis_server_port }}.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server.out
CODIS_SERVER_CONF_FILE=$CODIS_CONF_DIR/redis.conf
echo $CODIS_SERVER_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting codis-server ... "
if [ -f "$CODIS_SERVER_PID_FILE" ]; then
if kill -0 `cat "$CODIS_SERVER_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$CODIS_SERVER_PID_FILE"`.
exit 0
fi
fi
nohup "$CODIS_SERVER_BIN" "${CODIS_SERVER_CONF_FILE}" > "$CODIS_SERVER_DAEMON_FILE" 2>&1 < /dev/null &
;;
stop)
echo "stopping codis-server ... "
if [ ! -f "$CODIS_SERVER_PID_FILE" ]
then
echo "no codis-server to stop (could not find file $CODIS_SERVER_PID_FILE)"
else
kill -2 $(cat "$CODIS_SERVER_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping codis-server ... "
if [ ! -f "$CODIS_SERVER_PID_FILE" ]
then
echo "no codis-server to stop (could not find file $CODIS_SERVER_PID_FILE)"
else
kill -9 $(cat "$CODIS_SERVER_PID_FILE")
rm "$CODIS_SERVER_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|stop|stop-forced|restart}" >&2
esac
================================================
FILE: ansible/roles/codis-server/templates/redis.conf
================================================
# Redis configuration file example.
#
# Note that in order to read the configuration file, Redis must be
# started with the file path as first argument:
#
# ./redis-server /path/to/redis.conf
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
################################## INCLUDES ###################################
# Include one or more other config files here. This is useful if you
# have a standard template that goes to all Redis servers but also need
# to customize a few per-server settings. Include files can include
# other files, so use this wisely.
#
# Notice option "include" won't be rewritten by command "CONFIG REWRITE"
# from admin or Redis Sentinel. Since Redis always uses the last processed
# line as value of a configuration directive, you'd better put includes
# at the beginning of this file to avoid overwriting config change at runtime.
#
# If instead you are interested in using includes to override configuration
# options, it is better to use include as the last line.
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## NETWORK #####################################
# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 lookback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1
# Protected mode is a layer of security protection, in order to avoid that
# Redis instances left open on the internet are accessed and exploited.
#
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
# "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port {{ codis_server_port }}
# TCP listen() backlog.
#
# In high requests-per-second environments you need an high backlog in order
# to avoid slow clients connections issues. Note that the Linux kernel
# will silently truncate it to the value of /proc/sys/net/core/somaxconn so
# make sure to raise both the value of somaxconn and tcp_max_syn_backlog
# in order to get the desired effect.
tcp-backlog 511
# Unix socket.
#
# Specify the path for the Unix socket that will be used to listen for
# incoming connections. There is no default, so Redis will not listen
# on a unix socket when not specified.
#
# unixsocket /tmp/redis.sock
# unixsocketperm 700
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
# TCP keepalive.
#
# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence
# of communication. This is useful for two reasons:
#
# 1) Detect dead peers.
# 2) Take the connection alive from the point of view of network
# equipment in the middle.
#
# On Linux, the specified value (in seconds) is the period used to send ACKs.
# Note that to close the connection the double of the time is needed.
# On other kernels the period depends on the kernel configuration.
#
# A reasonable value for this option is 300 seconds, which is the new
# Redis default starting with Redis 3.2.1.
tcp-keepalive 300
################################# GENERAL #####################################
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised no
# If a pid file is specified, Redis writes it where specified at startup
# and removes it at exit.
#
# When the server runs non daemonized, no pid file is created if none is
# specified in the configuration. When the server is daemonized, the pid file
# is used even if not specified, defaulting to "/var/run/redis.pid".
#
# Creating a pid file is best effort: if Redis is not able to create it
# nothing bad happens, the server will start and run normally.
pidfile {{ codis_server_workdir }}/redis_{{ codis_server_port }}.pid
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile "{{ codis_server_workdir }}/redis_{{ codis_server_port }}.log"
# To enable logging to the system logger, just set 'syslog-enabled' to yes,
# and optionally update the other syslog parameters to suit your needs.
# syslog-enabled no
# Specify the syslog identity.
# syslog-ident redis
# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7.
# syslog-facility local0
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1
save 300 10
save 60 10000
# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.
#
# If the background saving process will start working again Redis will
# automatically allow writes again.
#
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes
# Compress string objects using LZF when dump .rdb databases?
# For default that's set to 'yes' as it's almost always a win.
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes
# Since version 5 of RDB a CRC64 checksum is placed at the end of the file.
# This makes the format more resistant to corruption but there is a performance
# hit to pay (around 10%) when saving and loading RDB files, so you can disable it
# for maximum performances.
#
# RDB files created with checksum disabled have a checksum of zero that will
# tell the loading code to skip the check.
rdbchecksum yes
# The filename where to dump the DB
dbfilename dump.rdb
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir {{ codis_server_workdir }}
################################# REPLICATION #################################
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
# stop accepting writes if it appears to be not connected with at least
# a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
# master if the replication link is lost for a relatively small amount of
# time. You may want to configure the replication backlog size (see the next
# sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
# network partition slaves automatically try to reconnect to masters
# and resynchronize with them.
#
# slaveof <masterip> <masterport>
# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the slave to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the slave request.
#
masterauth {{ product_auth }}
# When a slave loses its connection with the master, or when the replication
# is still in progress, the slave can act in two different ways:
#
# 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will
# still reply to client requests, possibly with out of date data, or the
# data set may just be empty if this is the first synchronization.
#
# 2) if slave-serve-stale-data is set to 'no' the slave will reply with
# an error "SYNC with master in progress" to all the kind of commands
# but to INFO and SLAVEOF.
#
slave-serve-stale-data yes
# You can configure a slave instance to accept writes or not. Writing against
# a slave instance may be useful to store some ephemeral data (because data
# written on a slave will be easily deleted after resync with the master) but
# may also cause problems if clients are writing to it because of a
# misconfiguration.
#
# Since Redis 2.6 by default slaves are read-only.
#
# Note: read only slaves are not designed to be exposed to untrusted clients
# on the internet. It's just a protection layer against misuse of the instance.
# Still a read only slave exports by default all the administrative commands
# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve
# security of read only slaves using 'rename-command' to shadow all the
# administrative / dangerous commands.
slave-read-only yes
# Replication SYNC strategy: disk or socket.
#
# -------------------------------------------------------
# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY
# -------------------------------------------------------
#
# New slaves and reconnecting slaves that are not able to continue the replication
# process just receiving differences, need to do what is called a "full
# synchronization". An RDB file is transmitted from the master to the slaves.
# The transmission can happen in two different ways:
#
# 1) Disk-backed: The Redis master creates a new process that writes the RDB
# file on disk. Later the file is transferred by the parent
# process to the slaves incrementally.
# 2) Diskless: The Redis master creates a new process that directly writes the
# RDB file to slave sockets, without touching the disk at all.
#
# With disk-backed replication, while the RDB file is generated, more slaves
# can be queued and served with the RDB file as soon as the current child producing
# the RDB file finishes its work. With diskless replication instead once
# the transfer starts, new slaves arriving will be queued and a new transfer
# will start when the current one terminates.
#
# When diskless replication is used, the master waits a configurable amount of
# time (in seconds) before starting the transfer in the hope that multiple slaves
# will arrive and the transfer can be parallelized.
#
# With slow disks and fast (large bandwidth) networks, diskless replication
# works better.
repl-diskless-sync no
# When diskless replication is enabled, it is possible to configure the delay
# the server waits in order to spawn the child that transfers the RDB via socket
# to the slaves.
#
# This is important since once the transfer starts, it is not possible to serve
# new slaves arriving, that will be queued for the next RDB transfer, so the server
# waits a delay in order to let more slaves arrive.
#
# The delay is specified in seconds, and by default is 5 seconds. To disable
# it entirely just set it to 0 seconds and the transfer will start ASAP.
repl-diskless-sync-delay 5
# Slaves send PINGs to server in a predefined interval. It's possible to change
# this interval with the repl_ping_slave_period option. The default value is 10
# seconds.
#
# repl-ping-slave-period 10
# The following option sets the replication timeout for:
#
# 1) Bulk transfer I/O during SYNC, from the point of view of slave.
# 2) Master timeout from the point of view of slaves (data, pings).
# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings).
#
# It is important to make sure that this value is greater than the value
# specified for repl-ping-slave-period otherwise a timeout will be detected
# every time there is low traffic between the master and the slave.
#
# repl-timeout 60
# Disable TCP_NODELAY on the slave socket after SYNC?
#
# If you select "yes" Redis will use a smaller number of TCP packets and
# less bandwidth to send data to slaves. But this can add a delay for
# the data to appear on the slave side, up to 40 milliseconds with
# Linux kernels using a default configuration.
#
# If you select "no" the delay for data to appear on the slave side will
# be reduced but more bandwidth will be used for replication.
#
# By default we optimize for low latency, but in very high traffic conditions
# or when the master and slaves are many hops away, turning this to "yes" may
# be a good idea.
repl-disable-tcp-nodelay no
# Set the replication backlog size. The backlog is a buffer that accumulates
# slave data when slaves are disconnected for some time, so that when a slave
# wants to reconnect again, often a full resync is not needed, but a partial
# resync is enough, just passing the portion of data the slave missed while
# disconnected.
#
# The bigger the replication backlog, the longer the time the slave can be
# disconnected and later be able to perform a partial resynchronization.
#
# The backlog is only allocated once there is at least a slave connected.
#
# repl-backlog-size 1mb
# After a master has no longer connected slaves for some time, the backlog
# will be freed. The following option configures the amount of seconds that
# need to elapse, starting from the time the last slave disconnected, for
# the backlog buffer to be freed.
#
# A value of 0 means to never release the backlog.
#
# repl-backlog-ttl 3600
# The slave priority is an integer number published by Redis in the INFO output.
# It is used by Redis Sentinel in order to select a slave to promote into a
# master if the master is no longer working correctly.
#
# A slave with a low priority number is considered better for promotion, so
# for instance if there are three slaves with priority 10, 100, 25 Sentinel will
# pick the one with priority 10, that is the lowest.
#
# However a special priority of 0 marks the slave as not able to perform the
# role of master, so a slave with priority of 0 will never be selected by
# Redis Sentinel for promotion.
#
# By default the priority is 100.
slave-priority 100
# It is possible for a master to stop accepting writes if there are less than
# N slaves connected, having a lag less or equal than M seconds.
#
# The N slaves need to be in "online" state.
#
# The lag in seconds, that must be <= the specified value, is calculated from
# the last ping received from the slave, that is usually sent every second.
#
# This option does not GUARANTEE that N replicas will accept the write, but
# will limit the window of exposure for lost writes in case not enough slaves
# are available, to the specified number of seconds.
#
# For example to require at least 3 slaves with a lag <= 10 seconds use:
#
# min-slaves-to-write 3
# min-slaves-max-lag 10
#
# Setting one or the other to 0 disables the feature.
#
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.
# A Redis master is able to list the address and port of the attached
# slaves in different ways. For example the "INFO replication" section
# offers this information, which is used, among other tools, by
# Redis Sentinel in order to discover slave instances.
# Another place where this info is available is in the output of the
# "ROLE" command of a masteer.
#
# The listed IP and address normally reported by a slave is obtained
# in the following way:
#
# IP: The address is auto detected by checking the peer address
# of the socket used by the slave to connect with the master.
#
# Port: The port is communicated by the slave during the replication
# handshake, and is normally the port that the slave is using to
# list for connections.
#
# However when port forwarding or Network Address Translation (NAT) is
# used, the slave may be actually reachable via different IP and port
# pairs. The following two options can be used by a slave in order to
# report to its master a specific set of IP and port, so that both INFO
# and ROLE will report those values.
#
# There is no need to use both the options if you need to override just
# the port or the IP address.
#
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
################################## SECURITY ###################################
# Require clients to issue AUTH <PASSWORD> before processing any other
# commands. This might be useful in environments in which you do not trust
# others with access to the host running redis-server.
#
# This should stay commented out for backward compatibility and because most
# people do not need auth (e.g. they run their own servers).
#
# Warning: since Redis is pretty fast an outside user can try up to
# 150k passwords per second against a good box. This means that you should
# use a very strong password otherwise it will be very easy to break.
#
requirepass {{ product_auth }}
# Command renaming.
#
# It is possible to change the name of dangerous commands in a shared
# environment. For instance the CONFIG command may be renamed into something
# hard to guess so that it will still be available for internal-use tools
# but not available for general clients.
#
# Example:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# It is also possible to completely kill a command by renaming it into
# an empty string:
#
# rename-command CONFIG ""
#
# Please note that changing the name of commands that are logged into the
# AOF file or transmitted to slaves may cause problems.
################################### LIMITS ####################################
# Set the max number of connected clients at the same time. By default
# this limit is set to 10000 clients, however if the Redis server is not
# able to configure the process file limit to allow for the specified limit
# the max number of allowed clients is set to the current file limit
# minus 32 (as Redis reserves a few file descriptors for internal uses).
#
# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
#
# maxclients 10000
# Don't use more memory than the specified amount of bytes.
# When the memory limit is reached Redis will try to remove keys
# according to the eviction policy selected (see maxmemory-policy).
#
# If Redis can't remove keys according to the policy, or if the policy is
# set to 'noeviction', Redis will start to reply with errors to commands
# that would use more memory, like SET, LPUSH, and so on, and will continue
# to reply to read-only commands like GET.
#
# This option is usually useful when using Redis as an LRU cache, or to set
# a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# maxmemory <bytes>
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key according to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
#
# Note: with any of the above policies, Redis will return an error on write
# operations, when there are no suitable keys for eviction.
#
# At the date of writing these commands are: set setnx setex append
# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd
# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby
# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby
# getset mset msetnx exec sort
#
# The default is:
#
# maxmemory-policy noeviction
# LRU and minimal TTL algorithms are not precise algorithms but approximated
# algorithms (in order to save memory), so you can tune it for speed or
# accuracy. For default Redis will check five keys and pick the one that was
# used less recently, you can change the sample size using the following
# configuration directive.
#
# The default of 5 produces good enough results. 10 Approximates very closely
# true LRU but costs a bit more CPU. 3 is very fast but not very accurate.
#
# maxmemory-samples 5
############################## APPEND ONLY MODE ###############################
# By default Redis asynchronously dumps the dataset on disk. This mode is
# good enough in many applications, but an issue with the Redis process or
# a power outage may result into a few minutes of writes lost (depending on
# the configured save points).
#
# The Append Only File is an alternative persistence mode that provides
# much better durability. For instance using the default data fsync policy
# (see later in the config file) Redis can lose just one second of writes in a
# dramatic event like a server power outage, or a single write if something
# wrong with the Redis process itself happens, but the operating system is
# still running correctly.
#
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
#
# Please check http://redis.io/topics/persistence for more information.
appendonly no
# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"
# The fsync() call tells the Operating System to actually write data on disk
# instead of waiting for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
#
# Redis supports three different modes:
#
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
#
# The default is "everysec", as that's usually the right compromise between
# speed and data safety. It's up to you to understand if you can relax this to
# "no" that will let the operating system flush the output buffer when
# it wants, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting),
# or on the contrary, use "always" that's very slow but a bit safer than
# everysec.
#
# More details please check the following article:
# http://antirez.com/post/redis-persistence-demystified.html
#
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# When the AOF fsync policy is set to always or everysec, and a background
# saving process (a background save or AOF log background rewriting) is
# performing a lot of I/O against the disk, in some Linux configurations
# Redis may block too long on the fsync() call. Note that there is no fix for
# this currently, as even performing fsync in a different thread will block
# our synchronous write(2) call.
#
# In order to mitigate this problem it's possible to use the following option
# that will prevent fsync() from being called in the main process while a
# BGSAVE or BGREWRITEAOF is in progress.
#
# This means that while another child is saving, the durability of Redis is
# the same as "appendfsync none". In practical terms, this means that it is
# possible to lose up to 30 seconds of log in the worst scenario (with the
# default Linux settings).
#
# If you have latency problems turn this to "yes". Otherwise leave it as
# "no" that is the safest pick from the point of view of durability.
no-appendfsync-on-rewrite no
# Automatic rewrite of the append only file.
# Redis is able to automatically rewrite the log file implicitly calling
# BGREWRITEAOF when the AOF log size grows by the specified percentage.
#
# This is how it works: Redis remembers the size of the AOF file after the
# latest rewrite (if no rewrite has happened since the restart, the size of
# the AOF at startup is used).
#
# This base size is compared to the current size. If the current size is
# bigger than the specified percentage, the rewrite is triggered. Also
# you need to specify a minimal size for the AOF file to be rewritten, this
# is useful to avoid rewriting the AOF file even if the percentage increase
# is reached but it is still pretty small.
#
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# An AOF file may be found to be truncated at the end during the Redis
# startup process, when the AOF data gets loaded back into memory.
# This may happen when the system where Redis is running
# crashes, especially when an ext4 filesystem is mounted without the
# data=ordered option (however this can't happen when Redis itself
# crashes or aborts but the operating system still works correctly).
#
# Redis can either exit with an error when this happens, or load as much
# data as possible (the default now) and start if the AOF file is found
# to be truncated at the end. The following option controls this behavior.
#
# If aof-load-truncated is set to yes, a truncated AOF file is loaded and
# the Redis server starts emitting a log to inform the user of the event.
# Otherwise if the option is set to no, the server aborts with an error
# and refuses to start. When the option is set to no, the user requires
# to fix the AOF file using the "redis-check-aof" utility before to restart
# the server.
#
# Note that if the AOF file will be found to be corrupted in the middle
# the server will still exit with an error. This option only applies when
# Redis will try to read more data from the AOF file but not enough bytes
# will be found.
aof-load-truncated yes
################################ LUA SCRIPTING ###############################
# Max execution time of a Lua script in milliseconds.
#
# If the maximum execution time is reached Redis will log that a script is
# still in execution after the maximum allowed time and will start to
# reply to queries with an error.
#
# When a long running script exceeds the maximum execution time only the
# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be
# used to stop a script that did not yet called write commands. The second
# is the only way to shut down the server in the case a write command was
# already issued by the script but the user doesn't want to wait for the natural
# termination of the script.
#
# Set it to 0 or a negative value for unlimited execution without warnings.
lua-time-limit 5000
################################ REDIS CLUSTER ###############################
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however
# in order to mark it as "mature" we need to wait for a non trivial percentage
# of users to deploy it in production.
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
# cluster-enabled yes
# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
#
# cluster-config-file nodes-6379.conf
# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
#
# cluster-node-timeout 15000
# A slave of a failing master will avoid to start a failover if its data
# looks too old.
#
# There is no simple way for a slave to actually have a exact measure of
# its "data age", so the following two checks are performed:
#
# 1) If there are multiple slaves able to failover, they exchange messages
# in order to try to give an advantage to the slave with the best
# replication offset (more data from the master processed).
# Slaves will try to get their rank by offset, and apply to the start
# of the failover a delay proportional to their rank.
#
# 2) Every single slave computes the time of the last interaction with
# its master. This can be the last ping or command received (if the master
# is still in the "connected" state), or the time that elapsed since the
# disconnection with the master (if the replication link is currently down).
# If the last interaction is too old, the slave will not try to failover
# at all.
#
# The point "2" can be tuned by user. Specifically a slave will not perform
# the failover if, since the last interaction with the master, the time
# elapsed is greater than:
#
# (node-timeout * slave-validity-factor) + repl-ping-slave-period
#
# So for example if node-timeout is 30 seconds, and the slave-validity-factor
# is 10, and assuming a default repl-ping-slave-period of 10 seconds, the
# slave will not try to failover if it was not able to talk with the master
# for longer than 310 seconds.
#
# A large slave-validity-factor may allow slaves with too old data to failover
# a master, while a too small value may prevent the cluster from being able to
# elect a slave at all.
#
# For maximum availability, it is possible to set the slave-validity-factor
# to a value of 0, which means, that slaves will always try to failover the
# master regardless of the last time they interacted with the master.
# (However they'll always try to apply a delay proportional to their
# offset rank).
#
# Zero is the only value able to guarantee that when all the partitions heal
# the cluster will always be able to continue.
#
# cluster-slave-validity-factor 10
# Cluster slaves are able to migrate to orphaned masters, that are masters
# that are left without working slaves. This improves the cluster ability
# to resist to failures as otherwise an orphaned master can't be failed over
# in case of failure if it has no working slaves.
#
# Slaves migrate to orphaned masters only if there are still at least a
# given number of other working slaves for their old master. This number
# is the "migration barrier". A migration barrier of 1 means that a slave
# will migrate only if there is at least 1 other working slave for its master
# and so forth. It usually reflects the number of slaves you want for every
# master in your cluster.
#
# Default is 1 (slaves migrate only if their masters remain with at least
# one slave). To disable migration just set it to a very large value.
# A value of 0 can be set but is useful only for debugging and dangerous
# in production.
#
# cluster-migration-barrier 1
# By default Redis Cluster nodes stop accepting queries if they detect there
# is at least an hash slot uncovered (no available node is serving it).
# This way if the cluster is partially down (for example a range of hash slots
# are no longer covered) all the cluster becomes, eventually, unavailable.
# It automatically returns available as soon as all the slots are covered again.
#
# However sometimes you want the subset of the cluster which is working,
# to continue to accept queries for the part of the key space that is still
# covered. In order to do so, just set the cluster-require-full-coverage
# option to no.
#
# cluster-require-full-coverage yes
# In order to setup your cluster make sure to read the documentation
# available at http://redis.io web site.
################################## SLOW LOG ###################################
# The Redis Slow Log is a system to log queries that exceeded a specified
# execution time. The execution time does not include the I/O operations
# like talking with the client, sending the reply and so forth,
# but just the time needed to actually execute the command (this is the only
# stage of command execution where the thread is blocked and can not serve
# other requests in the meantime).
#
# You can configure the slow log with two parameters: one tells Redis
# what is the execution time, in microseconds, to exceed in order for the
# command to get logged, and the other parameter is the length of the
# slow log. When a new command is logged the oldest one is removed from the
# queue of logged commands.
# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
slowlog-log-slower-than 10000
# There is no limit to this length. Just be aware that it will consume memory.
# You can reclaim memory used by the slow log with SLOWLOG RESET.
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
# The Redis latency monitoring subsystem samples different operations
# at runtime in order to collect data related to possible sources of
# latency of a Redis instance.
#
# Via the LATENCY command this information is available to the user that can
# print graphs and obtain reports.
#
# The system only logs operations that were performed in a time equal or
# greater than the amount of milliseconds specified via the
# latency-monitor-threshold configuration directive. When its value is set
# to zero, the latency monitor is turned off.
#
# By default latency monitoring is disabled since it is mostly not needed
# if you don't have latency issues, and collecting data has a performance
# impact, that while very small, can be measured under big load. Latency
# monitoring can easily be enabled at runtime using the command
# "CONFIG SET latency-monitor-threshold <milliseconds>" if needed.
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
# Redis can notify Pub/Sub clients about events happening in the key space.
# This feature is documented at http://redis.io/topics/notifications
#
# For instance if keyspace events notification is enabled, and a client
# performs a DEL operation on key "foo" stored in the Database 0, two
# messages will be published via Pub/Sub:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# It is possible to select the events that Redis will notify among a set
# of classes. Every class is identified by a single character:
#
# K Keyspace events, published with __keyspace@<db>__ prefix.
# E Keyevent events, published with __keyevent@<db>__ prefix.
# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
# $ String commands
# l List commands
# s Set commands
# h Hash commands
# z Sorted set commands
# x Expired events (events generated every time a key expires)
# e Evicted events (events generated when a key is evicted for maxmemory)
# A Alias for g$lshzxe, so that the "AKE" string means all the events.
#
# The "notify-keyspace-events" takes as argument a string that is composed
# of zero or multiple characters. The empty string means that notifications
# are disabled.
#
# Example: to enable list and generic events, from the point of view of the
# event name, use:
#
# notify-keyspace-events Elg
#
# Example 2: to get the stream of the expired keys subscribing to channel
# name __keyevent@0__:expired use:
#
# notify-keyspace-events Ex
#
# By default all notifications are disabled because most users don't need
# this feature and the feature has some overhead. Note that if you don't
# specify at least one of K or E, no events will be delivered.
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
# Hashes are encoded using a memory efficient data structure when they have a
# small number of entries, and the biggest entry does not exceed a given
# threshold. These thresholds can be configured using the following directives.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# Lists are also encoded in a special way to save a lot of space.
# The number of entries allowed per internal list node can be specified
# as a fixed maximum size or a maximum number of elements.
# For a fixed maximum size, use -5 through -1, meaning:
# -5: max size: 64 Kb <-- not recommended for normal workloads
# -4: max size: 32 Kb <-- not recommended
# -3: max size: 16 Kb <-- probably not recommended
# -2: max size: 8 Kb <-- good
# -1: max size: 4 Kb <-- good
# Positive numbers mean store up to _exactly_ that number of elements
# per list node.
# The highest performing option is usually -2 (8 Kb size) or -1 (4 Kb size),
# but if your use case is unique, adjust the settings as necessary.
list-max-ziplist-size -2
# Lists may also be compressed.
# Compress depth is the number of quicklist ziplist nodes from *each* side of
# the list to *exclude* from compression. The head and tail of the list
# are always uncompressed for fast push/pop operations. Settings are:
# 0: disable all list compression
# 1: depth 1 means "don't start compressing until after 1 node into the list,
# going from either the head or tail"
# So: [head]->node->node->...->node->[tail]
# [head], [tail] will always be uncompressed; inner nodes will compress.
# 2: [head]->[next]->node->node->...->node->[prev]->[tail]
# 2 here means: don't compress head or head->next or tail->prev or tail,
# but compress all nodes between them.
# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail]
# etc.
list-compress-depth 0
# Sets have a special encoding in just one case: when a set is composed
# of just strings that happen to be integers in radix 10 in the range
# of 64 bit signed integers.
# The following configuration setting sets the limit in the size of the
# set in order to use this special memory saving encoding.
set-max-intset-entries 512
# Similarly to hashes and lists, sorted sets are also specially encoded in
# order to save a lot of space. This encoding is only used when the length and
# elements of a sorted set are below the following limits:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# HyperLogLog sparse representation bytes limit. The limit includes the
# 16 bytes header. When an HyperLogLog using the sparse representation crosses
# this limit, it is converted into the dense representation.
#
# A value greater than 16000 is totally useless, since at that point the
# dense representation is more memory efficient.
#
# The suggested value is ~ 3000 in order to have the benefits of
# the space efficient encoding without slowing down too much PFADD,
# which is O(N) with the sparse encoding. The value can be raised to
# ~ 10000 when CPU is not a concern, but space is, and the data set is
# composed of many HyperLogLogs with cardinality in the 0 - 15000 range.
hll-sparse-max-bytes 3000
# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in
# order to help rehashing the main Redis hash table (the one mapping top-level
# keys to values). The hash table implementation Redis uses (see dict.c)
# performs a lazy rehashing: the more operation you run into a hash table
# that is rehashing, the more rehashing "steps" are performed, so if the
# server is idle the rehashing is never complete and some more memory is used
# by the hash table.
#
# The default is to use this millisecond 10 times every second in order to
# actively rehash the main dictionaries, freeing memory when possible.
#
# If unsure:
# use "activerehashing no" if you have hard latency requirements and it is
# not a good thing in your environment that Redis can reply from time to time
# to queries with 2 milliseconds delay.
#
# use "activerehashing yes" if you don't have such hard requirements but
# want to free memory asap when possible.
activerehashing yes
# The client output buffer limits can be used to force disconnection of clients
# that are not reading data from the server fast enough for some reason (a
# common reason is that a Pub/Sub client can't consume messages as fast as the
# publisher can produce them).
#
# The limit can be set differently for the three different classes of clients:
#
# normal -> normal clients including MONITOR clients
# slave -> slave clients
# pubsub -> clients subscribed to at least one pubsub channel or pattern
#
# The syntax of every client-output-buffer-limit directive is the following:
#
# client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
#
# A client is immediately disconnected once the hard limit is reached, or if
# the soft limit is reached and remains reached for the specified number of
# seconds (continuously).
# So for instance if the hard limit is 32 megabytes and the soft limit is
# 16 megabytes / 10 seconds, the client will get disconnected immediately
# if the size of the output buffers reach 32 megabytes, but will also get
# disconnected if the client reaches 16 megabytes and continuously overcomes
# the limit for 10 seconds.
#
# By default normal clients are not limited because they don't receive data
# without asking (in a push way), but just after a request, so only
# asynchronous clients may create a scenario where data is requested faster
# than it can read.
#
# Instead there is a default limit for pubsub and slave clients, since
# subscribers and slaves receive data in a push fashion.
#
# Both the hard or the soft limit can be disabled by setting them to zero.
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# Redis calls an internal function to perform many background tasks, like
# closing connections of clients in timeout, purging expired keys that are
# never requested, and so forth.
#
# Not all tasks are performed with the same frequency, but Redis checks for
# tasks to perform according to the specified "hz" value.
#
# By default "hz" is set to 10. Raising the value will use more CPU when
# Redis is idle, but at the same time will make Redis more responsive when
# there are many keys expiring at the same time, and timeouts may be
# handled with more precision.
#
# The range is between 1 and 500, however a value over 100 is usually not
# a good idea. Most users should use the default of 10 and raise this up to
# 100 only in environments where very low latency is required.
hz 10
# When a child rewrites the AOF file, if the following option is enabled
# the file will be fsync-ed every 32 MB of data generated. This is useful
# in order to commit the file to the disk more incrementally and avoid
# big latency spikes.
aof-rewrite-incremental-fsync yes
================================================
FILE: ansible/roles/common/tasks/main.yml
================================================
---
- name: Create codis install directory
file: path={{ codis_install_dir }} state=directory owner=codis group=codis
- name: Create codis bin directory
file: path={{ codis_install_dir }}/bin state=directory owner=codis group=codis
- name: Create codis conf directory
file: path={{ codis_install_dir }}/config state=directory owner=codis group=codis
- name: Create codis admin directory
file: path={{ codis_install_dir }}/admin state=directory owner=codis group=codis
================================================
FILE: ansible/roles/redis-sentinel/tasks/main.yml
================================================
---
- name: Create redis sentinel work directory
file: path={{ redis_sentinel_workdir }} state=directory owner=codis group=codis
- name: Copy redis-sentinel binary
copy: src={{ codis_dir }}/bin/codis-server dest={{ codis_install_dir }}/bin/redis-sentinel mode=766
- name: Copy redis-sentinel configuration
template: src=sentinel.conf dest={{ codis_install_dir }}/config/sentinel.conf
- name: Copy redis-sentinel admin script
template: src=redis-sentinel-admin.sh dest={{ codis_install_dir }}/admin/redis-sentinel-admin.sh mode=766
- name: Restart redis-sentinel service
command: "{{ codis_install_dir }}/admin/redis-sentinel-admin.sh restart"
================================================
FILE: ansible/roles/redis-sentinel/templates/redis-sentinel-admin.sh
================================================
#!/usr/bin/env bash
CODIS_ADMIN="${BASH_SOURCE-$0}"
CODIS_ADMIN="$(dirname "${CODIS_ADMIN}")"
CODIS_ADMIN_DIR="$(cd "${CODIS_ADMIN}"; pwd)"
CODIS_BIN_DIR=$CODIS_ADMIN_DIR/../bin
CODIS_LOG_DIR=$CODIS_ADMIN_DIR/../log
CODIS_CONF_DIR=$CODIS_ADMIN_DIR/../config
REDIS_SENTINEL_BIN=$CODIS_BIN_DIR/redis-sentinel
REDIS_SENTINEL_PID_FILE={{ redis_sentinel_workdir }}/sentinel_{{ redis_sentinel_port }}.pid
REDIS_SENTINEL_LOG_FILE={{ redis_sentinel_workdir }}/sentinel_{{ redis_sentinel_port }}.log
REDIS_SENTINEL_DAEMON_FILE=$CODIS_LOG_DIR/redis-sentinel.out
REDIS_SENTINEL_CONF_FILE=$CODIS_CONF_DIR/sentinel.conf
echo $REDIS_SENTINEL_CONF_FILE
if [ ! -d $CODIS_LOG_DIR ]; then
mkdir -p $CODIS_LOG_DIR
fi
case $1 in
start)
echo "starting redis-sentinel ... "
if [ -f "$REDIS_SENTINEL_PID_FILE" ]; then
if kill -0 `cat "$REDIS_SENTINEL_PID_FILE"` > /dev/null 2>&1; then
echo $command already running as process `cat "$REDIS_SENTINEL_PID_FILE"`.
exit 0
fi
fi
nohup "$REDIS_SENTINEL_BIN" "${REDIS_SENTINEL_CONF_FILE}" > "$REDIS_SENTINEL_DAEMON_FILE" 2>&1 < /dev/null &
;;
stop)
echo "stopping redis-sentinel ... "
if [ ! -f "$REDIS_SENTINEL_PID_FILE" ]
then
echo "no redis-sentinel to stop (could not find file $REDIS_SENTINEL_PID_FILE)"
else
kill -2 $(cat "$REDIS_SENTINEL_PID_FILE")
echo STOPPED
fi
exit 0
;;
stop-forced)
echo "stopping redis-sentinel ... "
if [ ! -f "$REDIS_SENTINEL_PID_FILE" ]
then
echo "no redis-sentinel to stop (could not find file $REDIS_SENTINEL_PID_FILE)"
else
kill -9 $(cat "$REDIS_SENTINEL_PID_FILE")
rm "$REDIS_SENTINEL_PID_FILE"
echo STOPPED
fi
exit 0
;;
restart)
shift
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 {start|stop|stop-forced|restart}" >&2
esac
================================================
FILE: ansible/roles/redis-sentinel/templates/sentinel.conf
================================================
# Example sentinel.conf
# *** IMPORTANT ***
#
# By default Sentinel will not be reachable from interfaces different than
# localhost, either use the 'bind' directive to bind to a list of network
# interfaces, or disable protected mode with "protected-mode no" by
# adding it to this configuration file.
#
# Before doing that MAKE SURE the instance is protected from the outside
# world via firewalling or other means.
#
# For example you may use one of the following:
#
# bind 127.0.0.1 192.168.1.1
#
# protected-mode no
# port <sentinel-port>
# The port that this sentinel instance will run on
port {{ redis_sentinel_port }}
daemonize yes
logfile "{{ redis_sentinel_workdir }}/sentinel_{{ redis_sentinel_port }}.log"
pidfile "{{ redis_sentinel_workdir }}/sentinel_{{ redis_sentinel_port }}.pid"
# sentinel announce-ip <ip>
# sentinel announce-port <port>
#
# The above two configuration directives are useful in environments where,
# because of NAT, Sentinel is reachable from outside via a non-local address.
#
# When announce-ip is provided, the Sentinel will claim the specified IP address
# in HELLO messages used to gossip its presence, instead of auto-detecting the
# local address as it usually does.
#
# Similarly when announce-port is provided and is valid and non-zero, Sentinel
# will announce the specified TCP port.
#
# The two options don't need to be used together, if only announce-ip is
# provided, the Sentinel will announce the specified IP and the server port
# as specified by the "port" option. If only announce-port is provided, the
# Sentinel will announce the auto-detected local IP and the specified port.
#
# Example:
#
# sentinel announce-ip 1.2.3.4
# dir <working-directory>
# Every long running process should have a well-defined working directory.
# For Redis Sentinel to chdir to /tmp at startup is the simplest thing
# for the process to don't interfere with administrative tasks such as
# unmounting filesystems.
dir {{ redis_sentinel_workdir }}
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
#
# Tells Sentinel to monitor this master, and to consider it in O_DOWN
# (Objectively Down) state only if at least <quorum> sentinels agree.
#
# Note that whatever is the ODOWN quorum, a Sentinel will require to
# be elected by the majority of the known Sentinels in order to
# start a failover, so no failover can be performed in minority.
#
# Slaves are auto-discovered, so you don't need to specify slaves in
# any way. Sentinel itself will rewrite this configuration file adding
# the slaves using additional configuration options.
# Also note that the configuration file is rewritten when a
# slave is promoted to master.
#
# Note: master name should not include special characters or spaces.
# The valid charset is A-z 0-9 and the three characters ".-_".
# sentinel monitor mymaster 127.0.0.1 6379 2
# sentinel auth-pass <master-name> <password>
#
# Set the password to use to authenticate with the master and slaves.
# Useful if there is a password set in the Redis instances to monitor.
#
# Note that the master password is also used for slaves, so it is not
# possible to set a different password in masters and slaves instances
# if you want to be able to monitor these instances with Sentinel.
#
# However you can have Redis instances without the authentication enabled
# mixed with Redis instances requiring the authentication (as long as the
# password set is the same for all the instances requiring the password) as
# the AUTH command will have no effect in Redis instances with authentication
# switched off.
#
# Example:
#
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
# sentinel down-after-milliseconds <master-name> <milliseconds>
#
# Number of milliseconds the master (or any attached slave or sentinel) should
# be unreachable (as in, not acceptable reply to PING, continuously, for the
# specified period) in order to consider it in S_DOWN state (Subjectively
# Down).
#
# Default is 30 seconds.
# sentinel down-after-milliseconds mymaster 30000
# sentinel parallel-syncs <master-name> <numslaves>
#
# How many slaves we can reconfigure to point to the new slave simultaneously
# during the failover. Use a low number if you use the slaves to serve query
# to avoid that all the slaves will be unreachable at about the same
# time while performing the synchronization with the master.
# sentinel parallel-syncs mymaster 1
# sentinel failover-timeout <master-name> <milliseconds>
#
# Specifies the failover timeout in milliseconds. It is used in many ways:
#
# - The time needed to re-start a failover after a previous failover was
# already tried against the same master by a given Sentinel, is two
# times the failover timeout.
#
# - The time needed for a slave replicating to a wrong master according
# to a Sentinel current configuration, to be forced to replicate
# with the right master, is exactly the failover timeout (counting since
# the moment a Sentinel detected the misconfiguration).
#
# - The time needed to cancel a failover that is already in progress but
# did not produced any configuration change (SLAVEOF NO ONE yet not
# acknowledged by the promoted slave).
#
# - The maximum time a failover in progress waits for all the slaves to be
# reconfigured as slaves of the new master. However even after this time
# the slaves will be reconfigured by the Sentinels anyway, but not with
# the exact parallel-syncs progression as specified.
#
# Default is 3 minutes.
# sentinel failover-timeout mymaster 180000
# SCRIPTS EXECUTION
#
# sentinel notification-script and sentinel reconfig-script are used in order
# to configure scripts that are called to notify the system administrator
# or to reconfigure clients after a failover. The scripts are executed
# with the following rules for error handling:
#
# If script exits with "1" the execution is retried later (up to a maximum
# number of times currently set to 10).
#
# If script exits with "2" (or an higher value) the script execution is
# not retried.
#
# If script terminates because it receives a signal the behavior is the same
# as exit code 1.
#
# A script has a maximum running time of 60 seconds. After this limit is
# reached the script is terminated with a SIGKILL and the execution retried.
# NOTIFICATION SCRIPT
#
# sentinel notification-script <master-name> <script-path>
#
# Call the specified notification script for any sentinel event that is
# generated in the WARNING level (for instance -sdown, -odown, and so forth).
# This script should notify the system administrator via email, SMS, or any
# other messaging system, that there is something wrong with the monitored
# Redis systems.
#
# The script is called with just two arguments: the first is the event type
# and the second the event description.
#
# The script must exist and be executable in order for sentinel to start if
# this option is provided.
#
# Example:
#
# sentinel notification-script mymaster /var/redis/notify.sh
# CLIENTS RECONFIGURATION SCRIPT
#
# sentinel client-reconfig-script <master-name> <script-path>
#
# When the master changed because of a failover a script can be called in
# order to perform application-specific tasks to notify the clients that the
# configuration has changed and the master is at a different address.
#
# The following arguments are passed to the script:
#
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
#
# <state> is currently always "failover"
# <role> is either "leader" or "observer"
#
# The arguments from-ip, from-port, to-ip, to-port are used to communicate
# the old address of the master and the new address of the elected slave
# (now a master).
#
# This script should be resistant to multiple invocations.
#
# Example:
#
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
================================================
FILE: ansible/site.yml
================================================
---
- name: codis environment init
hosts: all
remote_user: codis
roles:
- common
- name: Install codis-dashboard
hosts: codis-dashboard-servers
remote_user: codis
roles:
- codis-dashboard
- name: Install codis-proxy
hosts: codis-proxy-servers
remote_user: codis
roles:
- codis-proxy
- name: Install codis-server
hosts: codis-servers
remote_user: codis
roles:
- codis-server
- name: Install redis-sentinel
hosts: redis-sentinel-servers
remote_user: codis
roles:
- redis-sentinel
- name: Install codis-fe
hosts: codis-fe-servers
remote_user: codis
roles:
- codis-fe
================================================
FILE: cmd/admin/admin.go
================================================
// Copyright 2016 CodisLabs. All Rights Reserved.
// Licensed under the MIT (MIT-LICENSE.txt) license.
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"path/filepath"
"time"
"github.com/CodisLabs/codis/pkg/models"
"github.com/CodisLabs/codis/pkg/utils"
"github.com/CodisLabs/codis/pkg/utils/log"
)
type cmdAdmin struct {
product string
}
func (t *cmdAdmin) Main(d map[string]interface{}) {
t.product, _ = d["--product"].(string)
switch {
case d["--remove-lock"].(bool):
t.handleRemoveLock(d)
case d["--config-dump"].(bool):
t.handleConfigDump(d)
case d["--config-convert"] != nil:
t.handleConfigConvert(d)
case d["--config-restore"] != nil:
t.handleConfigRestore(d)
case d["--dashboard-list"].(bool):
t.handleDashboardList(d)
}
}
func (t *cmdAdmin) newTopomClient(d map[string]interface{}) models.Client {
var coordinator struct {
name string
addr string
auth string
}
switch {
case d["--zookeeper"] != nil:
coordinator.name = "zookeeper"
coordinator.addr = utils.ArgumentMust(d, "--zookeeper")
if d["--zookeeper-auth"] != nil {
coordinator.auth = utils.ArgumentMust(d, "--zookeeper-auth")
}
case d["--etcd"] != nil:
coordinator.name = "etcd"
coordinator.addr = utils.ArgumentMust(d, "--etcd")
if d["--etcd-auth"] != nil {
coordinator.auth = utils.ArgumentMust(d, "--etcd-auth")
}
case d["--filesystem"] != nil:
coordinator.name = "filesystem"
coordinator.addr = utils.ArgumentMust(d, "--filesystem")
default:
log.Panicf("invalid coordinator")
}
c, err := models.NewClient(coordinator.name, coordinator.addr, coordinator.auth, time.Minute)
if err != nil {
log.PanicErrorf(err, "create '%s' client to '%s' failed", coordinator.name, coordinator.addr)
}
return c
}
func (t *cmdAdmin) newTopomStore(d map[string]interface{}) *models.Store {
if err := models.ValidateProduct(t.product); err != nil {
log.PanicErrorf(err, "invalid product name")
}
client := t.newTopomClient(d)
return models.NewStore(client, t.product)
}
func (t *cmdAdmin) handleRemoveLock(d map[string]interface{}) {
store := t.newTopomStore(d)
defer store.Close()
log.Debugf("force remove-lock")
if err := store.Release(); err != nil {
log.PanicErrorf(err, "force remove-lock failed")
}
log.Debugf("force remove-lock OK")
}
func (t *cmdAdmin) handleConfigDump(d map[string]interface{}) {
switch {
case d["-1"].(bool):
t.dumpConfigV1(d)
default:
t.dumpConfigV3(d)
}
}
type ConfigV3 struct {
Slots []*models.SlotMapping `json:"slots,omitempty"`
Group []*models.Group `json:"group,omitempty"`
Proxy []*models.Proxy `json:"proxy,omitempty"`
}
func (t *cmdAdmin) dumpConfigV1(d map[string]interface{}) {
client := t.newTopomClient(d)
defer client.Close()
prefix := filepath.Join("/zk/codis", fmt.Sprintf("db_%s", t.product))
config := t.dumpConfigV1Recursively(client, prefix)
if m, ok := config.(map[string]interface{}); !ok || m == nil {
log.Panicf("cann't find product = %s [v1]", t.product)
}
b, err := json.MarshalIndent(config, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
}
func (t *cmdAdmin) dumpConfigV1Recursively(client models.Client, path string) interface{} {
files, err := client.List(path, false)
if err != nil {
log.PanicErrorf(err, "list path = %s failed", path)
}
if len(files) != 0 {
var m = make(map[string]interface{})
for _, path := range files {
m[filepath.Base(path)] = t.dumpConfigV1Recursively(client, path)
}
return m
}
b, err := client.Read(path, false)
if err != nil {
log.PanicErrorf(err, "read file = %s failed", path)
}
if len(b) != 0 {
var v interface{}
if err := json.Unmarshal(b, &v); err != nil {
log.PanicErrorf(err, "json unmarshal failed")
}
return v
}
return nil
}
func (t *cmdAdmin) dumpConfigV3(d map[string]interface{}) {
store := t.newTopomStore(d)
defer store.Close()
group, err := store.ListGroup()
if err != nil {
log.PanicErrorf(err, "list group failed")
}
proxy, err := store.ListProxy()
if err != nil {
log.PanicErrorf(err, "list proxy failed")
}
if len(group) == 0 && len(proxy) == 0 {
log.Panicf("cann't find product = %s [v3]", t.product)
}
slots, err := store.SlotMappings()
if err != nil {
log.PanicErrorf(err, "list slots failed")
}
config := &ConfigV3{
Slots: slots,
Group: models.SortGroup(group),
Proxy: models.SortProxy(proxy),
}
b, err := json.MarshalIndent(config, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
}
func (t *cmdAdmin) loadJsonConfigV1(file string) map[string]interface{} {
b, err := ioutil.ReadFile(file)
if err != nil {
log.PanicErrorf(err, "read file '%s' failed", file)
}
var v interface{}
if err := json.Unmarshal(b, &v); err != nil {
log.PanicErrorf(err, "json unmarshal failed")
}
return v.(map[string]interface{})
}
func (t *cmdAdmin) convertSlotsV1(slots map[int]*models.SlotMapping, v interface{}) {
m := v.(map[string]interface{})
var sid = int(m["id"].(float64))
var gid = int(m["group_id"].(float64))
var status = m["state"].(map[string]interface{})["status"].(string)
log.Debugf("found slot-%04d status = %s", sid, status)
switch status {
case "online":
case "offline":
return
default:
log.Panicf("invalid slot status")
}
if slots[sid] != nil {
log.Panicf("slot-%04d already exists", sid)
}
slots[sid] = &models.SlotMapping{
Id: sid, GroupId: gid,
}
}
func (t *cmdAdmin) convertGroupV1(group map[int]*models.Group, v interface{}) {
m := v.(map[string]interface{})
var addr = m["addr"].(string)
var gid = int(m["group_id"].(float64))
var master = m["type"].(string) == "master"
log.Debugf("found group-%04d %s is master = %t", gid, addr, master)
if gid <= 0 || gid > models.MaxGroupId {
log.Panicf("invalid group = %d", gid)
}
if group[gid] == nil {
group[gid] = &models.Group{Id: gid}
}
g := group[gid]
servers := []*models.GroupServer{}
if master {
servers = append(servers, &models.GroupServer{Addr: addr})
servers = append(servers, g.Servers...)
} else {
servers = append(servers, g.Servers...)
servers = append(servers, &models.GroupServer{Addr: addr})
}
g.Servers = servers
}
func (t *cmdAdmin) handleConfigConvert(d map[string]interface{}) {
defer func() {
if x := recover(); x != nil {
log.Panicf("convert config failed: %+v", x)
}
}()
cfg1 := t.loadJsonConfigV1(utils.ArgumentMust(d, "--config-convert"))
cfg2 := &ConfigV3{}
if slots := cfg1["slots"]; slots != nil {
temp := make(map[int]*models.SlotMapping)
for _, v := range slots.(map[string]interface{}) {
t.convertSlotsV1(temp, v)
}
for i := 0; i < models.MaxSlotNum; i++ {
if temp[i] == nil {
continue
}
cfg2.Slots = append(cfg2.Slots, temp[i])
}
}
if servers := cfg1["servers"]; servers != nil {
group := make(map[int]*models.Group)
for _, g := range servers.(map[string]interface{}) {
for _, v := range g.(map[string]interface{}) {
t.convertGroupV1(group, v)
}
}
cfg2.Group = models.SortGroup(group)
}
b, err := json.MarshalIndent(cfg2, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
}
func (t *cmdAdmin) loadJsonConfigV3(file string) *ConfigV3 {
b, err := ioutil.ReadFile(file)
if err != nil {
log.PanicErrorf(err, "read file '%s' failed", file)
}
config := &ConfigV3{}
if err := json.Unmarshal(b, config); err != nil {
log.PanicErrorf(err, "json unmarshal failed")
}
var proxy = make(map[string]*models.Proxy)
for _, p := range config.Proxy {
if proxy[p.Token] != nil {
log.Panicf("proxy-%s already exists", p.Token)
}
proxy[p.Token] = p
}
var group = make(map[int]*models.Group)
var maddr = make(map[string]bool)
for _, g := range config.Group {
if g.Id <= 0 || g.Id > models.MaxGroupId {
log.Panicf("invalid group id = %d", g.Id)
}
if group[g.Id] != nil {
log.Panicf("group-%04d already exists", g.Id)
}
if g.Promoting.State != models.ActionNothing {
log.Panicf("gorup-%04d is promoting", g.Id)
}
for _, x := range g.Servers {
addr := x.Addr
if maddr[addr] {
log.Panicf("server %s already exists", addr)
}
maddr[addr] = true
}
group[g.Id] = g
}
var slots = make(map[int]*models.SlotMapping)
for _, s := range config.Slots {
if s.Id < 0 || s.Id >= models.MaxSlotNum {
log.Panicf("invalid slot id = %d", s.Id)
}
if slots[s.Id] != nil {
log.Panicf("slot-%04d already exists", s.Id)
}
if s.Action.State != models.ActionNothing {
log.Panicf("slot-%04d action is not empty", s.Id)
}
if g := group[s.GroupId]; g == nil || len(g.Servers) == 0 {
log.Panicf("slot-%04d with group-%04d doesn't exist or empty", s.Id, s.GroupId)
}
slots[s.Id] = s
}
return config
}
func (t *cmdAdmin) handleConfigRestore(d map[string]interface{}) {
store := t.newTopomStore(d)
defer store.Close()
config := t.loadJsonConfigV3(utils.ArgumentMust(d, "--config-restore"))
if !d["--confirm"].(bool) {
b, err := json.MarshalIndent(config, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
return
}
proxy, err := store.ListProxy()
if err != nil {
log.PanicErrorf(err, "list proxy failed")
}
group, err := store.ListGroup()
if err != nil {
log.PanicErrorf(err, "list group failed")
}
if len(group) != 0 || len(proxy) != 0 {
log.Panicf("product %s is not empty", t.product)
}
for _, s := range config.Slots {
if err := store.UpdateSlotMapping(s); err != nil {
log.PanicErrorf(err, "restore slot-%04d failed", s.Id)
}
}
for _, g := range config.Group {
if err := store.UpdateGroup(g); err != nil {
log.PanicErrorf(err, "restore group-%04d failed", g.Id)
}
}
for _, p := range config.Proxy {
if err := store.UpdateProxy(p); err != nil {
log.PanicErrorf(err, "restore proxy-%s failed", p.Token)
}
}
}
func (t *cmdAdmin) handleDashboardList(d map[string]interface{}) {
client := t.newTopomClient(d)
defer client.Close()
list, err := client.List(models.CodisDir, false)
if err != nil {
log.PanicErrorf(err, "list products failed")
}
nodes := []interface{}{}
for _, path := range list {
var elem = &struct {
Name string `json:"name"`
Dashboard string `json:"dashboard"`
}{filepath.Base(path), ""}
if b, err := client.Read(models.LockPath(elem.Name), false); err != nil {
log.PanicErrorf(err, "read topom of product %s failed", elem.Name)
} else if b != nil {
var t = &models.Topom{}
if err := json.Unmarshal(b, t); err != nil {
log.PanicErrorf(err, "decode json failed")
}
elem.Dashboard = t.AdminAddr
}
nodes = append(nodes, elem)
}
if b, err := json.MarshalIndent(nodes, "", " "); err != nil {
log.PanicErrorf(err, "json encode failed")
} else {
fmt.Println(string(b))
}
}
================================================
FILE: cmd/admin/dashboard.go
================================================
// Copyright 2016 CodisLabs. All Rights Reserved.
// Licensed under the MIT (MIT-LICENSE.txt) license.
package main
import (
"encoding/json"
"fmt"
"sort"
"strconv"
"github.com/CodisLabs/codis/pkg/models"
"github.com/CodisLabs/codis/pkg/topom"
"github.com/CodisLabs/codis/pkg/utils"
"github.com/CodisLabs/codis/pkg/utils/log"
"github.com/CodisLabs/codis/pkg/utils/math2"
)
type cmdDashboard struct {
addr string
}
func (t *cmdDashboard) Main(d map[string]interface{}) {
t.addr = utils.ArgumentMust(d, "--dashboard")
switch {
default:
t.handleOverview(d)
case d["--shutdown"].(bool):
t.handleShutdown(d)
case d["--reload"].(bool):
t.handleReload(d)
case d["--log-level"] != nil:
t.handleLogLevel(d)
case d["--slots-assign"].(bool):
fallthrough
case d["--slots-status"].(bool):
t.handleSlotsCommand(d)
case d["--create-proxy"].(bool):
fallthrough
case d["--online-proxy"].(bool):
fallthrough
case d["--remove-proxy"].(bool):
fallthrough
case d["--reinit-proxy"].(bool):
fallthrough
case d["--proxy-status"].(bool):
t.handleProxyCommand(d)
case d["--create-group"].(bool):
fallthrough
case d["--remove-group"].(bool):
fallthrough
case d["--resync-group"].(bool):
fallthrough
case d["--group-add"].(bool):
fallthrough
case d["--group-del"].(bool):
fallthrough
case d["--group-status"].(bool):
fallthrough
case d["--replica-groups"].(bool):
fallthrough
case d["--promote-server"].(bool):
t.handleGroupCommand(d)
case d["--sentinel-add"].(bool):
fallthrough
case d["--sentinel-del"].(bool):
fallthrough
case d["--sentinel-resync"].(bool):
t.handleSentinelCommand(d)
case d["--sync-action"].(bool):
t.handleSyncActionCommand(d)
case d["--slot-action"].(bool):
t.handleSlotActionCommand(d)
case d["--rebalance"].(bool):
t.handleSlotRebalance(d)
}
}
func (t *cmdDashboard) newTopomClient() *topom.ApiClient {
c := topom.NewApiClient(t.addr)
log.Debugf("call rpc model to dashboard %s", t.addr)
p, err := c.Model()
if err != nil {
log.PanicErrorf(err, "call rpc model to dashboard %s failed", t.addr)
}
log.Debugf("call rpc model OK")
c.SetXAuth(p.ProductName)
log.Debugf("call rpc xping to dashboard %s", t.addr)
if err := c.XPing(); err != nil {
log.PanicErrorf(err, "call rpc xping to dashboard %s failed", t.addr)
}
log.Debugf("call rpc xping OK")
return c
}
func (t *cmdDashboard) handleOverview(d map[string]interface{}) {
c := t.newTopomClient()
log.Debugf("call rpc overview to dashboard %s", t.addr)
o, err := c.Overview()
if err != nil {
log.PanicErrorf(err, "call rpc overview to dashboard %s failed", t.addr)
}
log.Debugf("call rpc overview OK")
var cmd string
for _, s := range []string{"config", "model", "slots", "stats", "group", "proxy", "--list-group", "--list-proxy"} {
if d[s].(bool) {
cmd = s
}
}
var obj interface{}
switch cmd {
default:
obj = o
case "config":
obj = o.Config
case "model":
obj = o.Model
case "stats":
obj = o.Stats
case "slots":
if o.Stats != nil {
obj = o.Stats.Slots
}
case "group":
if o.Stats != nil {
obj = o.Stats.Group
}
case "--list-group":
if o.Stats != nil {
obj = o.Stats.Group.Models
}
case "proxy":
if o.Stats != nil {
obj = o.Stats.Proxy
}
case "--list-proxy":
if o.Stats != nil {
obj = o.Stats.Proxy.Models
}
}
b, err := json.MarshalIndent(obj, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
}
func (t *cmdDashboard) handleLogLevel(d map[string]interface{}) {
c := t.newTopomClient()
s := utils.ArgumentMust(d, "--log-level")
var v log.LogLevel
if !v.ParseFromString(s) {
log.Panicf("option --log-level = %s", s)
}
log.Debugf("call rpc loglevel to dashboard %s", t.addr)
if err := c.LogLevel(v); err != nil {
log.PanicErrorf(err, "call rpc loglevel to dashboard %s failed", t.addr)
}
log.Debugf("call rpc loglevel OK")
}
func (t *cmdDashboard) handleShutdown(d map[string]interface{}) {
c := t.newTopomClient()
log.Debugf("call rpc shutdown to dashboard %s", t.addr)
if err := c.Shutdown(); err != nil {
log.PanicErrorf(err, "call rpc shutdown to dashboard %s failed", t.addr)
}
log.Debugf("call rpc shutdown OK")
}
func (t *cmdDashboard) handleReload(d map[string]interface{}) {
c := t.newTopomClient()
log.Debugf("call rpc reload to dashboard %s", t.addr)
if err := c.Reload(); err != nil {
log.PanicErrorf(err, "call rpc reload to dashboard %s failed", t.addr)
}
log.Debugf("call rpc reload OK")
}
func (t *cmdDashboard) handleSlotsCommand(d map[string]interface{}) {
c := t.newTopomClient()
switch {
case d["--slots-status"].(bool):
log.Debugf("call rpc slots to dashboard %s", t.addr)
o, err := c.Slots()
if err != nil {
log.PanicErrorf(err, "call rpc slots to dashboard %s failed", t.addr)
}
log.Debugf("call rpc slots OK")
b, err := json.MarshalIndent(o, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
case d["--slots-assign"].(bool) && d["--offline"].(bool):
beg := utils.ArgumentIntegerMust(d, "--beg")
end := utils.ArgumentIntegerMust(d, "--end")
slots := []*models.SlotMapping{}
for i := beg; i <= end; i++ {
slots = append(slots, &models.SlotMapping{
Id: i,
})
}
if !d["--confirm"].(bool) {
b, err := json.MarshalIndent(slots, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
return
}
log.Debugf("call rpc slots-assign to dashboard %s", t.addr)
if err := c.SlotsAssignOffline(slots); err != nil {
log.PanicErrorf(err, "call rpc slots-assign to dashboard %s failed", t.addr)
}
log.Debugf("call rpc slots-assign OK")
case d["--slots-assign"].(bool) && !d["--offline"].(bool):
beg := utils.ArgumentIntegerMust(d, "--beg")
end := utils.ArgumentIntegerMust(d, "--end")
gid := utils.ArgumentIntegerMust(d, "--gid")
slots := []*models.SlotMapping{}
for i := beg; i <= end; i++ {
slots = append(slots, &models.SlotMapping{
Id: i, GroupId: gid,
})
}
if !d["--confirm"].(bool) {
b, err := json.MarshalIndent(slots, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
return
}
log.Debugf("call rpc slots-assign to dashboard %s", t.addr)
if err := c.SlotsAssignGroup(slots); err != nil {
log.PanicErrorf(err, "call rpc slots-assign to dashboard %s failed", t.addr)
}
log.Debugf("call rpc slots-assign OK")
}
}
func (t *cmdDashboard) parseProxyTokens(d map[string]interface{}) []string {
switch {
default:
log.Panicf("can't find specific proxy")
return nil
case d["--token"] != nil:
return []string{utils.ArgumentMust(d, "--token")}
case d["--pid"] != nil:
pid := utils.ArgumentIntegerMust(d, "--pid")
c := t.newTopomClient()
log.Debugf("call rpc stats to dashboard %s", t.addr)
s, err := c.Stats()
if err != nil {
log.PanicErrorf(err, "call rpc stats to dashboard %s failed", t.addr)
}
log.Debugf("call rpc stats OK")
var tokens []string
for _, p := range s.Proxy.Models {
if p.Id == pid {
tokens = append(tokens, p.Token)
}
}
if len(tokens) != 0 {
return tokens
}
if !d["--force"].(bool) {
log.Panicf("can't find specific proxy with id = %d", pid)
}
return nil
case d["--addr"] != nil:
addr := utils.ArgumentMust(d, "--addr")
c := t.newTopomClient()
log.Debugf("call rpc stats to dashboard %s", t.addr)
s, err := c.Stats()
if err != nil {
log.PanicErrorf(err, "call rpc stats to dashboard %s failed", t.addr)
}
log.Debugf("call rpc stats OK")
var tokens []string
for _, p := range s.Proxy.Models {
if p.AdminAddr == addr {
tokens = append(tokens, p.Token)
}
}
if len(tokens) != 0 {
return tokens
}
if !d["--force"].(bool) {
log.Panicf("can't find specific proxy with addr = %s", addr)
}
return nil
}
}
func (t *cmdDashboard) handleProxyCommand(d map[string]interface{}) {
c := t.newTopomClient()
switch {
case d["--create-proxy"].(bool):
addr := utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc create-proxy to dashboard %s", t.addr)
if err := c.CreateProxy(addr); err != nil {
log.PanicErrorf(err, "call rpc create-proxy to dashboard %s failed", t.addr)
}
log.Debugf("call rpc create-proxy OK")
case d["--online-proxy"].(bool):
addr := utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc online-proxy to dashboard %s", t.addr)
if err := c.OnlineProxy(addr); err != nil {
log.PanicErrorf(err, "call rpc online-proxy to dashboard %s failed", t.addr)
}
log.Debugf("call rpc online-proxy OK")
case d["--remove-proxy"].(bool):
force := d["--force"].(bool)
for _, token := range t.parseProxyTokens(d) {
log.Debugf("call rpc remove-proxy to dashboard %s", t.addr)
if err := c.RemoveProxy(token, force); err != nil {
log.PanicErrorf(err, "call rpc remove-proxy to dashboard %s failed", t.addr)
}
log.Debugf("call rpc remove-proxy OK")
}
case d["--reinit-proxy"].(bool):
switch {
default:
for _, token := range t.parseProxyTokens(d) {
log.Debugf("call rpc reinit-proxy to dashboard %s", t.addr)
if err := c.ReinitProxy(token); err != nil {
log.PanicErrorf(err, "call rpc reinit-proxy to dashboard %s failed", t.addr)
}
log.Debugf("call rpc reinit-proxy OK")
}
case d["--all"].(bool):
log.Debugf("call rpc stats to dashboard %s", t.addr)
s, err := c.Stats()
if err != nil {
log.PanicErrorf(err, "call rpc stats to dashboard %s failed", t.addr)
}
log.Debugf("call rpc stats OK")
for _, p := range s.Proxy.Models {
fmt.Printf("reinit proxy: %s\n", p.Encode())
log.Debugf("call rpc reinit-proxy to dashboard %s", t.addr)
if err := c.ReinitProxy(p.Token); err != nil {
log.PanicErrorf(err, "call rpc reinit-proxy to dashboard %s failed", t.addr)
}
log.Debugf("call rpc reinit-proxy OK")
}
}
case d["--proxy-status"].(bool):
log.Debugf("call rpc stats to dashboard %s", t.addr)
s, err := c.Stats()
if err != nil {
log.PanicErrorf(err, "call rpc stats to dashboard %s failed", t.addr)
}
log.Debugf("call rpc stats OK")
var format string
var wpid int
for _, p := range s.Proxy.Models {
wpid = math2.MaxInt(wpid, len(strconv.Itoa(p.Id)))
}
format += fmt.Sprintf("proxy-%%0%dd [T] %%s", wpid)
var waddr1, waddr2 int
for _, p := range s.Proxy.Models {
waddr1 = math2.MaxInt(waddr1, len(p.AdminAddr))
waddr2 = math2.MaxInt(waddr2, len(p.ProxyAddr))
}
format += fmt.Sprintf(" [A] %%-%ds", waddr1)
format += fmt.Sprintf(" [P] %%-%ds", waddr2)
for _, p := range s.Proxy.Models {
var xfmt string
switch stats := s.Proxy.Stats[p.Token]; {
case stats == nil:
xfmt = "[?] " + format
case stats.Error != nil:
xfmt = "[E] " + format
case stats.Timeout || stats.Stats == nil:
xfmt = "[T] " + format
default:
xfmt = "[ ] " + format
}
fmt.Printf(xfmt, p.Id, p.Token, p.AdminAddr, p.ProxyAddr)
fmt.Println()
}
}
}
func (t *cmdDashboard) handleGroupCommand(d map[string]interface{}) {
c := t.newTopomClient()
switch {
case d["--create-group"].(bool):
gid := utils.ArgumentIntegerMust(d, "--gid")
log.Debugf("call rpc create-group to dashboard %s", t.addr)
if err := c.CreateGroup(gid); err != nil {
log.PanicErrorf(err, "call rpc create-group to dashboard %s failed", t.addr)
}
log.Debugf("call rpc create-group OK")
case d["--remove-group"].(bool):
gid := utils.ArgumentIntegerMust(d, "--gid")
log.Debugf("call rpc remove-group to dashboard %s", t.addr)
if err := c.RemoveGroup(gid); err != nil {
log.PanicErrorf(err, "call rpc remove-group to dashboard %s failed", t.addr)
}
log.Debugf("call rpc remove-group OK")
case d["--resync-group"].(bool):
switch {
case d["--all"].(bool):
stats, err := c.Stats()
if err != nil {
log.PanicErrorf(err, "call rpc stats to dashboard %s failed", t.addr)
}
log.Debugf("call rpc stats OK")
for _, g := range stats.Group.Models {
log.Debugf("call rpc resync-group [%d] to dashboard %s", g.Id, t.addr)
if err := c.ResyncGroup(g.Id); err != nil {
log.PanicErrorf(err, "call rpc resync-group to dashboard %s failed", t.addr)
}
}
log.Debugf("call rpc resync-group OK")
default:
gid := utils.ArgumentIntegerMust(d, "--gid")
log.Debugf("call rpc resync-group to dashboard %s", t.addr)
if err := c.ResyncGroup(gid); err != nil {
log.PanicErrorf(err, "call rpc resync-group to dashboard %s failed", t.addr)
}
log.Debugf("call rpc resync-group OK")
}
case d["--group-add"].(bool):
gid, addr := utils.ArgumentIntegerMust(d, "--gid"), utils.ArgumentMust(d, "--addr")
dc, _ := utils.Argument(d, "--datacenter")
log.Debugf("call rpc group-add-server to dashboard %s", t.addr)
if err := c.GroupAddServer(gid, dc, addr); err != nil {
log.PanicErrorf(err, "call rpc group-add-server to dashboard %s failed", t.addr)
}
log.Debugf("call rpc group-add-server OK")
case d["--group-del"].(bool):
gid, addr := utils.ArgumentIntegerMust(d, "--gid"), utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc group-del-server to dashboard %s", t.addr)
if err := c.GroupDelServer(gid, addr); err != nil {
log.PanicErrorf(err, "call rpc group-del-server to dashboard %s failed", t.addr)
}
log.Debugf("call rpc group-del-server OK")
case d["--replica-groups"].(bool):
gid, addr := utils.ArgumentIntegerMust(d, "--gid"), utils.ArgumentMust(d, "--addr")
value := d["--enable"].(bool)
log.Debugf("call rpc replica-groups to dashboard %s", t.addr)
if err := c.EnableReplicaGroups(gid, addr, value); err != nil {
log.PanicErrorf(err, "call rpc replica-groups to dashboard %s failed", t.addr)
}
log.Debugf("call rpc replica-groups to dashboard OK")
case d["--promote-server"].(bool):
gid, addr := utils.ArgumentIntegerMust(d, "--gid"), utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc group-promote-server to dashboard %s", t.addr)
if err := c.GroupPromoteServer(gid, addr); err != nil {
log.PanicErrorf(err, "call rpc group-promote-server to dashboard %s failed", t.addr)
}
log.Debugf("call rpc group-promote-server OK")
fallthrough
case d["--group-status"].(bool):
log.Debugf("call rpc stats to dashboard %s", t.addr)
s, err := c.Stats()
if err != nil {
log.PanicErrorf(err, "call rpc stats to dashboard %s failed", t.addr)
}
log.Debugf("call rpc stats OK")
var format string
var wgid, widx int
for _, g := range s.Group.Models {
wgid = math2.MaxInt(wgid, len(strconv.Itoa(g.Id)))
for i, _ := range g.Servers {
widx = math2.MaxInt(widx, len(strconv.Itoa(i)))
}
}
format += fmt.Sprintf("group-%%0%dd [%%0%dd]", wgid, widx)
var waddr int
for _, g := range s.Group.Models {
for _, x := range g.Servers {
waddr = math2.MaxInt(waddr, len(x.Addr))
}
}
format += fmt.Sprintf(" %%-%ds", waddr)
for _, g := range s.Group.Models {
for i, x := range g.Servers {
var addr = x.Addr
switch stats := s.Group.Stats[addr]; {
case stats == nil:
fmt.Printf("[?] "+format, g.Id, i, addr)
case stats.Error != nil:
fmt.Printf("[E] "+format, g.Id, i, addr)
case stats.Timeout || stats.Stats == nil:
fmt.Printf("[T] "+format, g.Id, i, addr)
default:
var master string
if s, ok := stats.Stats["master_addr"]; ok {
master = s + ":" + stats.Stats["master_link_status"]
} else {
master = "NO:ONE"
}
var expect string
if i == 0 {
expect = "NO:ONE"
} else {
expect = g.Servers[0].Addr + ":up"
}
if master == expect {
fmt.Printf("[ ] "+format, g.Id, i, addr)
} else {
fmt.Printf("[X] "+format, g.Id, i, addr)
}
fmt.Printf(" ==> %s", master)
}
fmt.Println()
}
}
}
}
func (t *cmdDashboard) handleSentinelCommand(d map[string]interface{}) {
c := t.newTopomClient()
switch {
case d["--sentinel-add"].(bool):
addr := utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc add-sentinel to dashboard %s", t.addr)
if err := c.AddSentinel(addr); err != nil {
log.PanicErrorf(err, "call rpc add-sentinel to dashboard %s failed", t.addr)
}
log.Debugf("call rpc add-sentinel OK")
case d["--sentinel-del"].(bool):
addr := utils.ArgumentMust(d, "--addr")
force := d["--force"].(bool)
log.Debugf("call rpc del-sentinel to dashboard %s", t.addr)
if err := c.DelSentinel(addr, force); err != nil {
log.PanicErrorf(err, "call rpc del-sentinel to dashboard %s failed", t.addr)
}
log.Debugf("call rpc del-sentinel OK")
case d["--sentinel-resync"].(bool):
log.Debugf("call rpc resync-sentinels to dashboard %s", t.addr)
if err := c.ResyncSentinels(); err != nil {
log.PanicErrorf(err, "call rpc resync-sentinels to dashboard %s failed", t.addr)
}
log.Debugf("call rpc resync-sentinels OK")
}
}
func (t *cmdDashboard) handleSyncActionCommand(d map[string]interface{}) {
c := t.newTopomClient()
switch {
case d["--create"].(bool):
addr := utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc create-sync-action to dashboard %s", t.addr)
if err := c.SyncCreateAction(addr); err != nil {
log.PanicErrorf(err, "call rpc create-sync-action to dashboard %s failed", t.addr)
}
log.Debugf("call rpc create-sync-action OK")
case d["--remove"].(bool):
addr := utils.ArgumentMust(d, "--addr")
log.Debugf("call rpc remove-sync-action to dashboard %s", t.addr)
if err := c.SyncRemoveAction(addr); err != nil {
log.PanicErrorf(err, "call rpc remove-sync-action to dashboard %s failed", t.addr)
}
log.Debugf("call rpc remove-sync-action OK")
}
}
func (t *cmdDashboard) handleSlotActionCommand(d map[string]interface{}) {
c := t.newTopomClient()
switch {
case d["--create"].(bool):
sid := utils.ArgumentIntegerMust(d, "--sid")
gid := utils.ArgumentIntegerMust(d, "--gid")
log.Debugf("call rpc create-slot-action to dashboard %s", t.addr)
if err := c.SlotCreateAction(sid, gid); err != nil {
log.PanicErrorf(err, "call rpc create-slot-action to dashboard %s failed", t.addr)
}
log.Debugf("call rpc create-slot-action OK")
case d["--remove"].(bool):
sid := utils.ArgumentIntegerMust(d, "--sid")
log.Debugf("call rpc remove-slot-action to dashboard %s", t.addr)
if err := c.SlotRemoveAction(sid); err != nil {
log.PanicErrorf(err, "call rpc remove-slot-action to dashboard %s failed", t.addr)
}
log.Debugf("call rpc remove-slot-action OK")
case d["--create-some"].(bool):
src := utils.ArgumentIntegerMust(d, "--gid-from")
dst := utils.ArgumentIntegerMust(d, "--gid-to")
num := utils.ArgumentIntegerMust(d, "--num-slots")
log.Debugf("call rpc create-slot-action-some to dashboard %s", t.addr)
if err := c.SlotCreateActionSome(src, dst, num); err != nil {
log.PanicErrorf(err, "call rpc create-slot-action-some to dashboard %s failed", t.addr)
}
log.Debugf("call rpc create-slot-action-some OK")
case d["--create-range"].(bool):
beg := utils.ArgumentIntegerMust(d, "--beg")
end := utils.ArgumentIntegerMust(d, "--end")
gid := utils.ArgumentIntegerMust(d, "--gid")
log.Debugf("call rpc create-slot-action-range to dashboard %s", t.addr)
if err := c.SlotCreateActionRange(beg, end, gid); err != nil {
log.PanicErrorf(err, "call rpc create-slot-action-range to dashboard %s failed", t.addr)
}
log.Debugf("call rpc create-slot-action-range OK")
case d["--interval"] != nil:
value := utils.ArgumentIntegerMust(d, "--interval")
log.Debugf("call rpc slot-action-interval to dashboard %s", t.addr)
if err := c.SetSlotActionInterval(value); err != nil {
log.PanicErrorf(err, "call rpc slot-action-interval to dashboard %s failed", t.addr)
}
log.Debugf("call rpc slot-action-interval OK")
case d["--disabled"] != nil:
value := utils.ArgumentIntegerMust(d, "--disabled")
log.Debugf("call rpc slot-action-disabled to dashboard %s", t.addr)
if err := c.SetSlotActionDisabled(value != 0); err != nil {
log.PanicErrorf(err, "call rpc slot-action-disabled to dashboard %s failed", t.addr)
}
log.Debugf("call rpc slot-action-disabled OK")
}
}
func (t *cmdDashboard) handleSlotRebalance(d map[string]interface{}) {
c := t.newTopomClient()
confirm := d["--confirm"].(bool)
log.Debugf("call rpc slot-rebalance to dashboard %s", t.addr)
plans, err := c.SlotsRebalance(confirm)
if err != nil {
log.PanicErrorf(err, "call rpc slot-rebalance to dashboard %s failed", t.addr)
}
log.Debugf("call rpc slot-rebalance OK")
if len(plans) == 0 {
fmt.Println("nothing changes")
} else {
var slotIds = make([]int, 0, len(plans))
for sid := range plans {
slotIds = append(slotIds, sid)
}
sort.Ints(slotIds)
var gid, beg, end = -1, 0, -1
for _, sid := range slotIds {
if beg <= end {
if sid == end+1 && plans[sid] == gid {
end = sid
continue
}
fmt.Printf("[%04d,%04d] => %d\n", beg, end, gid)
}
beg, end, gid = sid, sid, plans[sid]
}
if beg <= end {
fmt.Printf("[%04d,%04d] => %d\n", beg, end, gid)
}
fmt.Println("done")
}
}
================================================
FILE: cmd/admin/main.go
================================================
// Copyright 2016 CodisLabs. All Rights Reserved.
// Licensed under the MIT (MIT-LICENSE.txt) license.
package main
import (
"github.com/docopt/docopt-go"
"github.com/CodisLabs/codis/pkg/utils/log"
)
func main() {
const usage = `
Usage:
codis-admin [-v] --proxy=ADDR [--auth=AUTH] [config|model|stats|slots]
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --start
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --shutdown
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --log-level=LEVEL
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --fillslots=FILE [--locked]
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --reset-stats
codis-admin [-v] --proxy=ADDR [--auth=AUTH] --forcegc
codis-admin [-v] --dashboard=ADDR [config|model|stats|slots|group|proxy]
codis-admin [-v] --dashboard=ADDR --shutdown
codis-admin [-v] --dashboard=ADDR --reload
codis-admin [-v] --dashboard=ADDR --log-level=LEVEL
codis-admin [-v] --dashboard=ADDR --slots-assign --beg=ID --end=ID (--gid=ID|--offline) [--confirm]
codis-admin [-v] --dashboard=ADDR --slots-status
codis-admin [-v] --dashboard=ADDR --list-proxy
codis-admin [-v] --dashboard=ADDR --create-proxy --addr=ADDR
codis-admin [-v] --dashboard=ADDR --online-proxy --addr=ADDR
codis-admin [-v] --dashboard=ADDR --remove-proxy (--addr=ADDR|--token=TOKEN|--pid=ID) [--force]
codis-admin [-v] --dashboard=ADDR --reinit-proxy (--addr=ADDR|--token=TOKEN|--pid=ID|--all) [--force]
codis-admin [-v] --dashboard=ADDR --proxy-status
codis-admin [-v] --dashboard=ADDR --list-group
codis-admin [-v] --dashboard=ADDR --create-group --gid=ID
codis-admin [-v] --dashboard=ADDR --remove-group --gid=ID
codis-admin [-v] --dashboard=ADDR --resync-group [--gid=ID | --all]
codis-admin [-v] --dashboard=ADDR --group-add --gid=ID --addr=ADDR [--datacenter=DATACENTER]
codis-admin [-v] --dashboard=ADDR --group-del --gid=ID --addr=ADDR
codis-admin [-v] --dashboard=ADDR --group-status
codis-admin [-v] --dashboard=ADDR --replica-groups --gid=ID --addr=ADDR (--enable|--disable)
codis-admin [-v] --dashboard=ADDR --promote-server --gid=ID --addr=ADDR
codis-admin [-v] --dashboard=ADDR --sync-action --create --addr=ADDR
codis-admin [-v] --dashboard=ADDR --sync-action --remove --addr=ADDR
codis-admin [-v] --dashboard=ADDR --slot-action --create --sid=ID --gid=ID
codis-admin [-v] --dashboard=ADDR --slot-action --remove --sid=ID
codis-admin [-v] --dashboard=ADDR --slot-action --create-some --gid-from=ID --gid-to=ID --num-slots=N
codis-admin [-v] --dashboard=ADDR --slot-action --create-range --beg=ID --end=ID --gid=ID
codis-admin [-v] --dashboard=ADDR --slot-action --interval=VALUE
codis-admin [-v] --dashboard=ADDR --slot-action --disabled=VALUE
codis-admin [-v] --dashboard=ADDR --rebalance [--confirm]
codis-admin [-v] --dashboard=ADDR --sentinel-add --addr=ADDR
codis-admin [-v] --dashboard=ADDR --sentinel-del --addr=ADDR [--force]
codis-admin [-v] --dashboard=ADDR --sentinel-resync
codis-admin [-v] --remove-lock --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
codis-admin [-v] --config-dump --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [-1]
codis-admin [-v] --config-convert=FILE
codis-admin [-v] --config-restore=FILE --product=NAME (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT) [--confirm]
codis-admin [-v] --dashboard-list (--zookeeper=ADDR [--zookeeper-auth=USR:PWD]|--etcd=ADDR [--etcd-auth=USR:PWD]|--filesystem=ROOT)
Options:
-a AUTH, --auth=AUTH
-x ADDR, --addr=ADDR
-t TOKEN, --token=TOKEN
-g ID, --gid=ID
`
d, err := docopt.Parse(usage, nil, true, "", false)
if err != nil {
log.PanicError(err, "parse arguments failed")
}
log.SetLevel(log.LevelInfo)
if d["-v"].(bool) {
log.SetLevel(log.LevelDebug)
}
switch {
case d["--proxy"] != nil:
new(cmdProxy).Main(d)
case d["--dashboard"] != nil:
new(cmdDashboard).Main(d)
default:
new(cmdAdmin).Main(d)
}
}
================================================
FILE: cmd/admin/proxy.go
================================================
// Copyright 2016 CodisLabs. All Rights Reserved.
// Licensed under the MIT (MIT-LICENSE.txt) license.
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"github.com/CodisLabs/codis/pkg/models"
"github.com/CodisLabs/codis/pkg/proxy"
"github.com/CodisLabs/codis/pkg/utils"
"github.com/CodisLabs/codis/pkg/utils/log"
)
type cmdProxy struct {
addr string
auth string
}
func (t *cmdProxy) Main(d map[string]interface{}) {
t.addr = utils.ArgumentMust(d, "--proxy")
t.auth, _ = d["--auth"].(string)
switch {
default:
t.handleOverview(d)
case d["--start"].(bool):
t.handleStart(d)
case d["--shutdown"].(bool):
t.handleShutdown(d)
case d["--log-level"] != nil:
t.handleLogLevel(d)
case d["--fillslots"] != nil:
t.handleFillSlots(d)
case d["--reset-stats"].(bool):
t.handleResetStats(d)
case d["--forcegc"].(bool):
t.handleForceGC(d)
}
}
func (t *cmdProxy) newProxyClient(xauth bool) *proxy.ApiClient {
c := proxy.NewApiClient(t.addr)
if !xauth {
return c
}
log.Debugf("call rpc model to proxy %s", t.addr)
p, err := c.Model()
if err != nil {
log.PanicErrorf(err, "call rpc model to proxy %s failed", t.addr)
}
log.Debugf("call rpc model OK")
c.SetXAuth(p.ProductName, t.auth, p.Token)
log.Debugf("call rpc xping to proxy %s", t.addr)
if err := c.XPing(); err != nil {
log.PanicErrorf(err, "call rpc xping failed")
}
log.Debugf("call rpc xping OK")
return c
}
func (t *cmdProxy) handleOverview(d map[string]interface{}) {
c := t.newProxyClient(false)
log.Debugf("call rpc overview to proxy %s", t.addr)
o, err := c.Overview()
if err != nil {
log.PanicErrorf(err, "call rpc overview to proxy %s failed", t.addr)
}
log.Debugf("call rpc overview OK")
var cmd string
for _, s := range []string{"config", "model", "slots", "stats"} {
if d[s].(bool) {
cmd = s
}
}
var obj interface{}
switch cmd {
default:
obj = o
case "config":
obj = o.Config
case "model":
obj = o.Model
case "slots":
obj = o.Slots
case "stats":
obj = o.Stats
}
b, err := json.MarshalIndent(obj, "", " ")
if err != nil {
log.PanicErrorf(err, "json marshal failed")
}
fmt.Println(string(b))
}
func (t *cmdProxy) handleStart(d map[string]interface{}) {
c := t.newProxyClient(true)
log.Debugf("call rpc start to proxy %s", t.addr)
if err := c.Start(); err != nil {
log.PanicErrorf(err, "call rpc start to proxy %s failed", t.addr)
}
log.Debugf("call rpc start to proxy OK")
}
func (t *cmdProxy) handleLogLevel(d map[string]interface{}) {
c := t.newProxyClient(true)
s := utils.ArgumentMust(d, "--log-level")
var v log.LogLevel
if !v.ParseFromString(s) {
log.Panicf("option --log-level = %s", s)
}
log.Debugf("call rpc loglevel to proxy %s", t.addr)
if err := c.LogLevel(v); err != nil {
log.PanicErrorf(err, "call rpc loglevel to proxy %s failed", t.addr)
}
log.Debugf("call rpc loglevel OK")
}
func (t *cmdProxy) handleFillSlots(d map[string]interface{}) {
c := t.newProxyClient(true)
b, err := ioutil.ReadFile(utils.ArgumentMust(d, "--fillslots"))
if err != nil {
log.PanicErrorf(err, "load slots from file failed")
}
var slots []*models.Slot
if err := json.Unmarshal(b, &slots); err != nil {
log.PanicErrorf(err, "decode slots from json failed")
}
for _, m := range slots {
if m.Id < 0 || m.Id >= models.MaxSlotNum {
log.Panicf("invalid slot id = %d", m.Id)
}
}
if d["--locked"].(bool) {
for _, m := range slots {
m.Locked = true
}
}
log.Debugf("call rpc fillslots to proxy %s", t.addr)
if err := c.FillSlots(slots...); err != nil {
log.PanicErrorf(err, "call rpc fillslots to proxy %s failed", t.addr)
}
log.Debugf("call rpc fillslots OK")
}
func (t *cmdProxy) handleResetStats(d map[string]interface{}) {
c := t.newProxyClient(true)
log.Debugf("call rpc resetstats to proxy %s", t.addr)
if err := c.ResetStats(); err != nil {
log.PanicErrorf(err, "call rpc resetstats to proxy %s failed", t.addr)
}
log.Debugf("call rpc resetstats OK")
}
func (t *cmdProxy) handleForceGC(d map[string]interface{}) {
c := t.newProxyClient(true)
log.Debugf("call rpc forcegc to proxy %s", t.addr)
if err := c.ForceGC(); err != nil {
log.PanicErrorf(err, "call rpc forcegc to proxy %s failed", t.addr)
}
log.Debugf("call rpc forcegc OK")
}
func (t *cmdProxy) handleShutdown(d map[string]interface{}) {
c := t.newProxyClient(true)
log.Debugf("call rpc shutdown to proxy %s", t.addr)
if err := c.Shutdown(); err != nil {
log.PanicErrorf(err, "call rpc shutdown to proxy %s failed", t.addr)
}
log.Debugf("call rpc shutdown OK")
}
================================================
FILE: cmd/dashboard/main.go
================================================
// Copyright 2016 CodisLabs. All Rights Reserved.
// Licensed under the MIT (MIT-LICENSE.txt) license.
package main
import (
"fmt"
"io/ioutil"
"os"
"os/signal"
"path/filepath"
"runtime"
"strconv"
"syscall"
"time"
"github.com/docopt/docopt-go"
"github.com/CodisLabs/codis/pkg/models"
"github.com/CodisLabs/codis/pkg/topom"
"github.com/CodisLabs/codis/pkg/utils"
"github.com/CodisLabs/codis/pkg/utils/log"
)
func main() {
const usage = `
Usage:
codis-dashboard [--ncpu=N] [--config=CONF] [--log=FILE] [--log-level=LEVEL] [--host-admin=ADDR] [--pidfile=FILE] [--zookeeper=ADDR|--etcd=ADDR|--filesystem=ROOT] [--product_name=NAME] [--product_auth=AUTH] [--remove-lock]
codis-dashboard --default-config
codis-dashboard --version
Options:
--ncpu=N set runtime.GOMAXPROCS to N, default is runtime.NumCPU().
-c CONF, --config=CONF run with the specific configuration.
-l FILE, --log=FILE set path/name of daliy rotated log file.
--log-level=LEVEL set the log-level, should be INFO,WARN,DEBUG or ERROR, default is INFO.
`
d, err := docopt.Parse(usage, nil, true, "", false)
if err != nil {
log.PanicError(err, "parse arguments failed")
}
switch {
case d["--default-config"]:
fmt.Println(topom.DefaultConfig)
return
case d["--version"].(bool):
fmt.Println("version:", utils.Version)
fmt.Println("compile:", utils.Compile)
return
}
if s, ok := utils.Argument(d, "--log"); ok {
w, err := log.NewRollingFile(s, log.DailyRolling)
if err != nil {
log.PanicErrorf(err, "open log file %s failed", s)
} else {
log.StdLog = log.New(w, "")
}
}
log.SetLevel(log.LevelInfo)
if s, ok := utils.Argument(d, "--log-level"); ok {
if !log.SetLevelString(s) {
log.Panicf("option --log-level = %s", s)
}
}
if n, ok := utils.ArgumentInteger(d, "--ncpu"); ok {
runtime.GOMAXPROCS(n)
} else {
runtime.GOMAXPROCS(runtime.NumCPU())
}
log.Warnf("set ncpu = %d", runtime.GOMAXPROCS(0))
config := topom.NewDefaultConfig()
if s, ok := utils.Argument(d, "--config"); ok {
if err := config.LoadFromFile(s); err != nil {
log.PanicErrorf(err, "load config %s failed", s)
}
}
if s, ok := utils.Argument(d, "--host-admin"); ok {
config.HostAdmin = s
log.Warnf("option --host-admin = %s", s)
}
switch {
case d["--zookeeper"] != nil:
config.CoordinatorName = "zookeeper"
config.CoordinatorAddr = utils.ArgumentMust(d, "--zookeeper")
log.Warnf("option --zookeeper = %s", config.CoordinatorAddr)
case d["--etcd"] != nil:
config.CoordinatorName = "etcd"
config.CoordinatorAddr = utils.ArgumentMust(d, "--etcd")
log.Warnf("option --etcd = %s", config.CoordinatorAddr)
case d["--filesystem"] != nil:
config.CoordinatorName = "filesystem"
config.CoordinatorAddr = utils.ArgumentMust(d, "--filesystem")
log.Warnf("option --filesystem = %s", config.CoordinatorAddr)
}
if s, ok := utils.Argument(d, "--product_name"); ok {
config.ProductName = s
log.Warnf("option --product_name = %s", s)
}
if s, ok := utils.Argument(d, "--product_auth"); ok {
config.ProductAuth = s
log.Warnf("option --product_auth = %s", s)
}
client, err := models.NewClient(config.CoordinatorName, config.CoordinatorAddr, config.CoordinatorAuth, time.Minute)
if err != nil {
log.PanicErrorf(err, "create '%s' client to '%s' failed", config.CoordinatorName, config.CoordinatorAddr)
}
defer client.Close()
if d["--remove-lock"].(bool) {
store := models.NewStore(client, config.ProductName)
defer store.Close()
log.Warnf("force remove-lock")
if err := store.Release(); err != nil {
log.WarnErrorf(err, "force remove-lock failed")
} else {
log.Warnf("force remove-lock OK")
}
}
s, err := topom.New(client, config)
if err != nil {
log.PanicErrorf(err, "create topom with config file failed\n%s", config)
}
defer s.Close()
log.Warnf("create topom with config\n%s", config)
if s, ok := utils.Argument(d, "--pidfile"); ok {
if pidfile, err := filepath.Abs(s); err != nil {
log.WarnErrorf(err, "parse pidfile = '%s' failed", s)
} else if err := ioutil.WriteFile(pidfile, []byte(strconv.Itoa(os.Getpid())), 0644); err != nil {
log.WarnErrorf(err, "write pidfile = '%s' failed", pidfile)
} else {
defer func() {
if err := os.Remove(pidfile); err != nil {
log.WarnErrorf(err, "remove pidfile = '%s' failed", pidfile)
}
}()
log.Warnf("option --pidfile = %s", pidfile)
}
}
go func() {
defer s.Close()
c := make(chan os.Signal, 1)
signal.Notify(c, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM)
sig := <-c
log.Warnf("[%p] dashboard receive signal = '%v'", s, sig)
}()
for i := 0; !s.IsClosed() && !s.IsOnline(); i++ {
if err := s.Start(true); err != nil {
if i <= 15 {
log.Warnf("[%p] dashboard online failed [%d]", s, i)
} else {
log.Panicf("dashboard online failed, give up & abort :'(")
}
time.Sleep(time.Second * 2)
}
}
log.Warnf("[%p] dashboard is working ...", s)
for !s.IsClosed() {
time.Sleep(time.Second)
}
log.Warnf("[%p] dashboard is exiting ...", s)
}
================================================
FILE: cmd/fe/assets/css/main.css
================================================
body {
min-height: 20000px;
min-width: 1000px;
}
[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
display: none !important;
}
#main {
margin-left: 100px;
margin-top: 0px;
position: relative;
height: 100%;
}
.container-full {
margin: 20px 60px 20px 60px;
}
#main > .container-full > .row {
margin-bottom: 40px;
}
.status_label_error {
background-color: red;
color: white;
font-weight: bold;
padding: 3px
}
.status_label_warning {
background-color: yellow;
font-weight: bold;
padding: 3px
}
.status_label_pending {
background-color: palevioletred;
font-weight: bold;
padding: 3px
}
.button_tight_column {
padding: 1px;
vertical-align: middle;
}
#sidebar {
position: fixed;
left: 0;
bottom: 0;
top: 0px;
width: 120px;
z-index: 8;
background-color: #fff;
-webkit-box-shadow: 0 0 10px 0 rgba(0, 0, 0, .2);
-moz-box-shadow: 0 0 10px 0 rgba(0, 0, 0, .2)
}
.sidebar-cover {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 46px;
background: rgba(255, 255, 255, .5);
z-index: 11
}
.sidebar-cover:hover {
background: rgba(220, 220, 220, .5)
}
.sidebar-cover:hover::before {
width: 100%;
text-align: center;
content: "Disabled";
color: #888;
position: absolute;
top: 45%
}
#sidebar .title {
position: absolute;
left: 0;
right: 0;
top: 0;
font-size: 13px;
font-weight: 700;
border-bottom: 1px solid #ccc;
padding: 8px;
background: #DFF2FF
}
#sidebar .items {
margin: 0;
list-style: none;
position: absolute;
left: 0;
right: 0;
bottom: 0;
top: 36px;
overflow-y: auto
}
#sidebar > .selected-node,
#sidebar > .selected-node > .info {
display: none
}
#sidebar > .tabs {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 35px;
border-top: 1px solid #ddd;
margin: 0;
padding: 0;
background: #f9f9f9
}
#sidebar > .tabs > li {
display: inline-block
}
#sidebar > .tabs > li > a {
display: inline-block;
padding: 10px;
width: 60px;
font-size: 13px;
text-align: center;
border-right: 1px solid #ddd;
position: relative;
top: -1px
}
#sidebar > .tabs > li.active > a {
background: #fff
}
#sidebar > .content {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 46px;
overflow-y: auto
}
#sidebar > .actions {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 30px;
padding: 8px;
background: #f0f0f0
}
#sidebar > .actions > button {
width: 34px;
height: 30px;
padding: 0
}
#sidebar > .actions > .search {
display: inline-block;
border: 0;
background: #fff;
border-radius: 3px;
padding: 5px 6px;
height: 22px;
outline: 0;
width: 157px;
margin-right: 6px;
box-shadow: inset 0 0 2px 0 rgba(80, 80, 80, .5);
color: #333;
position: relative;
top: -1px
}
#sidebar > .actions > .fn-clear-search {
position: absolute;
top: 15px;
right: 65px;
font-weight: 100;
color: #888;
cursor: pointer
}
#sidebar > .actions > .fn-collapse {
float: right;
background-image: linear-gradient(transparent, rgba(0, 0, 0, .08) 40%, rgba(0, 0, 0, .1))
}
#sidebar > .actions > .fn-collapse:hover {
background-image: linear-gradient(rgba(0, 0, 0, .01), rgba(0, 0, 0, .14) 40%, rgba(0, 0, 0, .16))
}
body.sidebar-collapsed #sidebar {
width: 50px;
background: #fff
}
body.sidebar-collapsed #main {
margin-left: 50px
}
body.sidebar-collapsed #sidebar .actions .search,
body.sidebar-collapsed #sidebar .content {
display: none
}
body.sidebar-collapsed #sidebar > .selected-node {
display: block;
position: relative
}
body.sidebar-collapsed #sidebar > .selected-node > .cube {
width: 50px;
background: #eee;
height: 45px;
line-height: 45px;
text-align: center;
font-size: 15px;
color: #2494F2;
cursor: pointer
}
body.sidebar-collapsed #sidebar > .selected-node:hover > .info {
display: block;
position: absolute;
left: 50px;
top: 0;
padding-left: 10px;
width: 169px;
height: 45px;
line-height: 45px;
background: #fff;
border-right: 1px solid #2494F2;
border-bottom: 1px solid #2494F2;
font-size: 13px
}
body.sidebar-collapsed #sidebar > .selected-node:hover > .cube {
border-bottom: 1px solid #2494F2
}
.ui-itemlist {
margin: 0;
padding: 0;
list-style: none
}
.ui-itemlist > li {
border-bottom: 1px solid #eee;
position: relative;
transition: all .2s ease
}
.ui-itemlist > li > i {
opacity: 0;
position: absolute;
left: 12px;
top: 9px;
transition: all .2s ease;
font-size: 13px;
z-index: 1
}
.ui-itemlist > li > a {
display: block;
position: relative;
padding: 8px 12px;
transition: all .2s ease;
font-size: 13px;
color: #2083D6
}
.ui-itemlist > li:hover {
background: #fafafa
}
.ui-itemlist > li.selected {
background: #eee
}
.ui-itemlist > li.selected:hover {
background: #f4f4f4
}
.ui-itemlist > li.selected > a,
.ui-itemlist > li:hover > a {
margin-left: 12px
}
.ui-itemlist > li.selected > i,
.ui-itemlist > li:hover > i {
opacity: 1
}
================================================
FILE: cmd/fe/assets/dashboard-fe.js
================================================
'use strict';
var dashboard = angular.module('dashboard-fe', ["highcharts-ng", "ui.bootstrap"]);
function genXAuth(name) {
return sha256("Codis-XAuth-[" + name + "]").substring(0, 32);
}
function concatUrl(base, name) {
if (name) {
return encodeURI(base + "?forward=" + name);
} else {
return encodeURI(base);
}
}
function padInt2Str(num, size) {
var s = num + "";
while (s.length < size) s = "0" + s;
return s;
}
function toJsonHtml(obj) {
var json = angular.toJson(obj, 4);
json = json.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
json = json.replace(/ /g, ' ');
json = json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
var cls = 'number';
if (/^"/.test(match)) {
if (/:$/.test(match)) {
cls = 'key';
} else {
cls = 'string';
}
} else if (/true|false/.test(match)) {
cls = 'boolean';
} else if (/null/.test(match)) {
cls = 'null';
}
return '<span class="' + cls + '">' + match + '</span>';
});
return json;
}
function humanSize(size) {
if (size < 1024) {
return size + " B";
}
size /= 1024;
if (size < 1024) {
return size.toFixed(2) + " KB";
}
size /= 1024;
if (size < 1024) {
return size.toFixed(2) + " MB";
}
size /= 1024;
if (size < 1024) {
return size.toFixed(2) + " GB";
}
size /= 1024;
return size.toFixed(2) + " TB";
}
function newChatsOpsConfig() {
return {
options: {
chart: {
useUTC: false,
type: 'spline',
},
},
series: [{
color: '#d82b28',
lineWidth: 1.5,
states: {
hover: {
enabled: false,
}
},
showInLegend: false,
marker: {
enabled: true,
symbol: 'circle',
radius: 2,
},
name: 'OP/s',
data: [],
}],
title: {
style: {
display: 'none',
}
},
xAxis: {
type: 'datetime',
title: {
style: {
display: 'none',
}
},
labels: {
formatter: function () {
var d = new Date(this.value);
return padInt2Str(d.getHours(), 2) + ":" + padInt2Str(d.getMinutes(), 2) + ":" + padInt2Str(d.getSeconds(), 2);
}
},
},
yAxis: {
min: 0,
title: {
style: {
display: 'none',
}
},
},
};
}
function renderSlotsCharts(slots_array) {
var groups = {};
var counts = {};
var n = slots_array.length;
for (var i = 0; i < n; i++) {
var slot = slots_array[i];
groups[slot.group_id] = true;
if (slot.action.target_id) {
groups[slot.action.target_id] = true;
}
if (counts[slot.group_id]) {
counts[slot.group_id]++;
} else {
counts[slot.group_id] = 1;
}
}
var series = [];
for (var g in groups) {
var xaxis = 2;
if (g == 0) {
xaxis = 0;
}
var s = {name: 'Group-' + g + ':' + (counts[g] == undefined ? 0 : counts[g]), data: [], group_id: g};
for (var beg = 0, end = 0; end <= n; end++) {
if (end == n || slots_array[end].group_id != g) {
if (beg < end) {
s.data.push({x: xaxis, beg: beg, end: end - 1, low: beg, high: end, group_id: g});
}
beg = end + 1;
}
}
xaxis = 1;
for (var beg = 0, end = 0; end <= n; end++) {
if (end == n || !(slots_array[end].action.target_id && slots_array[end].action.target_id == g)) {
if (beg < end) {
s.data.push({x: xaxis, beg: beg, end: end - 1, low: beg, high: end, group_id: g});
}
beg = end + 1;
}
}
s.data.sort(function (a, b) {
return a.x - b.x;
});
series.push(s);
}
series.sort(function (a, b) {
return a.group_id - b.group_id;
});
new Highcharts.Chart({
chart: {
renderTo: 'slots_charts',
type: 'columnrange',
inverted: true,
},
title: {
style: {
display: 'none',
}
},
xAxis: {
categories: ['Offline', 'Migrating', 'Default'],
min: 0,
max: 2,
},
yAxis: {
min: 0,
max: 1024,
tickInterval: 64,
title: {
style: {
display: 'none',
}
},
},
legend: {
enabled: true,
itemWidth: 140,
},
plotOptions: {
columnrange: {
grouping: false
},
series: {
animation: false,
events: {
legendItemClick: function () {
return false;
},
}
},
},
credits: {
enabled: false
},
tooltip: {
formatter: function () {
switch (this.point.x) {
case 0:
return '<b>Slot-[' + this.point.beg + "," + this.point.end + "]</b> are <b>Offline</b>";
case 1:
return '<b>Slot-[' + this.point.beg + "," + this.point.end + "]</b> will be moved to <b>Group-[" + this.point.group_id + "]</b>";
case 2:
return '<b>Slot-[' + this.point.beg + "," + this.point.end + "]</b> --> <b>Group-[" + this.point.group_id + "]</b>";
}
}
},
series: series,
});
}
function processProxyStats(codis_stats) {
var proxy_array = codis_stats.proxy.models;
var proxy_stats = codis_stats.proxy.stats;
var qps = 0, sessions = 0;
for (var i = 0; i < proxy_array.length; i++) {
var p = proxy_array[i];
var s = proxy_stats[p.token];
p.sessions = "NA";
p.commands = "NA";
p.switched = false;
p.primary_only = false;
if (!s) {
p.status = "PENDING";
} else if (s.timeout) {
p.status = "TIMEOUT";
} else if (s.error) {
p.status = "ERROR";
} else {
if (s.stats.online) {
p.sessions = "total=" + s.stats.sessions.total + ",alive=" + s.stats.sessions.alive;
p.commands = "total=" + s.stats.ops.total + ",fails=" + s.stats.ops.fails;
if (s.stats.ops.redis != undefined) {
p.commands += ",rsp.errs=" + s.stats.ops.redis.errors;
}
p.commands += ",qps=" + s.stats.ops.qps;
p.status = "HEALTHY";
} else {
p.status = "PENDING";
}
if (p.admin_addr) {
p.proxy_link = p.admin_addr + "/proxy"
p.stats_link = p.admin_addr + "/proxy/stats"
}
if (s.stats.sentinels != undefined) {
if (s.stats.sentinels.switched != undefined) {
p.switched = s.stats.sentinels.switched;
}
}
if (s.stats.backend != undefined) {
if (s.stats.backend.primary_only != undefined) {
p.primary_only = s.stats.backend.primary_only;
}
}
qps += s.stats.ops.qps;
sessions += s.stats.sessions.alive;
}
}
return {proxy_array: proxy_array, qps: qps, sessions: sessions};
}
function processSentinels(codis_stats, group_stats, codis_name) {
var ha = codis_stats.sentinels;
var out_of_sync = false;
var servers = [];
if (ha.model != undefined) {
if (ha.model.servers == undefined) {
ha.model.servers = []
}
for (var i = 0; i < ha.model.servers.length; i ++) {
var x = {server: ha.model.servers[i]};
var s = ha.stats[x.server];
x.runid_error = "";
if (!s) {
x.status = "PENDING";
} else if (s.timeout) {
x.status = "TIMEOUT";
} else if (s.error) {
x.status = "ERROR";
} else {
x.masters = 0;
x.masters_down = 0;
x.slaves = 0;
x.sentinels = 0;
var masters = s.stats["sentinel_masters"];
if (masters != undefined) {
for (var j = 0; j < masters; j ++) {
var record = s.stats["master" + j];
if (record != undefined) {
var pairs = record.split(",");
var dict = {};
for (var t = 0; t < pairs.length; t ++) {
var ss = pairs[t].split("=");
if (ss.length == 2) {
dict[ss[0]] = ss[1];
}
}
var name = dict["name"];
if (name == undefined) {
continue;
}
if (name.lastIndexOf(codis_name) != 0) {
continue;
}
if (name.lastIndexOf("-") != codis_name.length) {
continue;
}
x.masters ++;
if (dict["status"] != "ok") {
x.masters_down ++;
}
x.slaves += parseInt(dict["slaves"]);
x.sentinels += parseInt(dict["sentinels"]);
}
}
}
x.status_text = "masters=" + x.masters;
x.status_text += ",down=" + x.masters_down;
var avg = 0;
if (x.slaves == 0) {
avg = 0;
} else {
avg = Number(x.slaves) / x.masters;
}
x.status_text += ",slaves=" + avg.toFixed(2);
if (x.sentinels == 0) {
avg = 0;
} else {
avg = Number(x.sentinels) / x.masters;
}
x.status_text += ",sentinels=" + avg.toFixed(2);
if (s.sentinel != undefined) {
var group_array = group_stats.group_array;
for (var t in group_array) {
var g = group_array[t];
var d = s.sentinel[codis_name + "-" + g.id];
var runids = {};
if (d != undefined) {
if (d.master != undefined) {
var o = d.master;
runids[o["runid"]] = o["ip"] + ":" + o["port"];
}
if (d.slaves != undefined) {
for (var j = 0; j < d.slaves.length; j ++) {
var o = d.slaves[j];
runids[o["runid"]] = o["ip"] + ":" + o["port"];
}
}
}
for (var runid in runids) {
if (g.runids[runid] === undefined) {
x.runid_error = "[+]group=" + g.id + ",server=" + runids[runid] + ",runid="
+ ((runid != "") ? runid : "NA");
}
}
for (var runid in g.runids) {
if (runids[runid] === undefined) {
x.runid_error = "[-]group=" + g.id + ",server=" + g.runids[runid] + ",runid=" + runid;
}
}
}
}
}
servers.push(x);
}
out_of_sync = ha.model.out_of_sync;
}
var masters = ha.masters;
if (masters == undefined) {
masters = {};
}
return {servers:servers, masters:masters, out_of_sync: out_of_sync}
}
function alertAction(text, callback) {
BootstrapDialog.show({
title: "Warning !!",
message: text,
closable: true,
buttons: [{
label: "OK",
cssClass: "btn-primary",
action: function (dialog) {
dialog.close();
callback();
},
}, {
label: "CANCEL",
action: function(dialogItself){
dialogItself.close();
}
}],
});
}
function alertAction2(text, callback) {
BootstrapDialog.show({
title: "Warning !!",
type: "type-danger",
message: text,
closable: true,
buttons: [{
label: "JUST DO IT",
cssClass: "btn-danger",
action: function (dialog) {
dialog.close();
callback();
},
}, {
label: "CANCEL",
action: function(dialogItself){
dialogItself.close();
}
}],
});
}
function alertErrorResp(failedResp) {
var text = "error response";
if (failedResp.status != 1500 && failedResp.status != 800) {
text = failedResp.data.toString();
} else {
text = toJsonHtml(failedResp.data);
}
BootstrapDialog.alert({
title: "Error !!",
type: "type-danger",
closable: true,
message: text,
});
}
function isValidInput(text) {
return text && text != "" && text != "NA";
}
function processGroupStats(codis_stats) {
var group_array = codis_stats.group.models;
var group_stats = codis_stats.group.stats;
var keys = 0, memory = 0;
var dbkeyRegexp = /db\d+/
for (var i = 0; i < group_array.length; i++) {
var g = group_array[i];
if (g.promoting.state) {
g.ispromoting = g.promoting.state != "";
if (g.promoting.index) {
g.ispromoting_index = g.promoting.index;
} else {
g.ispromoting_index = 0;
}
} else {
g.ispromoting = false;
g.ispromoting_index = -1;
}
g.runids = {}
g.canremove = (g.servers.length == 0);
for (var j = 0; j < g.servers.length; j++) {
var x = g.servers[j];
var s = group_stats[x.server];
x.keys = [];
x.memory = "NA";
x.maxmem = "NA";
x.master = "NA";
if (j == 0) {
x.master_expect = "NO:ONE";
} else {
x.master_expect = g.servers[0].server;
}
if (!s) {
x.status = "PENDING";
} else if (s.timeout) {
x.status = "TIMEOUT";
} else if (s.error) {
x.status = "ERROR";
} else {
for (var field in s.stats) {
if (dbkeyRegexp.test(field)) {
var v = parseInt(s.stats[field].split(",")[0].split("=")[1], 10);
if (j == 0) {
keys += v;
}
x.keys.push(field+ ":" + s.stats[field]);
}
}
if (s.stats["used_memory"]) {
var v = parseInt(s.stats["used_memory"], 10);
if (j == 0) {
memory += v;
}
x.memory = humanSize(v);
}
if (s.stats["maxmemory"]) {
var v = parseInt(s.stats["maxmemory"], 10);
if (v == 0) {
x.maxmem = "INF."
} else {
x.maxmem = humanSize(v);
}
}
if (s.stats["master_addr"]) {
x.master = s.stats["master_addr"] + ":" + s.stats["master_link_status"];
} else {
x.master = "NO:ONE";
}
if (j == 0) {
x.master_status = (x.master == "NO:ONE");
} else {
x.master_status = (x.master == g.servers[0].server + ":up");
}
g.runids[s.stats["run_id"]] = x.server;
}
if (g.ispromoting) {
x.canremove = false;
x.canpromote = false;
x.ispromoting = (j == g.ispromoting_index);
} else {
x.canremove = (j != 0 || g.servers.length <= 1);
x.canpromote = j != 0;
x.ispromoting = false;
}
if (x.action.state) {
if (x.action.state != "pending") {
x.canslaveof = "create";
x.actionstate = x.action.state;
} else {
x.canslaveof = "remove";
x.actionstate = x.action.state + ":" + x.action.index;
}
} else {
x.canslaveof = "create";
x.actionstate = "";
}
x.server_text = x.server;
}
}
return {group_array: group_array, keys: keys, memory: memory};
}
dashboard.config(['$interpolateProvider',
function ($interpolateProvider) {
$interpolateProvider.startSymbol('[[');
$interpolateProvider.endSymbol(']]');
}
]);
dashboard.config(['$httpProvider', function ($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
}]);
dashboard.controller('MainCodisCtrl', ['$scope', '$http', '$uibModal', '$timeout',
function ($scope, $http, $uibModal, $timeout) {
Highcharts.setOptions({
global: {
useUTC: false,
},
exporting: {
enabled: false,
},
});
$scope.chart_ops = newChatsOpsConfig();
$scope.refresh_interval = 3;
$scope.resetOverview = function () {
$scope.codis_name = "NA";
$scope.codis_addr = "NA";
$scope.codis_coord_name = "Coordinator";
$scope.codis_coord_addr = "NA";
$scope.codis_qps = "NA";
$scope.codis_sessions = "NA";
$scope.redis_mem = "NA";
$scope.redis_keys = "NA";
$scope.slots_array = [];
$scope.proxy_array = [];
$scope.group_array = [];
$scope.slots_actions = [];
$scope.chart_ops.series[0].data = [];
$scope.slots_action_interval = "NA";
$scope.slots_action_disabled = "NA";
$scope.slots_action_failed = false;
$scope.slots_action_remain = 0;
$scope.sentinel_servers = [];
$scope.sentinel_out_of_sync = false;
}
$scope.resetOverview();
$http.get('/list').then(function (resp) {
$scope.codis_list = resp.data;
});
$scope.selectCodisInstance = function (selected) {
if ($scope.codis_name == selected) {
return;
}
$scope.resetOverview();
$scope.codis_name = selected;
var url = concatUrl("/topom", selected);
$http.get(url).then(function (resp) {
if ($scope.codis_name != selected) {
return;
}
var overview = resp.data;
$scope.codis_addr = overview.model.admin_addr;
$scope.codis_coord_name = "[" + overview.config.coordinator_name.charAt(0).toUpperCase() + overview.config.coordinator_name.slice(1) + "]";
$scope.codis_coord_addr = overview.config.coordinator_addr;
$scope.updateStats(overview.stats);
});
}
$scope.updateStats = function (codis_stats) {
var proxy_stats = processProxyStats(codis_stats);
var group_stats = processGroupStats(codis_stats);
var sentinel = processSentinels(codis_stats, group_stats, $scope.codis_name);
var merge = function(obj1, obj2) {
if (obj1 === null || obj2 === null) {
return obj2;
}
if (Array.isArray(obj1)) {
if (obj1.length != obj2.length) {
return obj2;
}
for (var i = 0; i < obj1.length; i ++) {
obj1[i] = merge(obj1[i], obj2[i]);
}
return obj1;
}
if (typeof obj1 === "object") {
for (var k in obj1) {
if (obj2[k] === undefined) {
delete obj1[k];
}
}
for (var k in obj2) {
obj1[k] = merge(obj1[k], obj2[k]);
}
return obj1;
}
return obj2;
}
$scope.codis_qps = proxy_stats.qps;
$scope.codis_sessions = proxy_stats.sessions;
$scope.redis_mem = humanSize(group_stats.memory);
$scope.redis_keys = group_stats.keys.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
$scope.slots_array = merge($scope.slots_array, codis_stats.slots);
$scope.proxy_array = merge($scope.proxy_array, proxy_stats.proxy_array);
$scope.group_array = merge($scope.group_array, group_stats.group_array);
$scope.slots_actions = [];
$scope.slots_action_interval = codis_stats.slot_action.interval;
$scope.slots_action_disabled = codis_stats.slot_action.disabled;
$scope.slots_action_progress = codis_stats.slot_action.progress.status;
$scope.sentinel_servers = merge($scope.sentinel_servers, sentinel.servers);
$scope.sentinel_out_of_sync = sentinel.out_of_sync;
for (var i = 0; i < $scope.slots_array.length; i++) {
var slot = $scope.slots_array[i];
if (slot.action.state) {
$scope.slots_actions.push(slot);
}
}
if ($scope.sentinel_servers.length != 0) {
for (var i = 0; i < $scope.group_array.length; i ++) {
var g = $scope.group_array[i];
var ha_master = sentinel.masters[g.id];
var ha_master_ingroup = false;
for (var j = 0; j < g.servers.length; j ++) {
var x = g.servers[j];
if (ha_master == undefined) {
x.ha_status = "ha_undefined";
continue;
}
if (j == 0) {
if (x.server == ha_master) {
x.ha_status = "ha_master";
} else {
x.ha_status = "ha_not_master";
}
} else {
if (x.server == ha_master) {
x.ha_status = "ha_real_master";
} else {
x.ha_status = "ha_slave";
}
}
if (x.server == ha_master) {
x.server_text = x.server + " [HA]";
ha_master_ingroup = true;
}
}
if (ha_master == undefined || ha_master_ingroup) {
g.ha_warning = "";
} else {
g.ha_warning = "[HA: " + ha_master + "]";
}
}
}
renderSlotsCharts($scope.slots_array);
var ops_array = $scope.chart_ops.series[0].data;
if (ops_array.length >= 10) {
ops_array.shift();
}
ops_array.push({x: new Date(), y: proxy_stats.qps});
$scope.chart_ops.series[0].data = ops_array;
}
$scope.refreshStats = function () {
var codis_name = $scope.codis_name;
var codis_addr = $scope.codis_addr;
if (isValidInput(codis_name) && isValidInput(codis_addr)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/stats/" + xauth, codis_name);
$http.get(url).then(function (resp) {
if ($scope.codis_name != codis_name) {
return;
}
$scope.updateStats(resp.data);
});
}
}
$scope.createProxy = function (proxy_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(proxy_addr)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/proxy/create/" + xauth + "/" + proxy_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.removeProxy = function (proxy, force) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var prefix = "";
if (force) {
prefix = "[FORCE] ";
}
alertAction(prefix + "Remove and Shutdown proxy: " + toJsonHtml(proxy), function () {
var xauth = genXAuth(codis_name);
var value = 0;
if (force) {
value = 1;
}
var url = concatUrl("/api/topom/proxy/remove/" + xauth + "/" + proxy.token + "/" + value, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
$scope.reinitProxy = function (proxy) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var confused = [];
for (var i = 0; i < $scope.group_array.length; i ++) {
var group = $scope.group_array[i];
var ha_real_master = -1;
for (var j = 0; j < group.servers.length; j ++) {
if (group.servers[j].ha_status == "ha_real_master") {
ha_real_master = j;
}
}
if (ha_real_master >= 0) {
confused.push({group: group.id, logical_master: group.servers[0].server, ha_real_master: group.servers[ha_real_master].server});
}
}
if (confused.length == 0) {
alertAction("Reinit and Start proxy: " + toJsonHtml(proxy), function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/proxy/reinit/" + xauth + "/" + proxy.token, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
} else {
var prompts = toJsonHtml(proxy);
prompts += "\n\n";
prompts += "HA: real master & logical master area conflicting: " + toJsonHtml(confused);
prompts += "\n\n";
prompts += "Please fix these before resync proxy-[" + proxy.token + "].";
alertAction2("Reinit and Start proxy: " + prompts, function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/proxy/reinit/" + xauth + "/" + proxy.token, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
}
$scope.createGroup = function (group_id) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(group_id)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/create/" + xauth + "/" + group_id, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.removeGroup = function (group_id) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/remove/" + xauth + "/" + group_id, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.resyncGroup = function (group) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var o = {};
o.id = group.id;
o.servers = [];
var ha_real_master = -1;
for (var j = 0; j < group.servers.length; j++) {
o.servers.push(group.servers[j].server);
if (group.servers[j].ha_status == "ha_real_master") {
ha_real_master = j;
}
}
if (ha_real_master < 0) {
alertAction("Resync Group-[" + group.id + "]: " + toJsonHtml(o), function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/resync/" + xauth + "/" + group.id, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
} else {
var prompts = toJsonHtml(o);
prompts += "\n\n";
prompts += "HA: server[" + ha_real_master + "]=" + group.servers[ha_real_master].server + " should be the real group master, do you really want to resync group-[" + group.id + "] ??";
alertAction2("Resync Group-[" + group.id + "]: " + prompts, function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/resync/" + xauth + "/" + group.id, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
}
$scope.resyncGroupAll = function() {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var ha_real_master = -1;
var gids = [];
for (var i = 0; i < $scope.group_array.length; i ++) {
var group = $scope.group_array[i];
for (var j = 0; j < group.servers.length; j++) {
if (group.servers[j].ha_status == "ha_real_master") {
ha_real_master = j;
}
}
gids.push(group.id);
}
if (ha_real_master < 0) {
alertAction("Resync All Groups: group-[" + gids + "]", function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/resync-all/" + xauth, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
} else {
alertAction2("Resync All Groups: group-[" + gids + "] (in conflict with HA)", function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/resync-all/" + xauth, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
}
$scope.resyncSentinels = function () {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var servers = [];
for (var i = 0; i < $scope.sentinel_servers.length; i ++) {
servers.push($scope.sentinel_servers[i].server);
}
var confused = [];
for (var i = 0; i < $scope.group_array.length; i ++) {
var group = $scope.group_array[i];
var ha_real_master = -1;
for (var j = 0; j < group.servers.length; j ++) {
if (group.servers[j].ha_status == "ha_real_master") {
ha_real_master = j;
}
}
if (ha_real_master >= 0) {
confused.push({group: group.id, logical_master: group.servers[0].server, ha_real_master: group.servers[ha_real_master].server});
}
}
if (confused.length == 0) {
alertAction("Resync All Sentinels: " + toJsonHtml(servers), function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/sentinels/resync-all/" + xauth, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
} else {
var prompts = toJsonHtml(servers);
prompts += "\n\n";
prompts += "HA: real master & logical master area conflicting: " + toJsonHtml(confused);
prompts += "\n\n";
prompts += "Please fix these before resync sentinels.";
alertAction2("Resync All Sentinels: " + prompts, function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/sentinels/resync-all/" + xauth, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
}
$scope.addSentinel = function (server_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(server_addr)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/sentinels/add/" + xauth + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.delSentinel = function (sentinel, force) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var prefix = "";
if (force) {
prefix = "[FORCE] ";
}
alertAction(prefix + "Remove sentinel " + sentinel.server, function () {
var xauth = genXAuth(codis_name);
var value = 0;
if (force) {
value = 1;
}
var url = concatUrl("/api/topom/sentinels/del/" + xauth + "/" + sentinel.server + "/" + value, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
$scope.addGroupServer = function (group_id, datacenter, server_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(group_id) && isValidInput(server_addr)) {
var xauth = genXAuth(codis_name);
if (datacenter == undefined) {
datacenter = "";
} else {
datacenter = datacenter.trim();
}
var suffix = "";
if (datacenter != "") {
suffix = "/" + datacenter;
}
var url = concatUrl("/api/topom/group/add/" + xauth + "/" + group_id + "/" + server_addr + suffix, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.delGroupServer = function (group, server_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(server_addr)) {
var o = {};
o.id = group.id;
o.servers = [];
var ha_real_master = -1;
for (var j = 0; j < group.servers.length; j++) {
o.servers.push(group.servers[j].server);
if (group.servers[j].ha_status == "ha_real_master") {
ha_real_master = j;
}
}
if (ha_real_master < 0 || group.servers[ha_real_master].server != server_addr) {
alertAction("Remove server " + server_addr + " from Group-[" + group.id + "]: " + toJsonHtml(o), function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/del/" + xauth + "/" + group.id + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
} else {
var prompts = toJsonHtml(o);
prompts += "\n\n";
prompts += "HA: server[" + ha_real_master + "]=" + server_addr + " should be the real group master, do you really want to remove it ??";
alertAction2("Remove server " + server_addr + " from Group-[" + group.id + "]: " + prompts, function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/del/" + xauth + "/" + group.id + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
}
$scope.promoteServer = function (group, server_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(server_addr)) {
var o = {};
o.id = group.id;
o.servers = [];
var ha_real_master = -1;
for (var j = 0; j < group.servers.length; j++) {
o.servers.push(group.servers[j].server);
if (group.servers[j].ha_status == "ha_real_master") {
ha_real_master = j;
}
}
if (ha_real_master < 0 || group.servers[ha_real_master].server == server_addr) {
alertAction("Promote server " + server_addr + " from Group-[" + group.id + "]: " + toJsonHtml(o), function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/promote/" + xauth + "/" + group.id + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
} else {
var prompts = toJsonHtml(o);
prompts += "\n\n";
prompts += "HA: server[" + ha_real_master + "]=" + group.servers[ha_real_master].server + " should be the real group master, do you really want to promote " + server_addr + " ??";
alertAction2("Promote server " + server_addr + " from Group-[" + group.id + "]: " + prompts, function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/promote/" + xauth + "/" + group.id + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
}
$scope.enableReplicaGroups = function (group_id, server_addr, replica_group) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(group_id) && isValidInput(server_addr)) {
var xauth = genXAuth(codis_name);
var value = 0;
if (replica_group) {
value = 1;
}
var url = concatUrl("/api/topom/group/replica-groups/" + xauth + "/" + group_id + "/" + server_addr + "/" + value, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.enableReplicaGroupsAll = function (value) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/replica-groups-all/" + xauth + "/" + value, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.createSyncAction = function (server_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(server_addr)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/action/create/" + xauth + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.removeSyncAction = function (server_addr) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(server_addr)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/group/action/remove/" + xauth + "/" + server_addr, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.createSlotActionSome = function (slots_num, group_from, group_to) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(slots_num) && isValidInput(group_from) && isValidInput(group_to)) {
alertAction("Migrate " + slots_num + " Slots from Group-[" + group_from + "] to Group-[" + group_to + "]", function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/slots/action/create-some/" + xauth + "/" + group_from + "/" + group_to + "/" + slots_num, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
$scope.createSlotActionRange = function (slot_beg, slot_end, group_id) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(slot_beg) && isValidInput(slot_end) && isValidInput(group_id)) {
alertAction("Migrate Slots-[" + slot_beg + "," + slot_end + "] to Group-[" + group_id + "]", function () {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/slots/action/create-range/" + xauth + "/" + slot_beg + "/" + slot_end + "/" + group_id, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
});
}
}
$scope.removeSlotAction = function (slot_id) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name) && isValidInput(slot_id)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/slots/action/remove/" + xauth + "/" + slot_id, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.updateSlotActionDisabled = function (value) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/slots/action/disabled/" + xauth + "/" + value, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.updateSlotActionInterval = function (value) {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/slots/action/interval/" + xauth + "/" + value, codis_name);
$http.put(url).then(function () {
$scope.refreshStats();
}, function (failedResp) {
alertErrorResp(failedResp);
});
}
}
$scope.rebalanceAllSlots = function() {
var codis_name = $scope.codis_name;
if (isValidInput(codis_name)) {
var xauth = genXAuth(codis_name);
var url = concatUrl("/api/topom/slots/rebalance/" + xauth + "/0", codis_name);
$http.put(url).then(function (resp) {
var actions = []
for (var i = 0; i < $scope.group_array.length; i ++) {
var g = $scope.group_array[i];
var slots = [], beg = 0, end = -1;
for (var sid = 0; sid < 1024; sid ++) {
if (resp.data[sid] == g.id) {
if (beg > end) {
beg = sid; end = sid;
} else if (end == sid - 1) {
end = sid;
} else {
gitextract_xkncrmnj/ ├── .gitignore ├── .travis.yml ├── Dockerfile ├── Godeps/ │ ├── Godeps.json │ └── Readme ├── MIT-LICENSE.txt ├── Makefile ├── README.md ├── admin/ │ ├── codis-dashboard-admin.sh │ ├── codis-fe-admin.sh │ ├── codis-proxy-admin.sh │ └── codis-server-admin.sh ├── ansible/ │ ├── group_vars/ │ │ └── all │ ├── hosts │ ├── roles/ │ │ ├── codis-dashboard/ │ │ │ ├── tasks/ │ │ │ │ └── main.yml │ │ │ └── templates/ │ │ │ ├── codis-dashboard-admin.sh │ │ │ └── dashboard.toml │ │ ├── codis-fe/ │ │ │ ├── tasks/ │ │ │ │ └── main.yml │ │ │ └── templates/ │ │ │ └── codis-fe-admin.sh │ │ ├── codis-proxy/ │ │ │ ├── tasks/ │ │ │ │ └── main.yml │ │ │ └── templates/ │ │ │ ├── codis-proxy-admin.sh │ │ │ └── proxy.toml │ │ ├── codis-server/ │ │ │ ├── tasks/ │ │ │ │ └── main.yml │ │ │ └── templates/ │ │ │ ├── codis-server-admin.sh │ │ │ └── redis.conf │ │ ├── common/ │ │ │ └── tasks/ │ │ │ └── main.yml │ │ └── redis-sentinel/ │ │ ├── tasks/ │ │ │ └── main.yml │ │ └── templates/ │ │ ├── redis-sentinel-admin.sh │ │ └── sentinel.conf │ └── site.yml ├── cmd/ │ ├── admin/ │ │ ├── admin.go │ │ ├── dashboard.go │ │ ├── main.go │ │ └── proxy.go │ ├── dashboard/ │ │ └── main.go │ ├── fe/ │ │ ├── assets/ │ │ │ ├── css/ │ │ │ │ └── main.css │ │ │ ├── dashboard-fe.js │ │ │ ├── index.html │ │ │ └── package.json │ │ └── main.go │ ├── ha/ │ │ └── main.go │ └── proxy/ │ └── main.go ├── config/ │ ├── dashboard.toml │ ├── proxy.toml │ ├── redis.conf │ └── sentinel.conf ├── deploy/ │ ├── Makefile │ ├── products/ │ │ ├── alpha/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── config.json │ │ │ ├── gen.py │ │ │ └── render.py │ │ └── beta/ │ │ ├── .gitignore │ │ ├── Makefile │ │ ├── config.json │ │ ├── gen.py │ │ └── render.py │ ├── root/ │ │ └── opt/ │ │ └── codis/ │ │ └── etc/ │ │ ├── 10.2.16.200_19000/ │ │ │ ├── codis_proxy_19000.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.2.16.200_19002/ │ │ │ ├── codis_proxy_19002.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.2.16.201_19000/ │ │ │ ├── codis_proxy_19000.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.2.16.201_19002/ │ │ │ ├── codis_proxy_19002.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.2.16.202_19000/ │ │ │ ├── codis_proxy_19000.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.2.16.202_19002/ │ │ │ ├── codis_proxy_19002.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.4.10.100_18080/ │ │ │ ├── codis_dashboard_18080.service │ │ │ ├── dashboard.toml │ │ │ ├── dashboard_admin │ │ │ ├── foreach_proxy │ │ │ ├── foreach_proxy_online │ │ │ └── foreach_proxy_reinit │ │ ├── 10.4.10.200_19000/ │ │ │ ├── codis_proxy_19000.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.4.10.200_19002/ │ │ │ ├── codis_proxy_19002.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.4.10.201_19000/ │ │ │ ├── codis_proxy_19000.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 10.4.10.201_19002/ │ │ │ ├── codis_proxy_19002.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 127.0.0.1_18080/ │ │ │ ├── codis_dashboard_18080.service │ │ │ ├── dashboard.toml │ │ │ ├── dashboard_admin │ │ │ ├── foreach_proxy │ │ │ ├── foreach_proxy_online │ │ │ └── foreach_proxy_reinit │ │ ├── 127.0.0.1_19000/ │ │ │ ├── codis_proxy_19000.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ ├── 127.0.0.1_19001/ │ │ │ ├── codis_proxy_19001.service │ │ │ ├── proxy.toml │ │ │ └── proxy_admin │ │ └── 127.0.0.1_19002/ │ │ ├── codis_proxy_19002.service │ │ ├── proxy.toml │ │ └── proxy_admin │ └── templates/ │ ├── dashboard.service.template │ ├── dashboard.toml.template │ ├── proxy.service.template │ └── proxy.toml.template ├── doc/ │ ├── FAQ_en.md │ ├── FAQ_zh.md │ ├── bench1/ │ │ ├── Makefile │ │ ├── bench.plot │ │ ├── input1 │ │ ├── input2 │ │ └── input3 │ ├── bench2/ │ │ ├── Makefile │ │ ├── bench.plot │ │ ├── input1 │ │ ├── input2 │ │ ├── input3 │ │ ├── input4 │ │ └── input5 │ ├── benchmark.md │ ├── pictures/ │ │ ├── .gitignore │ │ ├── Makefile │ │ └── architecture.tex │ ├── redis_change_zh.md │ ├── tutorial_en.md │ ├── tutorial_zh.md │ └── unsupported_cmds.md ├── example/ │ ├── .gitignore │ ├── Makefile │ ├── dashboard.py │ ├── fe.py │ ├── proxy.py │ ├── sentinel.py │ ├── sentinel_notify.sh │ ├── sentinel_reconfig.sh │ ├── server.py │ ├── setup.py │ └── utils.py ├── extern/ │ ├── .gitignore │ ├── README.md │ ├── deprecated/ │ │ ├── redis-2.8.21/ │ │ │ ├── .gitignore │ │ │ ├── 00-RELEASENOTES │ │ │ ├── 0000-redis.patch │ │ │ ├── 0001-slotsscan.patch │ │ │ ├── 0002-rehash.patch │ │ │ ├── BUGS │ │ │ ├── CONTRIBUTING │ │ │ ├── COPYING │ │ │ ├── INSTALL │ │ │ ├── MANIFESTO │ │ │ ├── Makefile │ │ │ ├── README │ │ │ ├── deps/ │ │ │ │ ├── Makefile │ │ │ │ ├── hiredis/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .travis.yml │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── COPYING │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.md │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ ├── ae.h │ │ │ │ │ │ ├── libev.h │ │ │ │ │ │ ├── libevent.h │ │ │ │ │ │ └── libuv.h │ │ │ │ │ ├── async.c │ │ │ │ │ ├── async.h │ │ │ │ │ ├── dict.c │ │ │ │ │ ├── dict.h │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── example-ae.c │ │ │ │ │ │ ├── example-libev.c │ │ │ │ │ │ ├── example-libevent.c │ │ │ │ │ │ ├── example-libuv.c │ │ │ │ │ │ └── example.c │ │ │ │ │ ├── fmacros.h │ │ │ │ │ ├── hiredis.c │ │ │ │ │ ├── hiredis.h │ │ │ │ │ ├── net.c │ │ │ │ │ ├── net.h │ │ │ │ │ ├── sds.c │ │ │ │ │ ├── sds.h │ │ │ │ │ ├── test.c │ │ │ │ │ └── zmalloc.h │ │ │ │ ├── jemalloc/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── COPYING │ │ │ │ │ ├── ChangeLog │ │ │ │ │ ├── INSTALL │ │ │ │ │ ├── Makefile.in │ │ │ │ │ ├── README │ │ │ │ │ ├── autogen.sh │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── jemalloc.sh.in │ │ │ │ │ │ └── pprof │ │ │ │ │ ├── config.guess │ │ │ │ │ ├── config.stamp.in │ │ │ │ │ ├── config.sub │ │ │ │ │ ├── configure.ac │ │ │ │ │ ├── coverage.sh │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── html.xsl.in │ │ │ │ │ │ ├── jemalloc.xml.in │ │ │ │ │ │ ├── manpages.xsl.in │ │ │ │ │ │ └── stylesheet.xsl │ │ │ │ │ ├── include/ │ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ │ │ ├── arena.h │ │ │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ │ │ ├── base.h │ │ │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ │ │ ├── chunk.h │ │ │ │ │ │ │ │ ├── chunk_dss.h │ │ │ │ │ │ │ │ ├── chunk_mmap.h │ │ │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ │ │ ├── extent.h │ │ │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ │ │ ├── huge.h │ │ │ │ │ │ │ │ ├── jemalloc_internal.h.in │ │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ │ │ ├── mb.h │ │ │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ │ │ ├── private_symbols.txt │ │ │ │ │ │ │ │ ├── private_unnamespace.sh │ │ │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ │ │ ├── prof.h │ │ │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ │ │ ├── quarantine.h │ │ │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ │ │ ├── tcache.h │ │ │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ │ │ └── util.h │ │ │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ │ │ └── jemalloc_rename.sh │ │ │ │ │ │ └── msvc_compat/ │ │ │ │ │ │ ├── inttypes.h │ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ │ ├── stdint.h │ │ │ │ │ │ └── strings.h │ │ │ │ │ ├── install-sh │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── arena.c │ │ │ │ │ │ ├── atomic.c │ │ │ │ │ │ ├── base.c │ │ │ │ │ │ ├── bitmap.c │ │ │ │ │ │ ├── chunk.c │ │ │ │ │ │ ├── chunk_dss.c │ │ │ │ │ │ ├── chunk_mmap.c │ │ │ │ │ │ ├── ckh.c │ │ │ │ │ │ ├── ctl.c │ │ │ │ │ │ ├── extent.c │ │ │ │ │ │ ├── hash.c │ │ │ │ │ │ ├── huge.c │ │ │ │ │ │ ├── jemalloc.c │ │ │ │ │ │ ├── mb.c │ │ │ │ │ │ ├── mutex.c │ │ │ │ │ │ ├── prof.c │ │ │ │ │ │ ├── quarantine.c │ │ │ │ │ │ ├── rtree.c │ │ │ │ │ │ ├── stats.c │ │ │ │ │ │ ├── tcache.c │ │ │ │ │ │ ├── tsd.c │ │ │ │ │ │ ├── util.c │ │ │ │ │ │ └── zone.c │ │ │ │ │ └── test/ │ │ │ │ │ ├── include/ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── SFMT-alti.h │ │ │ │ │ │ ├── SFMT-params.h │ │ │ │ │ │ ├── SFMT-params11213.h │ │ │ │ │ │ ├── SFMT-params1279.h │ │ │ │ │ │ ├── SFMT-params132049.h │ │ │ │ │ │ ├── SFMT-params19937.h │ │ │ │ │ │ ├── SFMT-params216091.h │ │ │ │ │ │ ├── SFMT-params2281.h │ │ │ │ │ │ ├── SFMT-params4253.h │ │ │ │ │ │ ├── SFMT-params44497.h │ │ │ │ │ │ ├── SFMT-params607.h │ │ │ │ │ │ ├── SFMT-params86243.h │ │ │ │ │ │ ├── SFMT-sse2.h │ │ │ │ │ │ ├── SFMT.h │ │ │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ │ │ ├── math.h │ │ │ │ │ │ ├── mq.h │ │ │ │ │ │ ├── mtx.h │ │ │ │ │ │ ├── test.h │ │ │ │ │ │ └── thd.h │ │ │ │ │ ├── integration/ │ │ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ │ │ ├── aligned_alloc.c │ │ │ │ │ │ ├── allocated.c │ │ │ │ │ │ ├── allocm.c │ │ │ │ │ │ ├── mallocx.c │ │ │ │ │ │ ├── mremap.c │ │ │ │ │ │ ├── posix_memalign.c │ │ │ │ │ │ ├── rallocm.c │ │ │ │ │ │ ├── rallocx.c │ │ │ │ │ │ ├── thread_arena.c │ │ │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ │ │ └── xallocx.c │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ │ ├── math.c │ │ │ │ │ │ ├── mtx.c │ │ │ │ │ │ ├── test.c │ │ │ │ │ │ └── thd.c │ │ │ │ │ ├── test.sh.in │ │ │ │ │ └── unit/ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ ├── bitmap.c │ │ │ │ │ ├── ckh.c │ │ │ │ │ ├── hash.c │ │ │ │ │ ├── junk.c │ │ │ │ │ ├── mallctl.c │ │ │ │ │ ├── math.c │ │ │ │ │ ├── mq.c │ │ │ │ │ ├── mtx.c │ │ │ │ │ ├── prof_accum.c │ │ │ │ │ ├── prof_accum.h │ │ │ │ │ ├── prof_accum_a.c │ │ │ │ │ ├── prof_accum_b.c │ │ │ │ │ ├── prof_gdump.c │ │ │ │ │ ├── prof_idump.c │ │ │ │ │ ├── ql.c │ │ │ │ │ ├── qr.c │ │ │ │ │ ├── quarantine.c │ │ │ │ │ ├── rb.c │ │ │ │ │ ├── rtree.c │ │ │ │ │ ├── stats.c │ │ │ │ │ ├── tsd.c │ │ │ │ │ ├── util.c │ │ │ │ │ └── zero.c │ │ │ │ ├── linenoise/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.markdown │ │ │ │ │ ├── example.c │ │ │ │ │ ├── linenoise.c │ │ │ │ │ └── linenoise.h │ │ │ │ ├── lua/ │ │ │ │ │ ├── COPYRIGHT │ │ │ │ │ ├── HISTORY │ │ │ │ │ ├── INSTALL │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── contents.html │ │ │ │ │ │ ├── lua.1 │ │ │ │ │ │ ├── lua.css │ │ │ │ │ │ ├── lua.html │ │ │ │ │ │ ├── luac.1 │ │ │ │ │ │ ├── luac.html │ │ │ │ │ │ ├── manual.css │ │ │ │ │ │ ├── manual.html │ │ │ │ │ │ └── readme.html │ │ │ │ │ ├── etc/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── README │ │ │ │ │ │ ├── all.c │ │ │ │ │ │ ├── lua.hpp │ │ │ │ │ │ ├── lua.pc │ │ │ │ │ │ ├── luavs.bat │ │ │ │ │ │ ├── min.c │ │ │ │ │ │ ├── noparser.c │ │ │ │ │ │ └── strict.lua │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── fpconv.c │ │ │ │ │ │ ├── fpconv.h │ │ │ │ │ │ ├── lapi.c │ │ │ │ │ │ ├── lapi.h │ │ │ │ │ │ ├── lauxlib.c │ │ │ │ │ │ ├── lauxlib.h │ │ │ │ │ │ ├── lbaselib.c │ │ │ │ │ │ ├── lcode.c │ │ │ │ │ │ ├── lcode.h │ │ │ │ │ │ ├── ldblib.c │ │ │ │ │ │ ├── ldebug.c │ │ │ │ │ │ ├── ldebug.h │ │ │ │ │ │ ├── ldo.c │ │ │ │ │ │ ├── ldo.h │ │ │ │ │ │ ├── ldump.c │ │ │ │ │ │ ├── lfunc.c │ │ │ │ │ │ ├── lfunc.h │ │ │ │ │ │ ├── lgc.c │ │ │ │ │ │ ├── lgc.h │ │ │ │ │ │ ├── linit.c │ │ │ │ │ │ ├── liolib.c │ │ │ │ │ │ ├── llex.c │ │ │ │ │ │ ├── llex.h │ │ │ │ │ │ ├── llimits.h │ │ │ │ │ │ ├── lmathlib.c │ │ │ │ │ │ ├── lmem.c │ │ │ │ │ │ ├── lmem.h │ │ │ │ │ │ ├── loadlib.c │ │ │ │ │ │ ├── lobject.c │ │ │ │ │ │ ├── lobject.h │ │ │ │ │ │ ├── lopcodes.c │ │ │ │ │ │ ├── lopcodes.h │ │ │ │ │ │ ├── loslib.c │ │ │ │ │ │ ├── lparser.c │ │ │ │ │ │ ├── lparser.h │ │ │ │ │ │ ├── lstate.c │ │ │ │ │ │ ├── lstate.h │ │ │ │ │ │ ├── lstring.c │ │ │ │ │ │ ├── lstring.h │ │ │ │ │ │ ├── lstrlib.c │ │ │ │ │ │ ├── ltable.c │ │ │ │ │ │ ├── ltable.h │ │ │ │ │ │ ├── ltablib.c │ │ │ │ │ │ ├── ltm.c │ │ │ │ │ │ ├── ltm.h │ │ │ │ │ │ ├── lua.c │ │ │ │ │ │ ├── lua.h │ │ │ │ │ │ ├── lua_bit.c │ │ │ │ │ │ ├── lua_cjson.c │ │ │ │ │ │ ├── lua_cmsgpack.c │ │ │ │ │ │ ├── lua_struct.c │ │ │ │ │ │ ├── luac.c │ │ │ │ │ │ ├── luaconf.h │ │ │ │ │ │ ├── lualib.h │ │ │ │ │ │ ├── lundump.c │ │ │ │ │ │ ├── lundump.h │ │ │ │ │ │ ├── lvm.c │ │ │ │ │ │ ├── lvm.h │ │ │ │ │ │ ├── lzio.c │ │ │ │ │ │ ├── lzio.h │ │ │ │ │ │ ├── print.c │ │ │ │ │ │ ├── strbuf.c │ │ │ │ │ │ └── strbuf.h │ │ │ │ │ └── test/ │ │ │ │ │ ├── README │ │ │ │ │ ├── bisect.lua │ │ │ │ │ ├── cf.lua │ │ │ │ │ ├── echo.lua │ │ │ │ │ ├── env.lua │ │ │ │ │ ├── factorial.lua │ │ │ │ │ ├── fib.lua │ │ │ │ │ ├── fibfor.lua │ │ │ │ │ ├── globals.lua │ │ │ │ │ ├── hello.lua │ │ │ │ │ ├── life.lua │ │ │ │ │ ├── luac.lua │ │ │ │ │ ├── printf.lua │ │ │ │ │ ├── readonly.lua │ │ │ │ │ ├── sieve.lua │ │ │ │ │ ├── sort.lua │ │ │ │ │ ├── table.lua │ │ │ │ │ ├── trace-calls.lua │ │ │ │ │ ├── trace-globals.lua │ │ │ │ │ └── xd.lua │ │ │ │ └── update-jemalloc.sh │ │ │ ├── redis.conf │ │ │ ├── runtest │ │ │ ├── runtest-sentinel │ │ │ ├── sentinel.conf │ │ │ ├── src/ │ │ │ │ ├── .gitignore │ │ │ │ ├── Makefile │ │ │ │ ├── Makefile.dep │ │ │ │ ├── adlist.c │ │ │ │ ├── adlist.h │ │ │ │ ├── ae.c │ │ │ │ ├── ae.h │ │ │ │ ├── ae_epoll.c │ │ │ │ ├── ae_evport.c │ │ │ │ ├── ae_kqueue.c │ │ │ │ ├── ae_select.c │ │ │ │ ├── anet.c │ │ │ │ ├── anet.h │ │ │ │ ├── aof.c │ │ │ │ ├── asciilogo.h │ │ │ │ ├── bio.c │ │ │ │ ├── bio.h │ │ │ │ ├── bitops.c │ │ │ │ ├── config.c │ │ │ │ ├── config.h │ │ │ │ ├── crc32.c │ │ │ │ ├── crc64.c │ │ │ │ ├── crc64.h │ │ │ │ ├── db.c │ │ │ │ ├── debug.c │ │ │ │ ├── dict.c │ │ │ │ ├── dict.h │ │ │ │ ├── endianconv.c │ │ │ │ ├── endianconv.h │ │ │ │ ├── fmacros.h │ │ │ │ ├── help.h │ │ │ │ ├── hyperloglog.c │ │ │ │ ├── intset.c │ │ │ │ ├── intset.h │ │ │ │ ├── latency.c │ │ │ │ ├── latency.h │ │ │ │ ├── lzf.h │ │ │ │ ├── lzfP.h │ │ │ │ ├── lzf_c.c │ │ │ │ ├── lzf_d.c │ │ │ │ ├── memtest.c │ │ │ │ ├── migrate.c │ │ │ │ ├── mkreleasehdr.sh │ │ │ │ ├── multi.c │ │ │ │ ├── networking.c │ │ │ │ ├── notify.c │ │ │ │ ├── object.c │ │ │ │ ├── pqsort.c │ │ │ │ ├── pqsort.h │ │ │ │ ├── pubsub.c │ │ │ │ ├── rand.c │ │ │ │ ├── rand.h │ │ │ │ ├── rdb.c │ │ │ │ ├── rdb.h │ │ │ │ ├── redis-benchmark.c │ │ │ │ ├── redis-check-aof.c │ │ │ │ ├── redis-check-dump.c │ │ │ │ ├── redis-cli.c │ │ │ │ ├── redis.c │ │ │ │ ├── redis.h │ │ │ │ ├── redisassert.h │ │ │ │ ├── release.c │ │ │ │ ├── replication.c │ │ │ │ ├── rio.c │ │ │ │ ├── rio.h │ │ │ │ ├── scripting.c │ │ │ │ ├── sds.c │ │ │ │ ├── sds.h │ │ │ │ ├── sentinel.c │ │ │ │ ├── setproctitle.c │ │ │ │ ├── sha1.c │ │ │ │ ├── sha1.h │ │ │ │ ├── slots.c │ │ │ │ ├── slowlog.c │ │ │ │ ├── slowlog.h │ │ │ │ ├── solarisfixes.h │ │ │ │ ├── sort.c │ │ │ │ ├── sparkline.c │ │ │ │ ├── sparkline.h │ │ │ │ ├── syncio.c │ │ │ │ ├── t_hash.c │ │ │ │ ├── t_list.c │ │ │ │ ├── t_set.c │ │ │ │ ├── t_string.c │ │ │ │ ├── t_zset.c │ │ │ │ ├── testhelp.h │ │ │ │ ├── util.c │ │ │ │ ├── util.h │ │ │ │ ├── valgrind.sup │ │ │ │ ├── version.h │ │ │ │ ├── ziplist.c │ │ │ │ ├── ziplist.h │ │ │ │ ├── zipmap.c │ │ │ │ ├── zipmap.h │ │ │ │ ├── zmalloc.c │ │ │ │ └── zmalloc.h │ │ │ ├── tests/ │ │ │ │ ├── assets/ │ │ │ │ │ └── default.conf │ │ │ │ ├── helpers/ │ │ │ │ │ ├── bg_complex_data.tcl │ │ │ │ │ └── gen_write_load.tcl │ │ │ │ ├── instances.tcl │ │ │ │ ├── integration/ │ │ │ │ │ ├── aof-race.tcl │ │ │ │ │ ├── aof.tcl │ │ │ │ │ ├── convert-zipmap-hash-on-load.tcl │ │ │ │ │ ├── rdb.tcl │ │ │ │ │ ├── redis-cli.tcl │ │ │ │ │ ├── replication-2.tcl │ │ │ │ │ ├── replication-3.tcl │ │ │ │ │ ├── replication-4.tcl │ │ │ │ │ ├── replication-psync.tcl │ │ │ │ │ └── replication.tcl │ │ │ │ ├── sentinel/ │ │ │ │ │ ├── run.tcl │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── 00-base.tcl │ │ │ │ │ │ ├── 01-conf-update.tcl │ │ │ │ │ │ ├── 02-slaves-reconf.tcl │ │ │ │ │ │ ├── 03-runtime-reconf.tcl │ │ │ │ │ │ ├── 04-slave-selection.tcl │ │ │ │ │ │ ├── 05-manual.tcl │ │ │ │ │ │ ├── 06-ckquorum.tcl │ │ │ │ │ │ └── includes/ │ │ │ │ │ │ └── init-tests.tcl │ │ │ │ │ └── tmp/ │ │ │ │ │ └── .gitignore │ │ │ │ ├── support/ │ │ │ │ │ ├── redis.tcl │ │ │ │ │ ├── server.tcl │ │ │ │ │ ├── test.tcl │ │ │ │ │ ├── tmpfile.tcl │ │ │ │ │ └── util.tcl │ │ │ │ ├── test_helper.tcl │ │ │ │ └── unit/ │ │ │ │ ├── aofrw.tcl │ │ │ │ ├── auth.tcl │ │ │ │ ├── basic.tcl │ │ │ │ ├── bitops.tcl │ │ │ │ ├── dump.tcl │ │ │ │ ├── expire.tcl │ │ │ │ ├── hyperloglog.tcl │ │ │ │ ├── introspection.tcl │ │ │ │ ├── latency-monitor.tcl │ │ │ │ ├── limits.tcl │ │ │ │ ├── maxmemory.tcl │ │ │ │ ├── memefficiency.tcl │ │ │ │ ├── multi.tcl │ │ │ │ ├── obuf-limits.tcl │ │ │ │ ├── other.tcl │ │ │ │ ├── printver.tcl │ │ │ │ ├── protocol.tcl │ │ │ │ ├── pubsub.tcl │ │ │ │ ├── quit.tcl │ │ │ │ ├── scan.tcl │ │ │ │ ├── scripting.tcl │ │ │ │ ├── slowlog.tcl │ │ │ │ ├── sort.tcl │ │ │ │ └── type/ │ │ │ │ ├── hash.tcl │ │ │ │ ├── list-2.tcl │ │ │ │ ├── list-3.tcl │ │ │ │ ├── list-common.tcl │ │ │ │ ├── list.tcl │ │ │ │ ├── set.tcl │ │ │ │ └── zset.tcl │ │ │ └── utils/ │ │ │ ├── build-static-symbols.tcl │ │ │ ├── generate-command-help.rb │ │ │ ├── hyperloglog/ │ │ │ │ ├── .gitignore │ │ │ │ ├── hll-err.rb │ │ │ │ └── hll-gnuplot-graph.rb │ │ │ ├── install_server.sh │ │ │ ├── mkrelease.sh │ │ │ ├── redis-copy.rb │ │ │ ├── redis-sha1.rb │ │ │ ├── redis_init_script │ │ │ ├── redis_init_script.tpl │ │ │ ├── speed-regression.tcl │ │ │ └── whatisdoing.sh │ │ ├── redis-3.2.4/ │ │ │ ├── .gitignore │ │ │ ├── 00-RELEASENOTES │ │ │ ├── 0000-redis.patch │ │ │ ├── 0001-slotsscan.patch │ │ │ ├── 0002-rehash.patch │ │ │ ├── BUGS │ │ │ ├── CONTRIBUTING │ │ │ ├── COPYING │ │ │ ├── INSTALL │ │ │ ├── MANIFESTO │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── deps/ │ │ │ │ ├── Makefile │ │ │ │ ├── README.md │ │ │ │ ├── geohash-int/ │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── geohash.c │ │ │ │ │ ├── geohash.h │ │ │ │ │ ├── geohash_helper.c │ │ │ │ │ └── geohash_helper.h │ │ │ │ ├── hiredis/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .travis.yml │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── COPYING │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.md │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ ├── ae.h │ │ │ │ │ │ ├── libev.h │ │ │ │ │ │ ├── libevent.h │ │ │ │ │ │ └── libuv.h │ │ │ │ │ ├── async.c │ │ │ │ │ ├── async.h │ │ │ │ │ ├── dict.c │ │ │ │ │ ├── dict.h │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── example-ae.c │ │ │ │ │ │ ├── example-libev.c │ │ │ │ │ │ ├── example-libevent.c │ │ │ │ │ │ ├── example-libuv.c │ │ │ │ │ │ └── example.c │ │ │ │ │ ├── fmacros.h │ │ │ │ │ ├── hiredis.c │ │ │ │ │ ├── hiredis.h │ │ │ │ │ ├── net.c │ │ │ │ │ ├── net.h │ │ │ │ │ ├── sds.c │ │ │ │ │ ├── sds.h │ │ │ │ │ ├── sdsalloc.h │ │ │ │ │ ├── test.c │ │ │ │ │ └── zmalloc.h │ │ │ │ ├── jemalloc/ │ │ │ │ │ ├── .autom4te.cfg │ │ │ │ │ ├── .gitattributes │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── COPYING │ │ │ │ │ ├── ChangeLog │ │ │ │ │ ├── INSTALL │ │ │ │ │ ├── Makefile.in │ │ │ │ │ ├── README │ │ │ │ │ ├── autogen.sh │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── jemalloc-config.in │ │ │ │ │ │ ├── jemalloc.sh.in │ │ │ │ │ │ └── jeprof.in │ │ │ │ │ ├── build-aux/ │ │ │ │ │ │ ├── config.guess │ │ │ │ │ │ ├── config.sub │ │ │ │ │ │ └── install-sh │ │ │ │ │ ├── config.stamp.in │ │ │ │ │ ├── configure.ac │ │ │ │ │ ├── coverage.sh │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── html.xsl.in │ │ │ │ │ │ ├── jemalloc.xml.in │ │ │ │ │ │ ├── manpages.xsl.in │ │ │ │ │ │ └── stylesheet.xsl │ │ │ │ │ ├── include/ │ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ │ │ ├── arena.h │ │ │ │ │ │ │ │ ├── assert.h │ │ │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ │ │ ├── base.h │ │ │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ │ │ ├── chunk.h │ │ │ │ │ │ │ │ ├── chunk_dss.h │ │ │ │ │ │ │ │ ├── chunk_mmap.h │ │ │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ │ │ ├── extent.h │ │ │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ │ │ ├── huge.h │ │ │ │ │ │ │ │ ├── jemalloc_internal.h.in │ │ │ │ │ │ │ │ ├── jemalloc_internal_decls.h │ │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ │ │ ├── mb.h │ │ │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ │ │ ├── nstime.h │ │ │ │ │ │ │ │ ├── pages.h │ │ │ │ │ │ │ │ ├── ph.h │ │ │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ │ │ ├── private_symbols.txt │ │ │ │ │ │ │ │ ├── private_unnamespace.sh │ │ │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ │ │ ├── prof.h │ │ │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ │ │ ├── quarantine.h │ │ │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ │ │ ├── smoothstep.h │ │ │ │ │ │ │ │ ├── smoothstep.sh │ │ │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ │ │ ├── tcache.h │ │ │ │ │ │ │ │ ├── ticker.h │ │ │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ │ │ ├── valgrind.h │ │ │ │ │ │ │ │ └── witness.h │ │ │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ │ │ ├── jemalloc_rename.sh │ │ │ │ │ │ │ └── jemalloc_typedefs.h.in │ │ │ │ │ │ └── msvc_compat/ │ │ │ │ │ │ ├── C99/ │ │ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ │ │ └── stdint.h │ │ │ │ │ │ ├── strings.h │ │ │ │ │ │ └── windows_extra.h │ │ │ │ │ ├── jemalloc.pc.in │ │ │ │ │ ├── msvc/ │ │ │ │ │ │ ├── ReadMe.txt │ │ │ │ │ │ ├── jemalloc_vc2015.sln │ │ │ │ │ │ └── projects/ │ │ │ │ │ │ └── vc2015/ │ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ │ ├── jemalloc.vcxproj │ │ │ │ │ │ │ └── jemalloc.vcxproj.filters │ │ │ │ │ │ └── test_threads/ │ │ │ │ │ │ ├── test_threads.cpp │ │ │ │ │ │ ├── test_threads.h │ │ │ │ │ │ ├── test_threads.vcxproj │ │ │ │ │ │ ├── test_threads.vcxproj.filters │ │ │ │ │ │ └── test_threads_main.cpp │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── arena.c │ │ │ │ │ │ ├── atomic.c │ │ │ │ │ │ ├── base.c │ │ │ │ │ │ ├── bitmap.c │ │ │ │ │ │ ├── chunk.c │ │ │ │ │ │ ├── chunk_dss.c │ │ │ │ │ │ ├── chunk_mmap.c │ │ │ │ │ │ ├── ckh.c │ │ │ │ │ │ ├── ctl.c │ │ │ │ │ │ ├── extent.c │ │ │ │ │ │ ├── hash.c │ │ │ │ │ │ ├── huge.c │ │ │ │ │ │ ├── jemalloc.c │ │ │ │ │ │ ├── mb.c │ │ │ │ │ │ ├── mutex.c │ │ │ │ │ │ ├── nstime.c │ │ │ │ │ │ ├── pages.c │ │ │ │ │ │ ├── prng.c │ │ │ │ │ │ ├── prof.c │ │ │ │ │ │ ├── quarantine.c │ │ │ │ │ │ ├── rtree.c │ │ │ │ │ │ ├── stats.c │ │ │ │ │ │ ├── tcache.c │ │ │ │ │ │ ├── ticker.c │ │ │ │ │ │ ├── tsd.c │ │ │ │ │ │ ├── util.c │ │ │ │ │ │ ├── valgrind.c │ │ │ │ │ │ ├── witness.c │ │ │ │ │ │ └── zone.c │ │ │ │ │ └── test/ │ │ │ │ │ ├── include/ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── SFMT-alti.h │ │ │ │ │ │ ├── SFMT-params.h │ │ │ │ │ │ ├── SFMT-params11213.h │ │ │ │ │ │ ├── SFMT-params1279.h │ │ │ │ │ │ ├── SFMT-params132049.h │ │ │ │ │ │ ├── SFMT-params19937.h │ │ │ │ │ │ ├── SFMT-params216091.h │ │ │ │ │ │ ├── SFMT-params2281.h │ │ │ │ │ │ ├── SFMT-params4253.h │ │ │ │ │ │ ├── SFMT-params44497.h │ │ │ │ │ │ ├── SFMT-params607.h │ │ │ │ │ │ ├── SFMT-params86243.h │ │ │ │ │ │ ├── SFMT-sse2.h │ │ │ │ │ │ ├── SFMT.h │ │ │ │ │ │ ├── btalloc.h │ │ │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ │ │ ├── math.h │ │ │ │ │ │ ├── mq.h │ │ │ │ │ │ ├── mtx.h │ │ │ │ │ │ ├── test.h │ │ │ │ │ │ ├── thd.h │ │ │ │ │ │ └── timer.h │ │ │ │ │ ├── integration/ │ │ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ │ │ ├── aligned_alloc.c │ │ │ │ │ │ ├── allocated.c │ │ │ │ │ │ ├── chunk.c │ │ │ │ │ │ ├── mallocx.c │ │ │ │ │ │ ├── overflow.c │ │ │ │ │ │ ├── posix_memalign.c │ │ │ │ │ │ ├── rallocx.c │ │ │ │ │ │ ├── sdallocx.c │ │ │ │ │ │ ├── thread_arena.c │ │ │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ │ │ └── xallocx.c │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ │ ├── btalloc.c │ │ │ │ │ │ ├── btalloc_0.c │ │ │ │ │ │ ├── btalloc_1.c │ │ │ │ │ │ ├── math.c │ │ │ │ │ │ ├── mq.c │ │ │ │ │ │ ├── mtx.c │ │ │ │ │ │ ├── test.c │ │ │ │ │ │ ├── thd.c │ │ │ │ │ │ └── timer.c │ │ │ │ │ ├── stress/ │ │ │ │ │ │ └── microbench.c │ │ │ │ │ ├── test.sh.in │ │ │ │ │ └── unit/ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ ├── a0.c │ │ │ │ │ ├── arena_reset.c │ │ │ │ │ ├── atomic.c │ │ │ │ │ ├── bitmap.c │ │ │ │ │ ├── ckh.c │ │ │ │ │ ├── decay.c │ │ │ │ │ ├── fork.c │ │ │ │ │ ├── hash.c │ │ │ │ │ ├── junk.c │ │ │ │ │ ├── junk_alloc.c │ │ │ │ │ ├── junk_free.c │ │ │ │ │ ├── lg_chunk.c │ │ │ │ │ ├── mallctl.c │ │ │ │ │ ├── math.c │ │ │ │ │ ├── mq.c │ │ │ │ │ ├── mtx.c │ │ │ │ │ ├── nstime.c │ │ │ │ │ ├── ph.c │ │ │ │ │ ├── prng.c │ │ │ │ │ ├── prof_accum.c │ │ │ │ │ ├── prof_active.c │ │ │ │ │ ├── prof_gdump.c │ │ │ │ │ ├── prof_idump.c │ │ │ │ │ ├── prof_reset.c │ │ │ │ │ ├── prof_thread_name.c │ │ │ │ │ ├── ql.c │ │ │ │ │ ├── qr.c │ │ │ │ │ ├── quarantine.c │ │ │ │ │ ├── rb.c │ │ │ │ │ ├── rtree.c │ │ │ │ │ ├── run_quantize.c │ │ │ │ │ ├── size_classes.c │ │ │ │ │ ├── smoothstep.c │ │ │ │ │ ├── stats.c │ │ │ │ │ ├── ticker.c │ │ │ │ │ ├── tsd.c │ │ │ │ │ ├── util.c │ │ │ │ │ ├── witness.c │ │ │ │ │ └── zero.c │ │ │ │ ├── linenoise/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.markdown │ │ │ │ │ ├── example.c │ │ │ │ │ ├── linenoise.c │ │ │ │ │ └── linenoise.h │ │ │ │ ├── lua/ │ │ │ │ │ ├── COPYRIGHT │ │ │ │ │ ├── HISTORY │ │ │ │ │ ├── INSTALL │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── contents.html │ │ │ │ │ │ ├── lua.1 │ │ │ │ │ │ ├── lua.css │ │ │ │ │ │ ├── lua.html │ │ │ │ │ │ ├── luac.1 │ │ │ │ │ │ ├── luac.html │ │ │ │ │ │ ├── manual.css │ │ │ │ │ │ ├── manual.html │ │ │ │ │ │ └── readme.html │ │ │ │ │ ├── etc/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── README │ │ │ │ │ │ ├── all.c │ │ │ │ │ │ ├── lua.hpp │ │ │ │ │ │ ├── lua.pc │ │ │ │ │ │ ├── luavs.bat │ │ │ │ │ │ ├── min.c │ │ │ │ │ │ ├── noparser.c │ │ │ │ │ │ └── strict.lua │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── fpconv.c │ │ │ │ │ │ ├── fpconv.h │ │ │ │ │ │ ├── lapi.c │ │ │ │ │ │ ├── lapi.h │ │ │ │ │ │ ├── lauxlib.c │ │ │ │ │ │ ├── lauxlib.h │ │ │ │ │ │ ├── lbaselib.c │ │ │ │ │ │ ├── lcode.c │ │ │ │ │ │ ├── lcode.h │ │ │ │ │ │ ├── ldblib.c │ │ │ │ │ │ ├── ldebug.c │ │ │ │ │ │ ├── ldebug.h │ │ │ │ │ │ ├── ldo.c │ │ │ │ │ │ ├── ldo.h │ │ │ │ │ │ ├── ldump.c │ │ │ │ │ │ ├── lfunc.c │ │ │ │ │ │ ├── lfunc.h │ │ │ │ │ │ ├── lgc.c │ │ │ │ │ │ ├── lgc.h │ │ │ │ │ │ ├── linit.c │ │ │ │ │ │ ├── liolib.c │ │ │ │ │ │ ├── llex.c │ │ │ │ │ │ ├── llex.h │ │ │ │ │ │ ├── llimits.h │ │ │ │ │ │ ├── lmathlib.c │ │ │ │ │ │ ├── lmem.c │ │ │ │ │ │ ├── lmem.h │ │ │ │ │ │ ├── loadlib.c │ │ │ │ │ │ ├── lobject.c │ │ │ │ │ │ ├── lobject.h │ │ │ │ │ │ ├── lopcodes.c │ │ │ │ │ │ ├── lopcodes.h │ │ │ │ │ │ ├── loslib.c │ │ │ │ │ │ ├── lparser.c │ │ │ │ │ │ ├── lparser.h │ │ │ │ │ │ ├── lstate.c │ │ │ │ │ │ ├── lstate.h │ │ │ │ │ │ ├── lstring.c │ │ │ │ │ │ ├── lstring.h │ │ │ │ │ │ ├── lstrlib.c │ │ │ │ │ │ ├── ltable.c │ │ │ │ │ │ ├── ltable.h │ │ │ │ │ │ ├── ltablib.c │ │ │ │ │ │ ├── ltm.c │ │ │ │ │ │ ├── ltm.h │ │ │ │ │ │ ├── lua.c │ │ │ │ │ │ ├── lua.h │ │ │ │ │ │ ├── lua_bit.c │ │ │ │ │ │ ├── lua_cjson.c │ │ │ │ │ │ ├── lua_cmsgpack.c │ │ │ │ │ │ ├── lua_struct.c │ │ │ │ │ │ ├── luac.c │ │ │ │ │ │ ├── luaconf.h │ │ │ │ │ │ ├── lualib.h │ │ │ │ │ │ ├── lundump.c │ │ │ │ │ │ ├── lundump.h │ │ │ │ │ │ ├── lvm.c │ │ │ │ │ │ ├── lvm.h │ │ │ │ │ │ ├── lzio.c │ │ │ │ │ │ ├── lzio.h │ │ │ │ │ │ ├── print.c │ │ │ │ │ │ ├── strbuf.c │ │ │ │ │ │ └── strbuf.h │ │ │ │ │ └── test/ │ │ │ │ │ ├── README │ │ │ │ │ ├── bisect.lua │ │ │ │ │ ├── cf.lua │ │ │ │ │ ├── echo.lua │ │ │ │ │ ├── env.lua │ │ │ │ │ ├── factorial.lua │ │ │ │ │ ├── fib.lua │ │ │ │ │ ├── fibfor.lua │ │ │ │ │ ├── globals.lua │ │ │ │ │ ├── hello.lua │ │ │ │ │ ├── life.lua │ │ │ │ │ ├── luac.lua │ │ │ │ │ ├── printf.lua │ │ │ │ │ ├── readonly.lua │ │ │ │ │ ├── sieve.lua │ │ │ │ │ ├── sort.lua │ │ │ │ │ ├── table.lua │ │ │ │ │ ├── trace-calls.lua │ │ │ │ │ ├── trace-globals.lua │ │ │ │ │ └── xd.lua │ │ │ │ └── update-jemalloc.sh │ │ │ ├── redis.conf │ │ │ ├── runtest │ │ │ ├── runtest-cluster │ │ │ ├── runtest-sentinel │ │ │ ├── sentinel.conf │ │ │ ├── src/ │ │ │ │ ├── .gitignore │ │ │ │ ├── Makefile │ │ │ │ ├── Makefile.dep │ │ │ │ ├── adlist.c │ │ │ │ ├── adlist.h │ │ │ │ ├── ae.c │ │ │ │ ├── ae.h │ │ │ │ ├── ae_epoll.c │ │ │ │ ├── ae_evport.c │ │ │ │ ├── ae_kqueue.c │ │ │ │ ├── ae_select.c │ │ │ │ ├── anet.c │ │ │ │ ├── anet.h │ │ │ │ ├── aof.c │ │ │ │ ├── asciilogo.h │ │ │ │ ├── bio.c │ │ │ │ ├── bio.h │ │ │ │ ├── bitops.c │ │ │ │ ├── blocked.c │ │ │ │ ├── cluster.c │ │ │ │ ├── cluster.h │ │ │ │ ├── config.c │ │ │ │ ├── config.h │ │ │ │ ├── crc16.c │ │ │ │ ├── crc32.c │ │ │ │ ├── crc64.c │ │ │ │ ├── crc64.h │ │ │ │ ├── db.c │ │ │ │ ├── debug.c │ │ │ │ ├── debugmacro.h │ │ │ │ ├── dict.c │ │ │ │ ├── dict.h │ │ │ │ ├── endianconv.c │ │ │ │ ├── endianconv.h │ │ │ │ ├── fmacros.h │ │ │ │ ├── geo.c │ │ │ │ ├── geo.h │ │ │ │ ├── help.h │ │ │ │ ├── hyperloglog.c │ │ │ │ ├── intset.c │ │ │ │ ├── intset.h │ │ │ │ ├── latency.c │ │ │ │ ├── latency.h │ │ │ │ ├── lzf.h │ │ │ │ ├── lzfP.h │ │ │ │ ├── lzf_c.c │ │ │ │ ├── lzf_d.c │ │ │ │ ├── memtest.c │ │ │ │ ├── mkreleasehdr.sh │ │ │ │ ├── multi.c │ │ │ │ ├── networking.c │ │ │ │ ├── notify.c │ │ │ │ ├── object.c │ │ │ │ ├── pqsort.c │ │ │ │ ├── pqsort.h │ │ │ │ ├── pubsub.c │ │ │ │ ├── quicklist.c │ │ │ │ ├── quicklist.h │ │ │ │ ├── rand.c │ │ │ │ ├── rand.h │ │ │ │ ├── rdb.c │ │ │ │ ├── rdb.h │ │ │ │ ├── redis-benchmark.c │ │ │ │ ├── redis-check-aof.c │ │ │ │ ├── redis-check-rdb.c │ │ │ │ ├── redis-cli.c │ │ │ │ ├── redis-trib.rb │ │ │ │ ├── redisassert.h │ │ │ │ ├── release.c │ │ │ │ ├── replication.c │ │ │ │ ├── rio.c │ │ │ │ ├── rio.h │ │ │ │ ├── scripting.c │ │ │ │ ├── sds.c │ │ │ │ ├── sds.h │ │ │ │ ├── sdsalloc.h │ │ │ │ ├── sentinel.c │ │ │ │ ├── server.c │ │ │ │ ├── server.h │ │ │ │ ├── setproctitle.c │ │ │ │ ├── sha1.c │ │ │ │ ├── sha1.h │ │ │ │ ├── slots.c │ │ │ │ ├── slowlog.c │ │ │ │ ├── slowlog.h │ │ │ │ ├── solarisfixes.h │ │ │ │ ├── sort.c │ │ │ │ ├── sparkline.c │ │ │ │ ├── sparkline.h │ │ │ │ ├── syncio.c │ │ │ │ ├── t_hash.c │ │ │ │ ├── t_list.c │ │ │ │ ├── t_set.c │ │ │ │ ├── t_string.c │ │ │ │ ├── t_zset.c │ │ │ │ ├── testhelp.h │ │ │ │ ├── util.c │ │ │ │ ├── util.h │ │ │ │ ├── valgrind.sup │ │ │ │ ├── version.h │ │ │ │ ├── ziplist.c │ │ │ │ ├── ziplist.h │ │ │ │ ├── zipmap.c │ │ │ │ ├── zipmap.h │ │ │ │ ├── zmalloc.c │ │ │ │ └── zmalloc.h │ │ │ ├── tests/ │ │ │ │ ├── assets/ │ │ │ │ │ └── default.conf │ │ │ │ ├── cluster/ │ │ │ │ │ ├── cluster.tcl │ │ │ │ │ ├── run.tcl │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── 00-base.tcl │ │ │ │ │ │ ├── 01-faildet.tcl │ │ │ │ │ │ ├── 02-failover.tcl │ │ │ │ │ │ ├── 03-failover-loop.tcl │ │ │ │ │ │ ├── 04-resharding.tcl │ │ │ │ │ │ ├── 05-slave-selection.tcl │ │ │ │ │ │ ├── 06-slave-stop-cond.tcl │ │ │ │ │ │ ├── 07-replica-migration.tcl │ │ │ │ │ │ ├── 08-update-msg.tcl │ │ │ │ │ │ ├── 09-pubsub.tcl │ │ │ │ │ │ ├── 10-manual-failover.tcl │ │ │ │ │ │ ├── 11-manual-takeover.tcl │ │ │ │ │ │ ├── 12-replica-migration-2.tcl │ │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ │ └── onlydots.tcl │ │ │ │ │ │ └── includes/ │ │ │ │ │ │ └── init-tests.tcl │ │ │ │ │ └── tmp/ │ │ │ │ │ └── .gitignore │ │ │ │ ├── helpers/ │ │ │ │ │ ├── bg_complex_data.tcl │ │ │ │ │ └── gen_write_load.tcl │ │ │ │ ├── instances.tcl │ │ │ │ ├── integration/ │ │ │ │ │ ├── aof-race.tcl │ │ │ │ │ ├── aof.tcl │ │ │ │ │ ├── convert-zipmap-hash-on-load.tcl │ │ │ │ │ ├── logging.tcl │ │ │ │ │ ├── rdb.tcl │ │ │ │ │ ├── redis-cli.tcl │ │ │ │ │ ├── replication-2.tcl │ │ │ │ │ ├── replication-3.tcl │ │ │ │ │ ├── replication-4.tcl │ │ │ │ │ ├── replication-psync.tcl │ │ │ │ │ └── replication.tcl │ │ │ │ ├── sentinel/ │ │ │ │ │ ├── run.tcl │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── 00-base.tcl │ │ │ │ │ │ ├── 01-conf-update.tcl │ │ │ │ │ │ ├── 02-slaves-reconf.tcl │ │ │ │ │ │ ├── 03-runtime-reconf.tcl │ │ │ │ │ │ ├── 04-slave-selection.tcl │ │ │ │ │ │ ├── 05-manual.tcl │ │ │ │ │ │ ├── 06-ckquorum.tcl │ │ │ │ │ │ ├── 07-down-conditions.tcl │ │ │ │ │ │ └── includes/ │ │ │ │ │ │ └── init-tests.tcl │ │ │ │ │ └── tmp/ │ │ │ │ │ └── .gitignore │ │ │ │ ├── support/ │ │ │ │ │ ├── cluster.tcl │ │ │ │ │ ├── redis.tcl │ │ │ │ │ ├── server.tcl │ │ │ │ │ ├── test.tcl │ │ │ │ │ ├── tmpfile.tcl │ │ │ │ │ └── util.tcl │ │ │ │ ├── test_helper.tcl │ │ │ │ └── unit/ │ │ │ │ ├── aofrw.tcl │ │ │ │ ├── auth.tcl │ │ │ │ ├── bitfield.tcl │ │ │ │ ├── bitops.tcl │ │ │ │ ├── dump.tcl │ │ │ │ ├── expire.tcl │ │ │ │ ├── geo.tcl │ │ │ │ ├── hyperloglog.tcl │ │ │ │ ├── introspection-2.tcl │ │ │ │ ├── introspection.tcl │ │ │ │ ├── keyspace.tcl │ │ │ │ ├── latency-monitor.tcl │ │ │ │ ├── limits.tcl │ │ │ │ ├── maxmemory.tcl │ │ │ │ ├── memefficiency.tcl │ │ │ │ ├── multi.tcl │ │ │ │ ├── obuf-limits.tcl │ │ │ │ ├── other.tcl │ │ │ │ ├── printver.tcl │ │ │ │ ├── protocol.tcl │ │ │ │ ├── pubsub.tcl │ │ │ │ ├── quit.tcl │ │ │ │ ├── scan.tcl │ │ │ │ ├── scripting.tcl │ │ │ │ ├── slowlog.tcl │ │ │ │ ├── sort.tcl │ │ │ │ └── type/ │ │ │ │ ├── hash.tcl │ │ │ │ ├── incr.tcl │ │ │ │ ├── list-2.tcl │ │ │ │ ├── list-3.tcl │ │ │ │ ├── list-common.tcl │ │ │ │ ├── list.tcl │ │ │ │ ├── set.tcl │ │ │ │ ├── string.tcl │ │ │ │ └── zset.tcl │ │ │ └── utils/ │ │ │ ├── build-static-symbols.tcl │ │ │ ├── cluster_fail_time.tcl │ │ │ ├── corrupt_rdb.c │ │ │ ├── create-cluster/ │ │ │ │ ├── .gitignore │ │ │ │ ├── README │ │ │ │ └── create-cluster │ │ │ ├── generate-command-help.rb │ │ │ ├── hashtable/ │ │ │ │ ├── README │ │ │ │ └── rehashing.c │ │ │ ├── hyperloglog/ │ │ │ │ ├── .gitignore │ │ │ │ ├── hll-err.rb │ │ │ │ └── hll-gnuplot-graph.rb │ │ │ ├── install_server.sh │ │ │ ├── lru/ │ │ │ │ ├── README │ │ │ │ └── test-lru.rb │ │ │ ├── redis-copy.rb │ │ │ ├── redis-sha1.rb │ │ │ ├── redis_init_script │ │ │ ├── redis_init_script.tpl │ │ │ ├── releasetools/ │ │ │ │ ├── 01_create_tarball.sh │ │ │ │ ├── 02_upload_tarball.sh │ │ │ │ ├── 03_test_release.sh │ │ │ │ └── 04_release_hash.sh │ │ │ ├── speed-regression.tcl │ │ │ └── whatisdoing.sh │ │ ├── redis-3.2.8/ │ │ │ ├── .gitignore │ │ │ ├── 00-RELEASENOTES │ │ │ ├── BUGS │ │ │ ├── CONTRIBUTING │ │ │ ├── COPYING │ │ │ ├── INSTALL │ │ │ ├── MANIFESTO │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── deps/ │ │ │ │ ├── Makefile │ │ │ │ ├── README.md │ │ │ │ ├── geohash-int/ │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── geohash.c │ │ │ │ │ ├── geohash.h │ │ │ │ │ ├── geohash_helper.c │ │ │ │ │ └── geohash_helper.h │ │ │ │ ├── hiredis/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── .travis.yml │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── COPYING │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.md │ │ │ │ │ ├── adapters/ │ │ │ │ │ │ ├── ae.h │ │ │ │ │ │ ├── libev.h │ │ │ │ │ │ ├── libevent.h │ │ │ │ │ │ └── libuv.h │ │ │ │ │ ├── async.c │ │ │ │ │ ├── async.h │ │ │ │ │ ├── dict.c │ │ │ │ │ ├── dict.h │ │ │ │ │ ├── examples/ │ │ │ │ │ │ ├── example-ae.c │ │ │ │ │ │ ├── example-libev.c │ │ │ │ │ │ ├── example-libevent.c │ │ │ │ │ │ ├── example-libuv.c │ │ │ │ │ │ └── example.c │ │ │ │ │ ├── fmacros.h │ │ │ │ │ ├── hiredis.c │ │ │ │ │ ├── hiredis.h │ │ │ │ │ ├── net.c │ │ │ │ │ ├── net.h │ │ │ │ │ ├── sds.c │ │ │ │ │ ├── sds.h │ │ │ │ │ ├── sdsalloc.h │ │ │ │ │ ├── test.c │ │ │ │ │ └── zmalloc.h │ │ │ │ ├── jemalloc/ │ │ │ │ │ ├── .autom4te.cfg │ │ │ │ │ ├── .gitattributes │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── COPYING │ │ │ │ │ ├── ChangeLog │ │ │ │ │ ├── INSTALL │ │ │ │ │ ├── Makefile.in │ │ │ │ │ ├── README │ │ │ │ │ ├── VERSION │ │ │ │ │ ├── autogen.sh │ │ │ │ │ ├── bin/ │ │ │ │ │ │ ├── jemalloc-config.in │ │ │ │ │ │ ├── jemalloc.sh.in │ │ │ │ │ │ └── jeprof.in │ │ │ │ │ ├── config.guess │ │ │ │ │ ├── config.stamp.in │ │ │ │ │ ├── config.sub │ │ │ │ │ ├── configure │ │ │ │ │ ├── configure.ac │ │ │ │ │ ├── coverage.sh │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── html.xsl.in │ │ │ │ │ │ ├── jemalloc.xml.in │ │ │ │ │ │ ├── manpages.xsl.in │ │ │ │ │ │ └── stylesheet.xsl │ │ │ │ │ ├── include/ │ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ │ │ ├── arena.h │ │ │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ │ │ ├── base.h │ │ │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ │ │ ├── chunk.h │ │ │ │ │ │ │ │ ├── chunk_dss.h │ │ │ │ │ │ │ │ ├── chunk_mmap.h │ │ │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ │ │ ├── extent.h │ │ │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ │ │ ├── huge.h │ │ │ │ │ │ │ │ ├── jemalloc_internal.h.in │ │ │ │ │ │ │ │ ├── jemalloc_internal_decls.h │ │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ │ │ ├── mb.h │ │ │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ │ │ ├── pages.h │ │ │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ │ │ ├── private_symbols.txt │ │ │ │ │ │ │ │ ├── private_unnamespace.sh │ │ │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ │ │ ├── prof.h │ │ │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ │ │ ├── quarantine.h │ │ │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ │ │ ├── tcache.h │ │ │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ │ │ └── valgrind.h │ │ │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ │ │ ├── jemalloc_rename.sh │ │ │ │ │ │ │ └── jemalloc_typedefs.h.in │ │ │ │ │ │ └── msvc_compat/ │ │ │ │ │ │ ├── C99/ │ │ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ │ │ └── stdint.h │ │ │ │ │ │ ├── strings.h │ │ │ │ │ │ └── windows_extra.h │ │ │ │ │ ├── install-sh │ │ │ │ │ ├── jemalloc.pc.in │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── arena.c │ │ │ │ │ │ ├── atomic.c │ │ │ │ │ │ ├── base.c │ │ │ │ │ │ ├── bitmap.c │ │ │ │ │ │ ├── chunk.c │ │ │ │ │ │ ├── chunk_dss.c │ │ │ │ │ │ ├── chunk_mmap.c │ │ │ │ │ │ ├── ckh.c │ │ │ │ │ │ ├── ctl.c │ │ │ │ │ │ ├── extent.c │ │ │ │ │ │ ├── hash.c │ │ │ │ │ │ ├── huge.c │ │ │ │ │ │ ├── jemalloc.c │ │ │ │ │ │ ├── mb.c │ │ │ │ │ │ ├── mutex.c │ │ │ │ │ │ ├── pages.c │ │ │ │ │ │ ├── prof.c │ │ │ │ │ │ ├── quarantine.c │ │ │ │ │ │ ├── rtree.c │ │ │ │ │ │ ├── stats.c │ │ │ │ │ │ ├── tcache.c │ │ │ │ │ │ ├── tsd.c │ │ │ │ │ │ ├── util.c │ │ │ │ │ │ ├── valgrind.c │ │ │ │ │ │ └── zone.c │ │ │ │ │ └── test/ │ │ │ │ │ ├── include/ │ │ │ │ │ │ └── test/ │ │ │ │ │ │ ├── SFMT-alti.h │ │ │ │ │ │ ├── SFMT-params.h │ │ │ │ │ │ ├── SFMT-params11213.h │ │ │ │ │ │ ├── SFMT-params1279.h │ │ │ │ │ │ ├── SFMT-params132049.h │ │ │ │ │ │ ├── SFMT-params19937.h │ │ │ │ │ │ ├── SFMT-params216091.h │ │ │ │ │ │ ├── SFMT-params2281.h │ │ │ │ │ │ ├── SFMT-params4253.h │ │ │ │ │ │ ├── SFMT-params44497.h │ │ │ │ │ │ ├── SFMT-params607.h │ │ │ │ │ │ ├── SFMT-params86243.h │ │ │ │ │ │ ├── SFMT-sse2.h │ │ │ │ │ │ ├── SFMT.h │ │ │ │ │ │ ├── btalloc.h │ │ │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ │ │ ├── math.h │ │ │ │ │ │ ├── mq.h │ │ │ │ │ │ ├── mtx.h │ │ │ │ │ │ ├── test.h │ │ │ │ │ │ ├── thd.h │ │ │ │ │ │ └── timer.h │ │ │ │ │ ├── integration/ │ │ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ │ │ ├── aligned_alloc.c │ │ │ │ │ │ ├── allocated.c │ │ │ │ │ │ ├── chunk.c │ │ │ │ │ │ ├── mallocx.c │ │ │ │ │ │ ├── overflow.c │ │ │ │ │ │ ├── posix_memalign.c │ │ │ │ │ │ ├── rallocx.c │ │ │ │ │ │ ├── sdallocx.c │ │ │ │ │ │ ├── thread_arena.c │ │ │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ │ │ └── xallocx.c │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ │ ├── btalloc.c │ │ │ │ │ │ ├── btalloc_0.c │ │ │ │ │ │ ├── btalloc_1.c │ │ │ │ │ │ ├── math.c │ │ │ │ │ │ ├── mq.c │ │ │ │ │ │ ├── mtx.c │ │ │ │ │ │ ├── test.c │ │ │ │ │ │ ├── thd.c │ │ │ │ │ │ └── timer.c │ │ │ │ │ ├── stress/ │ │ │ │ │ │ └── microbench.c │ │ │ │ │ ├── test.sh.in │ │ │ │ │ └── unit/ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ ├── atomic.c │ │ │ │ │ ├── bitmap.c │ │ │ │ │ ├── ckh.c │ │ │ │ │ ├── hash.c │ │ │ │ │ ├── junk.c │ │ │ │ │ ├── junk_alloc.c │ │ │ │ │ ├── junk_free.c │ │ │ │ │ ├── lg_chunk.c │ │ │ │ │ ├── mallctl.c │ │ │ │ │ ├── math.c │ │ │ │ │ ├── mq.c │ │ │ │ │ ├── mtx.c │ │ │ │ │ ├── prof_accum.c │ │ │ │ │ ├── prof_active.c │ │ │ │ │ ├── prof_gdump.c │ │ │ │ │ ├── prof_idump.c │ │ │ │ │ ├── prof_reset.c │ │ │ │ │ ├── prof_thread_name.c │ │ │ │ │ ├── ql.c │ │ │ │ │ ├── qr.c │ │ │ │ │ ├── quarantine.c │ │ │ │ │ ├── rb.c │ │ │ │ │ ├── rtree.c │ │ │ │ │ ├── size_classes.c │ │ │ │ │ ├── stats.c │ │ │ │ │ ├── tsd.c │ │ │ │ │ ├── util.c │ │ │ │ │ └── zero.c │ │ │ │ ├── linenoise/ │ │ │ │ │ ├── .gitignore │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README.markdown │ │ │ │ │ ├── example.c │ │ │ │ │ ├── linenoise.c │ │ │ │ │ └── linenoise.h │ │ │ │ ├── lua/ │ │ │ │ │ ├── COPYRIGHT │ │ │ │ │ ├── HISTORY │ │ │ │ │ ├── INSTALL │ │ │ │ │ ├── Makefile │ │ │ │ │ ├── README │ │ │ │ │ ├── doc/ │ │ │ │ │ │ ├── contents.html │ │ │ │ │ │ ├── lua.1 │ │ │ │ │ │ ├── lua.css │ │ │ │ │ │ ├── lua.html │ │ │ │ │ │ ├── luac.1 │ │ │ │ │ │ ├── luac.html │ │ │ │ │ │ ├── manual.css │ │ │ │ │ │ ├── manual.html │ │ │ │ │ │ └── readme.html │ │ │ │ │ ├── etc/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── README │ │ │ │ │ │ ├── all.c │ │ │ │ │ │ ├── lua.hpp │ │ │ │ │ │ ├── lua.pc │ │ │ │ │ │ ├── luavs.bat │ │ │ │ │ │ ├── min.c │ │ │ │ │ │ ├── noparser.c │ │ │ │ │ │ └── strict.lua │ │ │ │ │ ├── src/ │ │ │ │ │ │ ├── Makefile │ │ │ │ │ │ ├── fpconv.c │ │ │ │ │ │ ├── fpconv.h │ │ │ │ │ │ ├── lapi.c │ │ │ │ │ │ ├── lapi.h │ │ │ │ │ │ ├── lauxlib.c │ │ │ │ │ │ ├── lauxlib.h │ │ │ │ │ │ ├── lbaselib.c │ │ │ │ │ │ ├── lcode.c │ │ │ │ │ │ ├── lcode.h │ │ │ │ │ │ ├── ldblib.c │ │ │ │ │ │ ├── ldebug.c │ │ │ │ │ │ ├── ldebug.h │ │ │ │ │ │ ├── ldo.c │ │ │ │ │ │ ├── ldo.h │ │ │ │ │ │ ├── ldump.c │ │ │ │ │ │ ├── lfunc.c │ │ │ │ │ │ ├── lfunc.h │ │ │ │ │ │ ├── lgc.c │ │ │ │ │ │ ├── lgc.h │ │ │ │ │ │ ├── linit.c │ │ │ │ │ │ ├── liolib.c │ │ │ │ │ │ ├── llex.c │ │ │ │ │ │ ├── llex.h │ │ │ │ │ │ ├── llimits.h │ │ │ │ │ │ ├── lmathlib.c │ │ │ │ │ │ ├── lmem.c │ │ │ │ │ │ ├── lmem.h │ │ │ │ │ │ ├── loadlib.c │ │ │ │ │ │ ├── lobject.c │ │ │ │ │ │ ├── lobject.h │ │ │ │ │ │ ├── lopcodes.c │ │ │ │ │ │ ├── lopcodes.h │ │ │ │ │ │ ├── loslib.c │ │ │ │ │ │ ├── lparser.c │ │ │ │ │ │ ├── lparser.h │ │ │ │ │ │ ├── lstate.c │ │ │ │ │ │ ├── lstate.h │ │ │ │ │ │ ├── lstring.c │ │ │ │ │ │ ├── lstring.h │ │ │ │ │ │ ├── lstrlib.c │ │ │ │ │ │ ├── ltable.c │ │ │ │ │ │ ├── ltable.h │ │ │ │ │ │ ├── ltablib.c │ │ │ │ │ │ ├── ltm.c │ │ │ │ │ │ ├── ltm.h │ │ │ │ │ │ ├── lua.c │ │ │ │ │ │ ├── lua.h │ │ │ │ │ │ ├── lua_bit.c │ │ │ │ │ │ ├── lua_cjson.c │ │ │ │ │ │ ├── lua_cmsgpack.c │ │ │ │ │ │ ├── lua_struct.c │ │ │ │ │ │ ├── luac.c │ │ │ │ │ │ ├── luaconf.h │ │ │ │ │ │ ├── lualib.h │ │ │ │ │ │ ├── lundump.c │ │ │ │ │ │ ├── lundump.h │ │ │ │ │ │ ├── lvm.c │ │ │ │ │ │ ├── lvm.h │ │ │ │ │ │ ├── lzio.c │ │ │ │ │ │ ├── lzio.h │ │ │ │ │ │ ├── print.c │ │ │ │ │ │ ├── strbuf.c │ │ │ │ │ │ └── strbuf.h │ │ │ │ │ └── test/ │ │ │ │ │ ├── README │ │ │ │ │ ├── bisect.lua │ │ │ │ │ ├── cf.lua │ │ │ │ │ ├── echo.lua │ │ │ │ │ ├── env.lua │ │ │ │ │ ├── factorial.lua │ │ │ │ │ ├── fib.lua │ │ │ │ │ ├── fibfor.lua │ │ │ │ │ ├── globals.lua │ │ │ │ │ ├── hello.lua │ │ │ │ │ ├── life.lua │ │ │ │ │ ├── luac.lua │ │ │ │ │ ├── printf.lua │ │ │ │ │ ├── readonly.lua │ │ │ │ │ ├── sieve.lua │ │ │ │ │ ├── sort.lua │ │ │ │ │ ├── table.lua │ │ │ │ │ ├── trace-calls.lua │ │ │ │ │ ├── trace-globals.lua │ │ │ │ │ └── xd.lua │ │ │ │ └── update-jemalloc.sh │ │ │ ├── patch/ │ │ │ │ ├── Makefile │ │ │ │ ├── codis/ │ │ │ │ │ ├── 0000-redis.patch │ │ │ │ │ ├── 0001-slotsscan.patch │ │ │ │ │ ├── 0002-rehash.patch │ │ │ │ │ ├── 0003-slots_async1.patch │ │ │ │ │ ├── 0004-slots_async2.patch │ │ │ │ │ ├── 0005-slots_async3_lazyfree.patch │ │ │ │ │ ├── 0006-slots_async4_bugfix_1184.patch │ │ │ │ │ ├── 0007-slots_async5_cleanup.patch │ │ │ │ │ └── 0008-slots_async6_select.patch │ │ │ │ ├── redis/ │ │ │ │ │ ├── 0001-Don-t-leak-file-descriptor-on-syncWithMaster.patch │ │ │ │ │ ├── 0002-fix-2883-2857-pipe-fds-leak-when-fork-failed-on-bg-a.patch │ │ │ │ │ ├── 0003-Implement-getKeys-procedure-for-georadius-and-georad.patch │ │ │ │ │ ├── 0004-Test-fix-hopefully-false-PSYNC-failure-like-in-issue.patch │ │ │ │ │ ├── 0005-update-block-free-after-some-diff-data-are-written-t.patch │ │ │ │ │ ├── 0006-Fix-3848-by-closing-the-descriptor-on-error.patch │ │ │ │ │ ├── 0007-Set-lua-time-limit-default-value-at-safe-place.patch │ │ │ │ │ ├── 0008-Fix-zmalloc_get_memory_size-ifdefs-to-actually-use-t.patch │ │ │ │ │ ├── 0009-Fix-preprocessor-if-else-chain-broken-in-order-to-fi.patch │ │ │ │ │ ├── 0010-redis-cli-bigkeys-show-error-when-TYPE-fails.patch │ │ │ │ │ ├── 0011-Redis-3.2.9.patch │ │ │ │ │ ├── 0012-fix-Update-create-cluster-README.patch │ │ │ │ │ ├── 0013-cli-Only-print-elapsed-time-on-OUTPUT_STANDARD.patch │ │ │ │ │ ├── 0014-Fixed-comments-of-slowlog-duration.patch │ │ │ │ │ ├── 0015-fix-server.stat_net_output_bytes-calc-bug.patch │ │ │ │ │ ├── 0016-Fix-set-with-ex-px-option-when-propagated-to-aof.patch │ │ │ │ │ ├── 0017-redis-benchmark-add-t-hset-target.patch │ │ │ │ │ ├── 0018-Optimize-set-command-with-ex-px-when-updating-aof.patch │ │ │ │ │ └── 0019-Aesthetic-changes-to-4068-PR-to-conform-to-Redis-cod.patch │ │ │ │ └── run.sh │ │ │ ├── redis.conf │ │ │ ├── runtest │ │ │ ├── runtest-cluster │ │ │ ├── runtest-sentinel │ │ │ ├── sentinel.conf │ │ │ ├── src/ │ │ │ │ ├── .gitignore │ │ │ │ ├── Makefile │ │ │ │ ├── Makefile.dep │ │ │ │ ├── adlist.c │ │ │ │ ├── adlist.h │ │ │ │ ├── ae.c │ │ │ │ ├── ae.h │ │ │ │ ├── ae_epoll.c │ │ │ │ ├── ae_evport.c │ │ │ │ ├── ae_kqueue.c │ │ │ │ ├── ae_select.c │ │ │ │ ├── anet.c │ │ │ │ ├── anet.h │ │ │ │ ├── aof.c │ │ │ │ ├── asciilogo.h │ │ │ │ ├── bio.c │ │ │ │ ├── bio.h │ │ │ │ ├── bitops.c │ │ │ │ ├── blocked.c │ │ │ │ ├── cluster.c │ │ │ │ ├── cluster.h │ │ │ │ ├── config.c │ │ │ │ ├── config.h │ │ │ │ ├── crc16.c │ │ │ │ ├── crc32.c │ │ │ │ ├── crc64.c │ │ │ │ ├── crc64.h │ │ │ │ ├── db.c │ │ │ │ ├── debug.c │ │ │ │ ├── debugmacro.h │ │ │ │ ├── dict.c │ │ │ │ ├── dict.h │ │ │ │ ├── endianconv.c │ │ │ │ ├── endianconv.h │ │ │ │ ├── fmacros.h │ │ │ │ ├── geo.c │ │ │ │ ├── geo.h │ │ │ │ ├── help.h │ │ │ │ ├── hyperloglog.c │ │ │ │ ├── intset.c │ │ │ │ ├── intset.h │ │ │ │ ├── latency.c │ │ │ │ ├── latency.h │ │ │ │ ├── lzf.h │ │ │ │ ├── lzfP.h │ │ │ │ ├── lzf_c.c │ │ │ │ ├── lzf_d.c │ │ │ │ ├── memtest.c │ │ │ │ ├── mkreleasehdr.sh │ │ │ │ ├── multi.c │ │ │ │ ├── networking.c │ │ │ │ ├── notify.c │ │ │ │ ├── object.c │ │ │ │ ├── pqsort.c │ │ │ │ ├── pqsort.h │ │ │ │ ├── pubsub.c │ │ │ │ ├── quicklist.c │ │ │ │ ├── quicklist.h │ │ │ │ ├── rand.c │ │ │ │ ├── rand.h │ │ │ │ ├── rdb.c │ │ │ │ ├── rdb.h │ │ │ │ ├── redis-benchmark.c │ │ │ │ ├── redis-check-aof.c │ │ │ │ ├── redis-check-rdb.c │ │ │ │ ├── redis-cli.c │ │ │ │ ├── redis-trib.rb │ │ │ │ ├── redisassert.h │ │ │ │ ├── release.c │ │ │ │ ├── replication.c │ │ │ │ ├── rio.c │ │ │ │ ├── rio.h │ │ │ │ ├── scripting.c │ │ │ │ ├── sds.c │ │ │ │ ├── sds.h │ │ │ │ ├── sdsalloc.h │ │ │ │ ├── sentinel.c │ │ │ │ ├── server.c │ │ │ │ ├── server.h │ │ │ │ ├── setproctitle.c │ │ │ │ ├── sha1.c │ │ │ │ ├── sha1.h │ │ │ │ ├── slots.c │ │ │ │ ├── slots_async.c │ │ │ │ ├── slowlog.c │ │ │ │ ├── slowlog.h │ │ │ │ ├── solarisfixes.h │ │ │ │ ├── sort.c │ │ │ │ ├── sparkline.c │ │ │ │ ├── sparkline.h │ │ │ │ ├── syncio.c │ │ │ │ ├── t_hash.c │ │ │ │ ├── t_list.c │ │ │ │ ├── t_set.c │ │ │ │ ├── t_string.c │ │ │ │ ├── t_zset.c │ │ │ │ ├── testhelp.h │ │ │ │ ├── util.c │ │ │ │ ├── util.h │ │ │ │ ├── valgrind.sup │ │ │ │ ├── version.h │ │ │ │ ├── ziplist.c │ │ │ │ ├── ziplist.h │ │ │ │ ├── zipmap.c │ │ │ │ ├── zipmap.h │ │ │ │ ├── zmalloc.c │ │ │ │ └── zmalloc.h │ │ │ ├── tests/ │ │ │ │ ├── assets/ │ │ │ │ │ └── default.conf │ │ │ │ ├── cluster/ │ │ │ │ │ ├── cluster.tcl │ │ │ │ │ ├── run.tcl │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── 00-base.tcl │ │ │ │ │ │ ├── 01-faildet.tcl │ │ │ │ │ │ ├── 02-failover.tcl │ │ │ │ │ │ ├── 03-failover-loop.tcl │ │ │ │ │ │ ├── 04-resharding.tcl │ │ │ │ │ │ ├── 05-slave-selection.tcl │ │ │ │ │ │ ├── 06-slave-stop-cond.tcl │ │ │ │ │ │ ├── 07-replica-migration.tcl │ │ │ │ │ │ ├── 08-update-msg.tcl │ │ │ │ │ │ ├── 09-pubsub.tcl │ │ │ │ │ │ ├── 10-manual-failover.tcl │ │ │ │ │ │ ├── 11-manual-takeover.tcl │ │ │ │ │ │ ├── 12-replica-migration-2.tcl │ │ │ │ │ │ ├── helpers/ │ │ │ │ │ │ │ └── onlydots.tcl │ │ │ │ │ │ └── includes/ │ │ │ │ │ │ └── init-tests.tcl │ │ │ │ │ └── tmp/ │ │ │ │ │ └── .gitignore │ │ │ │ ├── helpers/ │ │ │ │ │ ├── bg_complex_data.tcl │ │ │ │ │ └── gen_write_load.tcl │ │ │ │ ├── instances.tcl │ │ │ │ ├── integration/ │ │ │ │ │ ├── aof-race.tcl │ │ │ │ │ ├── aof.tcl │ │ │ │ │ ├── convert-zipmap-hash-on-load.tcl │ │ │ │ │ ├── logging.tcl │ │ │ │ │ ├── rdb.tcl │ │ │ │ │ ├── redis-cli.tcl │ │ │ │ │ ├── replication-2.tcl │ │ │ │ │ ├── replication-3.tcl │ │ │ │ │ ├── replication-4.tcl │ │ │ │ │ ├── replication-psync.tcl │ │ │ │ │ └── replication.tcl │ │ │ │ ├── sentinel/ │ │ │ │ │ ├── run.tcl │ │ │ │ │ ├── tests/ │ │ │ │ │ │ ├── 00-base.tcl │ │ │ │ │ │ ├── 01-conf-update.tcl │ │ │ │ │ │ ├── 02-slaves-reconf.tcl │ │ │ │ │ │ ├── 03-runtime-reconf.tcl │ │ │ │ │ │ ├── 04-slave-selection.tcl │ │ │ │ │ │ ├── 05-manual.tcl │ │ │ │ │ │ ├── 06-ckquorum.tcl │ │ │ │ │ │ ├── 07-down-conditions.tcl │ │ │ │ │ │ └── includes/ │ │ │ │ │ │ └── init-tests.tcl │ │ │ │ │ └── tmp/ │ │ │ │ │ └── .gitignore │ │ │ │ ├── support/ │ │ │ │ │ ├── cluster.tcl │ │ │ │ │ ├── redis.tcl │ │ │ │ │ ├── server.tcl │ │ │ │ │ ├── test.tcl │ │ │ │ │ ├── tmpfile.tcl │ │ │ │ │ └── util.tcl │ │ │ │ ├── test_helper.tcl │ │ │ │ └── unit/ │ │ │ │ ├── aofrw.tcl │ │ │ │ ├── auth.tcl │ │ │ │ ├── bitfield.tcl │ │ │ │ ├── bitops.tcl │ │ │ │ ├── dump.tcl │ │ │ │ ├── expire.tcl │ │ │ │ ├── geo.tcl │ │ │ │ ├── hyperloglog.tcl │ │ │ │ ├── introspection-2.tcl │ │ │ │ ├── introspection.tcl │ │ │ │ ├── keyspace.tcl │ │ │ │ ├── latency-monitor.tcl │ │ │ │ ├── limits.tcl │ │ │ │ ├── maxmemory.tcl │ │ │ │ ├── memefficiency.tcl │ │ │ │ ├── multi.tcl │ │ │ │ ├── obuf-limits.tcl │ │ │ │ ├── other.tcl │ │ │ │ ├── printver.tcl │ │ │ │ ├── protocol.tcl │ │ │ │ ├── pubsub.tcl │ │ │ │ ├── quit.tcl │ │ │ │ ├── scan.tcl │ │ │ │ ├── scripting.tcl │ │ │ │ ├── slowlog.tcl │ │ │ │ ├── sort.tcl │ │ │ │ └── type/ │ │ │ │ ├── hash.tcl │ │ │ │ ├── incr.tcl │ │ │ │ ├── list-2.tcl │ │ │ │ ├── list-3.tcl │ │ │ │ ├── list-common.tcl │ │ │ │ ├── list.tcl │ │ │ │ ├── set.tcl │ │ │ │ ├── string.tcl │ │ │ │ └── zset.tcl │ │ │ └── utils/ │ │ │ ├── build-static-symbols.tcl │ │ │ ├── cluster_fail_time.tcl │ │ │ ├── corrupt_rdb.c │ │ │ ├── create-cluster/ │ │ │ │ ├── .gitignore │ │ │ │ ├── README │ │ │ │ └── create-cluster │ │ │ ├── generate-command-help.rb │ │ │ ├── hashtable/ │ │ │ │ ├── README │ │ │ │ └── rehashing.c │ │ │ ├── hyperloglog/ │ │ │ │ ├── .gitignore │ │ │ │ ├── hll-err.rb │ │ │ │ └── hll-gnuplot-graph.rb │ │ │ ├── install_server.sh │ │ │ ├── lru/ │ │ │ │ ├── README │ │ │ │ └── test-lru.rb │ │ │ ├── redis-copy.rb │ │ │ ├── redis-sha1.rb │ │ │ ├── redis_init_script │ │ │ ├── redis_init_script.tpl │ │ │ ├── releasetools/ │ │ │ │ ├── 01_create_tarball.sh │ │ │ │ ├── 02_upload_tarball.sh │ │ │ │ ├── 03_test_release.sh │ │ │ │ └── 04_release_hash.sh │ │ │ ├── speed-regression.tcl │ │ │ └── whatisdoing.sh │ │ ├── redis-test/ │ │ │ ├── .gitignore │ │ │ ├── basic_hash.go │ │ │ ├── basic_incr.go │ │ │ ├── basic_mgrt.go │ │ │ ├── bench/ │ │ │ │ ├── Makefile │ │ │ │ └── benchmark.go │ │ │ ├── conf/ │ │ │ │ ├── 6379.conf │ │ │ │ ├── 6380.conf │ │ │ │ ├── 6479.conf │ │ │ │ └── 6480.conf │ │ │ ├── extra_del.go │ │ │ ├── extra_incr.go │ │ │ ├── extra_memleak.go │ │ │ ├── extra_mget.go │ │ │ ├── run_test.sh │ │ │ ├── tcl/ │ │ │ │ ├── runtest │ │ │ │ └── tests/ │ │ │ │ ├── assets/ │ │ │ │ │ └── default.conf │ │ │ │ ├── helpers/ │ │ │ │ │ ├── bg_complex_data.tcl │ │ │ │ │ └── gen_write_load.tcl │ │ │ │ ├── instances.tcl │ │ │ │ ├── support/ │ │ │ │ │ ├── redis.tcl │ │ │ │ │ ├── server.tcl │ │ │ │ │ ├── test.tcl │ │ │ │ │ ├── tmpfile.tcl │ │ │ │ │ └── util.tcl │ │ │ │ ├── test_helper.tcl │ │ │ │ └── unit/ │ │ │ │ ├── aofrw.tcl │ │ │ │ ├── basic.tcl │ │ │ │ ├── bitops.tcl │ │ │ │ ├── dump.tcl │ │ │ │ ├── expire.tcl │ │ │ │ ├── hyperloglog.tcl │ │ │ │ ├── latency-monitor.tcl │ │ │ │ ├── memefficiency.tcl │ │ │ │ ├── other.tcl │ │ │ │ ├── protocol.tcl │ │ │ │ ├── scripting.tcl │ │ │ │ └── type/ │ │ │ │ ├── hash.tcl │ │ │ │ ├── list-2.tcl │ │ │ │ ├── list-3.tcl │ │ │ │ ├── list-common.tcl │ │ │ │ ├── list.tcl │ │ │ │ ├── set.tcl │ │ │ │ └── zset.tcl │ │ │ ├── test_hset.go │ │ │ ├── test_incr1.go │ │ │ ├── test_incr2.go │ │ │ ├── test_list.go │ │ │ ├── test_mget.go │ │ │ ├── test_mset.go │ │ │ ├── test_pttl.go │ │ │ ├── test_string.go │ │ │ └── utils.go │ │ └── scala-client/ │ │ ├── project/ │ │ │ ├── Build.scala │ │ │ ├── build.properties │ │ │ └── plugins.sbt │ │ └── src/ │ │ ├── main/ │ │ │ └── scala/ │ │ │ ├── codis/ │ │ │ │ ├── CodisClient.scala │ │ │ │ └── CodisLogSource.scala │ │ │ └── redis/ │ │ │ └── DynamicRedisClientPool.scala │ │ └── test/ │ │ └── scala/ │ │ ├── codis/ │ │ │ └── CodisClientSpec.scala │ │ └── redis/ │ │ └── DynamicRedisClientPoolSpec.scala │ └── redis-3.2.11/ │ ├── .gitignore │ ├── 00-RELEASENOTES │ ├── BUGS │ ├── CONTRIBUTING │ ├── COPYING │ ├── INSTALL │ ├── MANIFESTO │ ├── Makefile │ ├── README.md │ ├── deps/ │ │ ├── Makefile │ │ ├── README.md │ │ ├── geohash-int/ │ │ │ ├── Makefile │ │ │ ├── geohash.c │ │ │ ├── geohash.h │ │ │ ├── geohash_helper.c │ │ │ └── geohash_helper.h │ │ ├── hiredis/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── CHANGELOG.md │ │ │ ├── COPYING │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── adapters/ │ │ │ │ ├── ae.h │ │ │ │ ├── libev.h │ │ │ │ ├── libevent.h │ │ │ │ └── libuv.h │ │ │ ├── async.c │ │ │ ├── async.h │ │ │ ├── dict.c │ │ │ ├── dict.h │ │ │ ├── examples/ │ │ │ │ ├── example-ae.c │ │ │ │ ├── example-libev.c │ │ │ │ ├── example-libevent.c │ │ │ │ ├── example-libuv.c │ │ │ │ └── example.c │ │ │ ├── fmacros.h │ │ │ ├── hiredis.c │ │ │ ├── hiredis.h │ │ │ ├── net.c │ │ │ ├── net.h │ │ │ ├── sds.c │ │ │ ├── sds.h │ │ │ ├── sdsalloc.h │ │ │ ├── test.c │ │ │ └── zmalloc.h │ │ ├── jemalloc/ │ │ │ ├── .autom4te.cfg │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── COPYING │ │ │ ├── ChangeLog │ │ │ ├── INSTALL │ │ │ ├── Makefile.in │ │ │ ├── README │ │ │ ├── VERSION │ │ │ ├── autogen.sh │ │ │ ├── bin/ │ │ │ │ ├── jemalloc-config.in │ │ │ │ ├── jemalloc.sh.in │ │ │ │ └── jeprof.in │ │ │ ├── config.guess │ │ │ ├── config.stamp.in │ │ │ ├── config.sub │ │ │ ├── configure │ │ │ ├── configure.ac │ │ │ ├── coverage.sh │ │ │ ├── doc/ │ │ │ │ ├── html.xsl.in │ │ │ │ ├── jemalloc.xml.in │ │ │ │ ├── manpages.xsl.in │ │ │ │ └── stylesheet.xsl │ │ │ ├── include/ │ │ │ │ ├── jemalloc/ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ ├── arena.h │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ ├── base.h │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ ├── chunk.h │ │ │ │ │ │ ├── chunk_dss.h │ │ │ │ │ │ ├── chunk_mmap.h │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ ├── extent.h │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ ├── huge.h │ │ │ │ │ │ ├── jemalloc_internal.h.in │ │ │ │ │ │ ├── jemalloc_internal_decls.h │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ ├── mb.h │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ ├── pages.h │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ ├── private_symbols.txt │ │ │ │ │ │ ├── private_unnamespace.sh │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ ├── prof.h │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ ├── quarantine.h │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ ├── tcache.h │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ └── valgrind.h │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ ├── jemalloc_rename.sh │ │ │ │ │ └── jemalloc_typedefs.h.in │ │ │ │ └── msvc_compat/ │ │ │ │ ├── C99/ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ └── stdint.h │ │ │ │ ├── strings.h │ │ │ │ └── windows_extra.h │ │ │ ├── install-sh │ │ │ ├── jemalloc.pc.in │ │ │ ├── src/ │ │ │ │ ├── arena.c │ │ │ │ ├── atomic.c │ │ │ │ ├── base.c │ │ │ │ ├── bitmap.c │ │ │ │ ├── chunk.c │ │ │ │ ├── chunk_dss.c │ │ │ │ ├── chunk_mmap.c │ │ │ │ ├── ckh.c │ │ │ │ ├── ctl.c │ │ │ │ ├── extent.c │ │ │ │ ├── hash.c │ │ │ │ ├── huge.c │ │ │ │ ├── jemalloc.c │ │ │ │ ├── mb.c │ │ │ │ ├── mutex.c │ │ │ │ ├── pages.c │ │ │ │ ├── prof.c │ │ │ │ ├── quarantine.c │ │ │ │ ├── rtree.c │ │ │ │ ├── stats.c │ │ │ │ ├── tcache.c │ │ │ │ ├── tsd.c │ │ │ │ ├── util.c │ │ │ │ ├── valgrind.c │ │ │ │ └── zone.c │ │ │ └── test/ │ │ │ ├── include/ │ │ │ │ └── test/ │ │ │ │ ├── SFMT-alti.h │ │ │ │ ├── SFMT-params.h │ │ │ │ ├── SFMT-params11213.h │ │ │ │ ├── SFMT-params1279.h │ │ │ │ ├── SFMT-params132049.h │ │ │ │ ├── SFMT-params19937.h │ │ │ │ ├── SFMT-params216091.h │ │ │ │ ├── SFMT-params2281.h │ │ │ │ ├── SFMT-params4253.h │ │ │ │ ├── SFMT-params44497.h │ │ │ │ ├── SFMT-params607.h │ │ │ │ ├── SFMT-params86243.h │ │ │ │ ├── SFMT-sse2.h │ │ │ │ ├── SFMT.h │ │ │ │ ├── btalloc.h │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ ├── math.h │ │ │ │ ├── mq.h │ │ │ │ ├── mtx.h │ │ │ │ ├── test.h │ │ │ │ ├── thd.h │ │ │ │ └── timer.h │ │ │ ├── integration/ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ ├── aligned_alloc.c │ │ │ │ ├── allocated.c │ │ │ │ ├── chunk.c │ │ │ │ ├── mallocx.c │ │ │ │ ├── overflow.c │ │ │ │ ├── posix_memalign.c │ │ │ │ ├── rallocx.c │ │ │ │ ├── sdallocx.c │ │ │ │ ├── thread_arena.c │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ └── xallocx.c │ │ │ ├── src/ │ │ │ │ ├── SFMT.c │ │ │ │ ├── btalloc.c │ │ │ │ ├── btalloc_0.c │ │ │ │ ├── btalloc_1.c │ │ │ │ ├── math.c │ │ │ │ ├── mq.c │ │ │ │ ├── mtx.c │ │ │ │ ├── test.c │ │ │ │ ├── thd.c │ │ │ │ └── timer.c │ │ │ ├── stress/ │ │ │ │ └── microbench.c │ │ │ ├── test.sh.in │ │ │ └── unit/ │ │ │ ├── SFMT.c │ │ │ ├── atomic.c │ │ │ ├── bitmap.c │ │ │ ├── ckh.c │ │ │ ├── hash.c │ │ │ ├── junk.c │ │ │ ├── junk_alloc.c │ │ │ ├── junk_free.c │ │ │ ├── lg_chunk.c │ │ │ ├── mallctl.c │ │ │ ├── math.c │ │ │ ├── mq.c │ │ │ ├── mtx.c │ │ │ ├── prof_accum.c │ │ │ ├── prof_active.c │ │ │ ├── prof_gdump.c │ │ │ ├── prof_idump.c │ │ │ ├── prof_reset.c │ │ │ ├── prof_thread_name.c │ │ │ ├── ql.c │ │ │ ├── qr.c │ │ │ ├── quarantine.c │ │ │ ├── rb.c │ │ │ ├── rtree.c │ │ │ ├── size_classes.c │ │ │ ├── stats.c │ │ │ ├── tsd.c │ │ │ ├── util.c │ │ │ └── zero.c │ │ ├── linenoise/ │ │ │ ├── .gitignore │ │ │ ├── Makefile │ │ │ ├── README.markdown │ │ │ ├── example.c │ │ │ ├── linenoise.c │ │ │ └── linenoise.h │ │ ├── lua/ │ │ │ ├── COPYRIGHT │ │ │ ├── HISTORY │ │ │ ├── INSTALL │ │ │ ├── Makefile │ │ │ ├── README │ │ │ ├── doc/ │ │ │ │ ├── contents.html │ │ │ │ ├── lua.1 │ │ │ │ ├── lua.css │ │ │ │ ├── lua.html │ │ │ │ ├── luac.1 │ │ │ │ ├── luac.html │ │ │ │ ├── manual.css │ │ │ │ ├── manual.html │ │ │ │ └── readme.html │ │ │ ├── etc/ │ │ │ │ ├── Makefile │ │ │ │ ├── README │ │ │ │ ├── all.c │ │ │ │ ├── lua.hpp │ │ │ │ ├── lua.pc │ │ │ │ ├── luavs.bat │ │ │ │ ├── min.c │ │ │ │ ├── noparser.c │ │ │ │ └── strict.lua │ │ │ ├── src/ │ │ │ │ ├── Makefile │ │ │ │ ├── fpconv.c │ │ │ │ ├── fpconv.h │ │ │ │ ├── lapi.c │ │ │ │ ├── lapi.h │ │ │ │ ├── lauxlib.c │ │ │ │ ├── lauxlib.h │ │ │ │ ├── lbaselib.c │ │ │ │ ├── lcode.c │ │ │ │ ├── lcode.h │ │ │ │ ├── ldblib.c │ │ │ │ ├── ldebug.c │ │ │ │ ├── ldebug.h │ │ │ │ ├── ldo.c │ │ │ │ ├── ldo.h │ │ │ │ ├── ldump.c │ │ │ │ ├── lfunc.c │ │ │ │ ├── lfunc.h │ │ │ │ ├── lgc.c │ │ │ │ ├── lgc.h │ │ │ │ ├── linit.c │ │ │ │ ├── liolib.c │ │ │ │ ├── llex.c │ │ │ │ ├── llex.h │ │ │ │ ├── llimits.h │ │ │ │ ├── lmathlib.c │ │ │ │ ├── lmem.c │ │ │ │ ├── lmem.h │ │ │ │ ├── loadlib.c │ │ │ │ ├── lobject.c │ │ │ │ ├── lobject.h │ │ │ │ ├── lopcodes.c │ │ │ │ ├── lopcodes.h │ │ │ │ ├── loslib.c │ │ │ │ ├── lparser.c │ │ │ │ ├── lparser.h │ │ │ │ ├── lstate.c │ │ │ │ ├── lstate.h │ │ │ │ ├── lstring.c │ │ │ │ ├── lstring.h │ │ │ │ ├── lstrlib.c │ │ │ │ ├── ltable.c │ │ │ │ ├── ltable.h │ │ │ │ ├── ltablib.c │ │ │ │ ├── ltm.c │ │ │ │ ├── ltm.h │ │ │ │ ├── lua.c │ │ │ │ ├── lua.h │ │ │ │ ├── lua_bit.c │ │ │ │ ├── lua_cjson.c │ │ │ │ ├── lua_cmsgpack.c │ │ │ │ ├── lua_struct.c │ │ │ │ ├── luac.c │ │ │ │ ├── luaconf.h │ │ │ │ ├── lualib.h │ │ │ │ ├── lundump.c │ │ │ │ ├── lundump.h │ │ │ │ ├── lvm.c │ │ │ │ ├── lvm.h │ │ │ │ ├── lzio.c │ │ │ │ ├── lzio.h │ │ │ │ ├── print.c │ │ │ │ ├── strbuf.c │ │ │ │ └── strbuf.h │ │ │ └── test/ │ │ │ ├── README │ │ │ ├── bisect.lua │ │ │ ├── cf.lua │ │ │ ├── echo.lua │ │ │ ├── env.lua │ │ │ ├── factorial.lua │ │ │ ├── fib.lua │ │ │ ├── fibfor.lua │ │ │ ├── globals.lua │ │ │ ├── hello.lua │ │ │ ├── life.lua │ │ │ ├── luac.lua │ │ │ ├── printf.lua │ │ │ ├── readonly.lua │ │ │ ├── sieve.lua │ │ │ ├── sort.lua │ │ │ ├── table.lua │ │ │ ├── trace-calls.lua │ │ │ ├── trace-globals.lua │ │ │ └── xd.lua │ │ └── update-jemalloc.sh │ ├── patch/ │ │ ├── Makefile │ │ ├── codis/ │ │ │ ├── 0000-redis.patch │ │ │ ├── 0001-slotsscan.patch │ │ │ ├── 0002-rehash.patch │ │ │ ├── 0003-slots_async1.patch │ │ │ ├── 0004-slots_async2.patch │ │ │ ├── 0005-slots_async3_lazyfree.patch │ │ │ ├── 0006-slots_async4_bugfix_1184.patch │ │ │ ├── 0007-slots_async5_cleanup.patch │ │ │ └── 0008-slots_async6_select.patch │ │ ├── redis/ │ │ │ ├── 0001-Don-t-leak-file-descriptor-on-syncWithMaster.patch │ │ │ ├── 0002-fix-2883-2857-pipe-fds-leak-when-fork-failed-on-bg-a.patch │ │ │ ├── 0003-Implement-getKeys-procedure-for-georadius-and-georad.patch │ │ │ ├── 0004-Test-fix-hopefully-false-PSYNC-failure-like-in-issue.patch │ │ │ ├── 0005-update-block-free-after-some-diff-data-are-written-t.patch │ │ │ ├── 0006-Fix-3848-by-closing-the-descriptor-on-error.patch │ │ │ ├── 0007-Set-lua-time-limit-default-value-at-safe-place.patch │ │ │ ├── 0008-Fix-zmalloc_get_memory_size-ifdefs-to-actually-use-t.patch │ │ │ ├── 0009-Fix-preprocessor-if-else-chain-broken-in-order-to-fi.patch │ │ │ ├── 0010-redis-cli-bigkeys-show-error-when-TYPE-fails.patch │ │ │ ├── 0011-Redis-3.2.9.patch │ │ │ ├── 0012-fix-Update-create-cluster-README.patch │ │ │ ├── 0013-cli-Only-print-elapsed-time-on-OUTPUT_STANDARD.patch │ │ │ ├── 0014-Fixed-comments-of-slowlog-duration.patch │ │ │ ├── 0015-fix-server.stat_net_output_bytes-calc-bug.patch │ │ │ ├── 0016-Fix-set-with-ex-px-option-when-propagated-to-aof.patch │ │ │ ├── 0017-redis-benchmark-add-t-hset-target.patch │ │ │ ├── 0018-Optimize-set-command-with-ex-px-when-updating-aof.patch │ │ │ ├── 0019-Aesthetic-changes-to-4068-PR-to-conform-to-Redis-cod.patch │ │ │ ├── 0020-Collect-fork-timing-info-only-if-fork-succeeded.patch │ │ │ ├── 0021-Prevent-expirations-and-evictions-while-paused.patch │ │ │ ├── 0022-Removed-duplicate-sys-socket.h-include.patch │ │ │ ├── 0023-Fix-PERSIST-expired-key-resuscitation-issue-4048.patch │ │ │ ├── 0024-Fix-brpop-command-table-entry-and-redirect-blocked-c.patch │ │ │ ├── 0025-Fix-following-issues-in-blocking-commands.patch │ │ │ ├── 0026-Added-GEORADIUS-BYMEMBER-_RO-variants-for-read-only-.patch │ │ │ ├── 0027-Fix-abort-typo-in-Lua-debugger-help-screen.patch │ │ │ ├── 0028-Fix-isHLLObjectOrReply-to-handle-integer-encoded-str.patch │ │ │ ├── 0029-Make-representClusterNodeFlags-more-robust.patch │ │ │ ├── 0030-Fix-lua-ldb-command-log.patch │ │ │ ├── 0031-fix-mismatch-argument.patch │ │ │ ├── 0032-fix-return-wrong-value-of-clusterDelNodeSlots.patch │ │ │ ├── 0033-Don-t-use-extended-Regexp-Syntax.patch │ │ │ ├── 0034-Fixed-issue-1996-Missing-in-help-message-for-redis-b.patch │ │ │ ├── 0035-fix-rewrite-config-auto-aof-rewrite-min-size.patch │ │ │ ├── 0036-Check-that-the-whole-first-argument-is-a-number.patch │ │ │ ├── 0037-Redis-3.2.10.patch │ │ │ ├── 0038-Flush-append-only-buffers-before-existing.patch │ │ │ └── 0039-Redis-3.2.11.patch │ │ └── run.sh │ ├── redis.conf │ ├── runtest │ ├── runtest-cluster │ ├── runtest-sentinel │ ├── sentinel.conf │ ├── src/ │ │ ├── .gitignore │ │ ├── Makefile │ │ ├── Makefile.dep │ │ ├── adlist.c │ │ ├── adlist.h │ │ ├── ae.c │ │ ├── ae.h │ │ ├── ae_epoll.c │ │ ├── ae_evport.c │ │ ├── ae_kqueue.c │ │ ├── ae_select.c │ │ ├── anet.c │ │ ├── anet.h │ │ ├── aof.c │ │ ├── asciilogo.h │ │ ├── bio.c │ │ ├── bio.h │ │ ├── bitops.c │ │ ├── blocked.c │ │ ├── cluster.c │ │ ├── cluster.h │ │ ├── config.c │ │ ├── config.h │ │ ├── crc16.c │ │ ├── crc32.c │ │ ├── crc64.c │ │ ├── crc64.h │ │ ├── db.c │ │ ├── debug.c │ │ ├── debugmacro.h │ │ ├── dict.c │ │ ├── dict.h │ │ ├── endianconv.c │ │ ├── endianconv.h │ │ ├── fmacros.h │ │ ├── geo.c │ │ ├── geo.h │ │ ├── help.h │ │ ├── hyperloglog.c │ │ ├── intset.c │ │ ├── intset.h │ │ ├── latency.c │ │ ├── latency.h │ │ ├── lzf.h │ │ ├── lzfP.h │ │ ├── lzf_c.c │ │ ├── lzf_d.c │ │ ├── memtest.c │ │ ├── mkreleasehdr.sh │ │ ├── multi.c │ │ ├── networking.c │ │ ├── notify.c │ │ ├── object.c │ │ ├── pqsort.c │ │ ├── pqsort.h │ │ ├── pubsub.c │ │ ├── quicklist.c │ │ ├── quicklist.h │ │ ├── rand.c │ │ ├── rand.h │ │ ├── rdb.c │ │ ├── rdb.h │ │ ├── redis-benchmark.c │ │ ├── redis-check-aof.c │ │ ├── redis-check-rdb.c │ │ ├── redis-cli.c │ │ ├── redis-trib.rb │ │ ├── redisassert.h │ │ ├── release.c │ │ ├── replication.c │ │ ├── rio.c │ │ ├── rio.h │ │ ├── scripting.c │ │ ├── sds.c │ │ ├── sds.h │ │ ├── sdsalloc.h │ │ ├── sentinel.c │ │ ├── server.c │ │ ├── server.h │ │ ├── setproctitle.c │ │ ├── sha1.c │ │ ├── sha1.h │ │ ├── slots.c │ │ ├── slots_async.c │ │ ├── slowlog.c │ │ ├── slowlog.h │ │ ├── solarisfixes.h │ │ ├── sort.c │ │ ├── sparkline.c │ │ ├── sparkline.h │ │ ├── syncio.c │ │ ├── t_hash.c │ │ ├── t_list.c │ │ ├── t_set.c │ │ ├── t_string.c │ │ ├── t_zset.c │ │ ├── testhelp.h │ │ ├── util.c │ │ ├── util.h │ │ ├── valgrind.sup │ │ ├── version.h │ │ ├── ziplist.c │ │ ├── ziplist.h │ │ ├── zipmap.c │ │ ├── zipmap.h │ │ ├── zmalloc.c │ │ └── zmalloc.h │ ├── tests/ │ │ ├── assets/ │ │ │ └── default.conf │ │ ├── cluster/ │ │ │ ├── cluster.tcl │ │ │ ├── run.tcl │ │ │ ├── tests/ │ │ │ │ ├── 00-base.tcl │ │ │ │ ├── 01-faildet.tcl │ │ │ │ ├── 02-failover.tcl │ │ │ │ ├── 03-failover-loop.tcl │ │ │ │ ├── 04-resharding.tcl │ │ │ │ ├── 05-slave-selection.tcl │ │ │ │ ├── 06-slave-stop-cond.tcl │ │ │ │ ├── 07-replica-migration.tcl │ │ │ │ ├── 08-update-msg.tcl │ │ │ │ ├── 09-pubsub.tcl │ │ │ │ ├── 10-manual-failover.tcl │ │ │ │ ├── 11-manual-takeover.tcl │ │ │ │ ├── 12-replica-migration-2.tcl │ │ │ │ ├── helpers/ │ │ │ │ │ └── onlydots.tcl │ │ │ │ └── includes/ │ │ │ │ └── init-tests.tcl │ │ │ └── tmp/ │ │ │ └── .gitignore │ │ ├── helpers/ │ │ │ ├── bg_complex_data.tcl │ │ │ └── gen_write_load.tcl │ │ ├── instances.tcl │ │ ├── integration/ │ │ │ ├── aof-race.tcl │ │ │ ├── aof.tcl │ │ │ ├── convert-zipmap-hash-on-load.tcl │ │ │ ├── logging.tcl │ │ │ ├── rdb.tcl │ │ │ ├── redis-cli.tcl │ │ │ ├── replication-2.tcl │ │ │ ├── replication-3.tcl │ │ │ ├── replication-4.tcl │ │ │ ├── replication-psync.tcl │ │ │ └── replication.tcl │ │ ├── sentinel/ │ │ │ ├── run.tcl │ │ │ ├── tests/ │ │ │ │ ├── 00-base.tcl │ │ │ │ ├── 01-conf-update.tcl │ │ │ │ ├── 02-slaves-reconf.tcl │ │ │ │ ├── 03-runtime-reconf.tcl │ │ │ │ ├── 04-slave-selection.tcl │ │ │ │ ├── 05-manual.tcl │ │ │ │ ├── 06-ckquorum.tcl │ │ │ │ ├── 07-down-conditions.tcl │ │ │ │ └── includes/ │ │ │ │ └── init-tests.tcl │ │ │ └── tmp/ │ │ │ └── .gitignore │ │ ├── support/ │ │ │ ├── cluster.tcl │ │ │ ├── redis.tcl │ │ │ ├── server.tcl │ │ │ ├── test.tcl │ │ │ ├── tmpfile.tcl │ │ │ └── util.tcl │ │ ├── test_helper.tcl │ │ └── unit/ │ │ ├── aofrw.tcl │ │ ├── auth.tcl │ │ ├── bitfield.tcl │ │ ├── bitops.tcl │ │ ├── dump.tcl │ │ ├── expire.tcl │ │ ├── geo.tcl │ │ ├── hyperloglog.tcl │ │ ├── introspection-2.tcl │ │ ├── introspection.tcl │ │ ├── keyspace.tcl │ │ ├── latency-monitor.tcl │ │ ├── limits.tcl │ │ ├── maxmemory.tcl │ │ ├── memefficiency.tcl │ │ ├── multi.tcl │ │ ├── obuf-limits.tcl │ │ ├── other.tcl │ │ ├── printver.tcl │ │ ├── protocol.tcl │ │ ├── pubsub.tcl │ │ ├── quit.tcl │ │ ├── scan.tcl │ │ ├── scripting.tcl │ │ ├── slowlog.tcl │ │ ├── sort.tcl │ │ └── type/ │ │ ├── hash.tcl │ │ ├── incr.tcl │ │ ├── list-2.tcl │ │ ├── list-3.tcl │ │ ├── list-common.tcl │ │ ├── list.tcl │ │ ├── set.tcl │ │ ├── string.tcl │ │ └── zset.tcl │ └── utils/ │ ├── build-static-symbols.tcl │ ├── cluster_fail_time.tcl │ ├── corrupt_rdb.c │ ├── create-cluster/ │ │ ├── .gitignore │ │ ├── README │ │ └── create-cluster │ ├── generate-command-help.rb │ ├── hashtable/ │ │ ├── README │ │ └── rehashing.c │ ├── hyperloglog/ │ │ ├── .gitignore │ │ ├── hll-err.rb │ │ └── hll-gnuplot-graph.rb │ ├── install_server.sh │ ├── lru/ │ │ ├── README │ │ └── test-lru.rb │ ├── redis-copy.rb │ ├── redis-sha1.rb │ ├── redis_init_script │ ├── redis_init_script.tpl │ ├── releasetools/ │ │ ├── 01_create_tarball.sh │ │ ├── 02_upload_tarball.sh │ │ ├── 03_test_release.sh │ │ └── 04_release_hash.sh │ ├── speed-regression.tcl │ └── whatisdoing.sh ├── kubernetes/ │ ├── README.md │ ├── codis-dashboard.yaml │ ├── codis-fe.yaml │ ├── codis-ha.yaml │ ├── codis-proxy.yaml │ ├── codis-server.yaml │ ├── codis-service.yaml │ ├── start.sh │ └── zookeeper/ │ ├── zookeeper-service.yaml │ └── zookeeper.yaml ├── pkg/ │ ├── models/ │ │ ├── action.go │ │ ├── client.go │ │ ├── encode.go │ │ ├── etcd/ │ │ │ └── etcdclient.go │ │ ├── fs/ │ │ │ └── fsclient.go │ │ ├── group.go │ │ ├── proxy.go │ │ ├── sentinel.go │ │ ├── slots.go │ │ ├── sorter.go │ │ ├── store.go │ │ ├── topom.go │ │ └── zk/ │ │ └── zkclient.go │ ├── proxy/ │ │ ├── backend.go │ │ ├── backend_test.go │ │ ├── config.go │ │ ├── delay.go │ │ ├── forward.go │ │ ├── jodis.go │ │ ├── mapper.go │ │ ├── mapper_test.go │ │ ├── metrics.go │ │ ├── proxy.go │ │ ├── proxy_api.go │ │ ├── proxy_test.go │ │ ├── redis/ │ │ │ ├── conn.go │ │ │ ├── conn_test.go │ │ │ ├── decoder.go │ │ │ ├── decoder_test.go │ │ │ ├── encoder.go │ │ │ ├── encoder_test.go │ │ │ └── resp.go │ │ ├── request.go │ │ ├── request_test.go │ │ ├── router.go │ │ ├── session.go │ │ ├── slots.go │ │ └── stats.go │ ├── topom/ │ │ ├── .gitignore │ │ ├── config.go │ │ ├── context.go │ │ ├── context_test.go │ │ ├── topom.go │ │ ├── topom_action.go │ │ ├── topom_action_test.go │ │ ├── topom_api.go │ │ ├── topom_api_test.go │ │ ├── topom_cache.go │ │ ├── topom_cache_test.go │ │ ├── topom_group.go │ │ ├── topom_group_test.go │ │ ├── topom_proxy.go │ │ ├── topom_proxy_test.go │ │ ├── topom_sentinel.go │ │ ├── topom_slots.go │ │ ├── topom_slots_test.go │ │ ├── topom_stats.go │ │ ├── topom_stats_test.go │ │ └── topom_test.go │ └── utils/ │ ├── args.go │ ├── assert/ │ │ └── assert.go │ ├── bufio2/ │ │ ├── bufio.go │ │ ├── bufio_test.go │ │ └── slice.go │ ├── bytesize/ │ │ ├── bytesize.go │ │ └── bytesize_test.go │ ├── errors/ │ │ └── errors.go │ ├── log/ │ │ ├── log.go │ │ └── rolling.go │ ├── math2/ │ │ ├── math.go │ │ └── math_test.go │ ├── redis/ │ │ ├── client.go │ │ └── sentinel.go │ ├── resolver.go │ ├── resolver_test.go │ ├── rpc/ │ │ ├── api.go │ │ └── crypto.go │ ├── sync2/ │ │ ├── atomic2/ │ │ │ ├── atomic64.go │ │ │ └── bool.go │ │ └── future.go │ ├── timesize/ │ │ ├── timesize.go │ │ └── timesize_test.go │ ├── trace/ │ │ └── trace.go │ ├── unsafe2/ │ │ ├── cgo_malloc.go │ │ ├── cgo_slice.go │ │ ├── go_slice.go │ │ ├── je_malloc.go │ │ ├── slice.go │ │ ├── slice_test.go │ │ ├── string.go │ │ └── string_test.go │ ├── usage.go │ ├── usage_linux.go │ └── usage_rusage.go ├── scripts/ │ ├── .gitignore │ ├── docker.sh │ └── static_slots.py ├── vendor/ │ ├── github.com/ │ │ ├── BurntSushi/ │ │ │ └── toml/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── COMPATIBLE │ │ │ ├── COPYING │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── decode.go │ │ │ ├── decode_meta.go │ │ │ ├── doc.go │ │ │ ├── encode.go │ │ │ ├── encoding_types.go │ │ │ ├── encoding_types_1.1.go │ │ │ ├── lex.go │ │ │ ├── parse.go │ │ │ ├── session.vim │ │ │ ├── type_check.go │ │ │ └── type_fields.go │ │ ├── coreos/ │ │ │ └── etcd/ │ │ │ ├── LICENSE │ │ │ ├── NOTICE │ │ │ ├── client/ │ │ │ │ ├── README.md │ │ │ │ ├── auth_role.go │ │ │ │ ├── auth_user.go │ │ │ │ ├── cancelreq.go │ │ │ │ ├── client.go │ │ │ │ ├── cluster_error.go │ │ │ │ ├── curl.go │ │ │ │ ├── discover.go │ │ │ │ ├── doc.go │ │ │ │ ├── keys.generated.go │ │ │ │ ├── keys.go │ │ │ │ ├── members.go │ │ │ │ ├── srv.go │ │ │ │ └── util.go │ │ │ └── pkg/ │ │ │ ├── pathutil/ │ │ │ │ └── path.go │ │ │ └── types/ │ │ │ ├── doc.go │ │ │ ├── id.go │ │ │ ├── set.go │ │ │ ├── slice.go │ │ │ ├── urls.go │ │ │ └── urlsmap.go │ │ ├── docopt/ │ │ │ └── docopt-go/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── docopt.go │ │ │ ├── test_golang.docopt │ │ │ └── testcases.docopt │ │ ├── emirpasic/ │ │ │ └── gods/ │ │ │ ├── LICENSE │ │ │ ├── containers/ │ │ │ │ ├── containers.go │ │ │ │ ├── enumerable.go │ │ │ │ ├── iterator.go │ │ │ │ └── serialization.go │ │ │ ├── trees/ │ │ │ │ ├── redblacktree/ │ │ │ │ │ ├── iterator.go │ │ │ │ │ ├── redblacktree.go │ │ │ │ │ └── serialization.go │ │ │ │ └── trees.go │ │ │ └── utils/ │ │ │ ├── comparator.go │ │ │ ├── sort.go │ │ │ └── utils.go │ │ ├── garyburd/ │ │ │ └── redigo/ │ │ │ ├── LICENSE │ │ │ ├── internal/ │ │ │ │ └── commandinfo.go │ │ │ └── redis/ │ │ │ ├── conn.go │ │ │ ├── doc.go │ │ │ ├── go17.go │ │ │ ├── log.go │ │ │ ├── pool.go │ │ │ ├── pre_go17.go │ │ │ ├── pubsub.go │ │ │ ├── redis.go │ │ │ ├── reply.go │ │ │ ├── scan.go │ │ │ └── script.go │ │ ├── go-martini/ │ │ │ └── martini/ │ │ │ ├── .gitignore │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── env.go │ │ │ ├── go_version.go │ │ │ ├── logger.go │ │ │ ├── martini.go │ │ │ ├── recovery.go │ │ │ ├── response_writer.go │ │ │ ├── return_handler.go │ │ │ ├── router.go │ │ │ ├── static.go │ │ │ └── wercker.yml │ │ ├── influxdata/ │ │ │ └── influxdb/ │ │ │ ├── LICENSE │ │ │ ├── LICENSE_OF_DEPENDENCIES.md │ │ │ ├── client/ │ │ │ │ └── v2/ │ │ │ │ ├── client.go │ │ │ │ └── udp.go │ │ │ ├── models/ │ │ │ │ ├── consistency.go │ │ │ │ ├── inline_fnv.go │ │ │ │ ├── inline_strconv_parse.go │ │ │ │ ├── points.go │ │ │ │ ├── rows.go │ │ │ │ ├── statistic.go │ │ │ │ └── time.go │ │ │ └── pkg/ │ │ │ └── escape/ │ │ │ ├── bytes.go │ │ │ └── strings.go │ │ ├── martini-contrib/ │ │ │ ├── binding/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── binding.go │ │ │ │ ├── errors.go │ │ │ │ └── wercker.yml │ │ │ ├── gzip/ │ │ │ │ ├── LICENSE │ │ │ │ ├── README.md │ │ │ │ ├── gzip.go │ │ │ │ └── wercker.yml │ │ │ └── render/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── render.go │ │ │ └── wercker.yml │ │ ├── oxtoacart/ │ │ │ └── bpool/ │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ ├── bpool.go │ │ │ ├── bufferpool.go │ │ │ ├── bytepool.go │ │ │ └── sizedbufferpool.go │ │ ├── samuel/ │ │ │ └── go-zookeeper/ │ │ │ ├── LICENSE │ │ │ └── zk/ │ │ │ ├── conn.go │ │ │ ├── constants.go │ │ │ ├── dnshostprovider.go │ │ │ ├── flw.go │ │ │ ├── lock.go │ │ │ ├── server_help.go │ │ │ ├── server_java.go │ │ │ ├── structs.go │ │ │ └── util.go │ │ ├── spinlock/ │ │ │ └── jemalloc-go/ │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── Makefile │ │ │ ├── README.md │ │ │ ├── help.mk │ │ │ ├── jemalloc-4.4.0/ │ │ │ │ ├── .appveyor.yml │ │ │ │ ├── .autom4te.cfg │ │ │ │ ├── .gitattributes │ │ │ │ ├── .gitignore │ │ │ │ ├── .travis.yml │ │ │ │ ├── COPYING │ │ │ │ ├── ChangeLog │ │ │ │ ├── INSTALL │ │ │ │ ├── Makefile.in │ │ │ │ ├── README │ │ │ │ ├── VERSION │ │ │ │ ├── autogen.sh │ │ │ │ ├── bin/ │ │ │ │ │ ├── jemalloc-config.in │ │ │ │ │ ├── jemalloc.sh.in │ │ │ │ │ └── jeprof.in │ │ │ │ ├── build-aux/ │ │ │ │ │ ├── config.guess │ │ │ │ │ ├── config.sub │ │ │ │ │ └── install-sh │ │ │ │ ├── config.stamp.in │ │ │ │ ├── configure.ac │ │ │ │ ├── coverage.sh │ │ │ │ ├── doc/ │ │ │ │ │ ├── html.xsl.in │ │ │ │ │ ├── jemalloc.xml.in │ │ │ │ │ ├── manpages.xsl.in │ │ │ │ │ └── stylesheet.xsl │ │ │ │ ├── include/ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ ├── internal/ │ │ │ │ │ │ │ ├── arena.h │ │ │ │ │ │ │ ├── assert.h │ │ │ │ │ │ │ ├── atomic.h │ │ │ │ │ │ │ ├── base.h │ │ │ │ │ │ │ ├── bitmap.h │ │ │ │ │ │ │ ├── chunk.h │ │ │ │ │ │ │ ├── chunk_dss.h │ │ │ │ │ │ │ ├── chunk_mmap.h │ │ │ │ │ │ │ ├── ckh.h │ │ │ │ │ │ │ ├── ctl.h │ │ │ │ │ │ │ ├── extent.h │ │ │ │ │ │ │ ├── hash.h │ │ │ │ │ │ │ ├── huge.h │ │ │ │ │ │ │ ├── jemalloc_internal.h.in │ │ │ │ │ │ │ ├── jemalloc_internal_decls.h │ │ │ │ │ │ │ ├── jemalloc_internal_defs.h.in │ │ │ │ │ │ │ ├── jemalloc_internal_macros.h │ │ │ │ │ │ │ ├── mb.h │ │ │ │ │ │ │ ├── mutex.h │ │ │ │ │ │ │ ├── nstime.h │ │ │ │ │ │ │ ├── pages.h │ │ │ │ │ │ │ ├── ph.h │ │ │ │ │ │ │ ├── private_namespace.sh │ │ │ │ │ │ │ ├── private_symbols.txt │ │ │ │ │ │ │ ├── private_unnamespace.sh │ │ │ │ │ │ │ ├── prng.h │ │ │ │ │ │ │ ├── prof.h │ │ │ │ │ │ │ ├── public_namespace.sh │ │ │ │ │ │ │ ├── public_unnamespace.sh │ │ │ │ │ │ │ ├── ql.h │ │ │ │ │ │ │ ├── qr.h │ │ │ │ │ │ │ ├── quarantine.h │ │ │ │ │ │ │ ├── rb.h │ │ │ │ │ │ │ ├── rtree.h │ │ │ │ │ │ │ ├── size_classes.sh │ │ │ │ │ │ │ ├── smoothstep.h │ │ │ │ │ │ │ ├── smoothstep.sh │ │ │ │ │ │ │ ├── spin.h │ │ │ │ │ │ │ ├── stats.h │ │ │ │ │ │ │ ├── tcache.h │ │ │ │ │ │ │ ├── ticker.h │ │ │ │ │ │ │ ├── tsd.h │ │ │ │ │ │ │ ├── util.h │ │ │ │ │ │ │ ├── valgrind.h │ │ │ │ │ │ │ └── witness.h │ │ │ │ │ │ ├── jemalloc.sh │ │ │ │ │ │ ├── jemalloc_defs.h.in │ │ │ │ │ │ ├── jemalloc_macros.h.in │ │ │ │ │ │ ├── jemalloc_mangle.sh │ │ │ │ │ │ ├── jemalloc_protos.h.in │ │ │ │ │ │ ├── jemalloc_rename.sh │ │ │ │ │ │ └── jemalloc_typedefs.h.in │ │ │ │ │ └── msvc_compat/ │ │ │ │ │ ├── C99/ │ │ │ │ │ │ ├── stdbool.h │ │ │ │ │ │ └── stdint.h │ │ │ │ │ ├── strings.h │ │ │ │ │ └── windows_extra.h │ │ │ │ ├── jemalloc.pc.in │ │ │ │ ├── msvc/ │ │ │ │ │ ├── ReadMe.txt │ │ │ │ │ ├── jemalloc_vc2015.sln │ │ │ │ │ └── projects/ │ │ │ │ │ └── vc2015/ │ │ │ │ │ ├── jemalloc/ │ │ │ │ │ │ ├── jemalloc.vcxproj │ │ │ │ │ │ └── jemalloc.vcxproj.filters │ │ │ │ │ └── test_threads/ │ │ │ │ │ ├── test_threads.cpp │ │ │ │ │ ├── test_threads.h │ │ │ │ │ ├── test_threads.vcxproj │ │ │ │ │ ├── test_threads.vcxproj.filters │ │ │ │ │ └── test_threads_main.cpp │ │ │ │ ├── src/ │ │ │ │ │ ├── arena.c │ │ │ │ │ ├── atomic.c │ │ │ │ │ ├── base.c │ │ │ │ │ ├── bitmap.c │ │ │ │ │ ├── chunk.c │ │ │ │ │ ├── chunk_dss.c │ │ │ │ │ ├── chunk_mmap.c │ │ │ │ │ ├── ckh.c │ │ │ │ │ ├── ctl.c │ │ │ │ │ ├── extent.c │ │ │ │ │ ├── hash.c │ │ │ │ │ ├── huge.c │ │ │ │ │ ├── jemalloc.c │ │ │ │ │ ├── mb.c │ │ │ │ │ ├── mutex.c │ │ │ │ │ ├── nstime.c │ │ │ │ │ ├── pages.c │ │ │ │ │ ├── prng.c │ │ │ │ │ ├── prof.c │ │ │ │ │ ├── quarantine.c │ │ │ │ │ ├── rtree.c │ │ │ │ │ ├── spin.c │ │ │ │ │ ├── stats.c │ │ │ │ │ ├── tcache.c │ │ │ │ │ ├── ticker.c │ │ │ │ │ ├── tsd.c │ │ │ │ │ ├── util.c │ │ │ │ │ ├── valgrind.c │ │ │ │ │ ├── witness.c │ │ │ │ │ └── zone.c │ │ │ │ └── test/ │ │ │ │ ├── include/ │ │ │ │ │ └── test/ │ │ │ │ │ ├── SFMT-alti.h │ │ │ │ │ ├── SFMT-params.h │ │ │ │ │ ├── SFMT-params11213.h │ │ │ │ │ ├── SFMT-params1279.h │ │ │ │ │ ├── SFMT-params132049.h │ │ │ │ │ ├── SFMT-params19937.h │ │ │ │ │ ├── SFMT-params216091.h │ │ │ │ │ ├── SFMT-params2281.h │ │ │ │ │ ├── SFMT-params4253.h │ │ │ │ │ ├── SFMT-params44497.h │ │ │ │ │ ├── SFMT-params607.h │ │ │ │ │ ├── SFMT-params86243.h │ │ │ │ │ ├── SFMT-sse2.h │ │ │ │ │ ├── SFMT.h │ │ │ │ │ ├── btalloc.h │ │ │ │ │ ├── jemalloc_test.h.in │ │ │ │ │ ├── jemalloc_test_defs.h.in │ │ │ │ │ ├── math.h │ │ │ │ │ ├── mq.h │ │ │ │ │ ├── mtx.h │ │ │ │ │ ├── test.h │ │ │ │ │ ├── thd.h │ │ │ │ │ └── timer.h │ │ │ │ ├── integration/ │ │ │ │ │ ├── MALLOCX_ARENA.c │ │ │ │ │ ├── aligned_alloc.c │ │ │ │ │ ├── allocated.c │ │ │ │ │ ├── chunk.c │ │ │ │ │ ├── mallocx.c │ │ │ │ │ ├── overflow.c │ │ │ │ │ ├── posix_memalign.c │ │ │ │ │ ├── rallocx.c │ │ │ │ │ ├── sdallocx.c │ │ │ │ │ ├── thread_arena.c │ │ │ │ │ ├── thread_tcache_enabled.c │ │ │ │ │ └── xallocx.c │ │ │ │ ├── src/ │ │ │ │ │ ├── SFMT.c │ │ │ │ │ ├── btalloc.c │ │ │ │ │ ├── btalloc_0.c │ │ │ │ │ ├── btalloc_1.c │ │ │ │ │ ├── math.c │ │ │ │ │ ├── mq.c │ │ │ │ │ ├── mtx.c │ │ │ │ │ ├── test.c │ │ │ │ │ ├── thd.c │ │ │ │ │ └── timer.c │ │ │ │ ├── stress/ │ │ │ │ │ └── microbench.c │ │ │ │ ├── test.sh.in │ │ │ │ └── unit/ │ │ │ │ ├── SFMT.c │ │ │ │ ├── a0.c │ │ │ │ ├── arena_reset.c │ │ │ │ ├── atomic.c │ │ │ │ ├── bitmap.c │ │ │ │ ├── ckh.c │ │ │ │ ├── decay.c │ │ │ │ ├── fork.c │ │ │ │ ├── hash.c │ │ │ │ ├── junk.c │ │ │ │ ├── junk_alloc.c │ │ │ │ ├── junk_free.c │ │ │ │ ├── lg_chunk.c │ │ │ │ ├── mallctl.c │ │ │ │ ├── math.c │ │ │ │ ├── mq.c │ │ │ │ ├── mtx.c │ │ │ │ ├── nstime.c │ │ │ │ ├── pack.c │ │ │ │ ├── pages.c │ │ │ │ ├── ph.c │ │ │ │ ├── prng.c │ │ │ │ ├── prof_accum.c │ │ │ │ ├── prof_active.c │ │ │ │ ├── prof_gdump.c │ │ │ │ ├── prof_idump.c │ │ │ │ ├── prof_reset.c │ │ │ │ ├── prof_thread_name.c │ │ │ │ ├── ql.c │ │ │ │ ├── qr.c │ │ │ │ ├── quarantine.c │ │ │ │ ├── rb.c │ │ │ │ ├── rtree.c │ │ │ │ ├── run_quantize.c │ │ │ │ ├── size_classes.c │ │ │ │ ├── smoothstep.c │ │ │ │ ├── stats.c │ │ │ │ ├── ticker.c │ │ │ │ ├── tsd.c │ │ │ │ ├── util.c │ │ │ │ ├── witness.c │ │ │ │ └── zero.c │ │ │ ├── jemalloc.go │ │ │ └── jemalloc_test.go │ │ └── ugorji/ │ │ └── go/ │ │ ├── LICENSE │ │ └── codec/ │ │ ├── 0doc.go │ │ ├── README.md │ │ ├── binc.go │ │ ├── cbor.go │ │ ├── decode.go │ │ ├── decode_go.go │ │ ├── decode_go14.go │ │ ├── encode.go │ │ ├── fast-path.generated.go │ │ ├── fast-path.go.tmpl │ │ ├── fast-path.not.go │ │ ├── gen-dec-array.go.tmpl │ │ ├── gen-dec-map.go.tmpl │ │ ├── gen-helper.generated.go │ │ ├── gen-helper.go.tmpl │ │ ├── gen.generated.go │ │ ├── gen.go │ │ ├── gen_15.go │ │ ├── gen_16.go │ │ ├── gen_17.go │ │ ├── helper.go │ │ ├── helper_internal.go │ │ ├── helper_not_unsafe.go │ │ ├── helper_unsafe.go │ │ ├── json.go │ │ ├── msgpack.go │ │ ├── noop.go │ │ ├── prebuild.go │ │ ├── prebuild.sh │ │ ├── rpc.go │ │ ├── simple.go │ │ ├── test-cbor-goldens.json │ │ ├── test.py │ │ ├── tests.sh │ │ └── time.go │ ├── golang.org/ │ │ └── x/ │ │ └── net/ │ │ ├── AUTHORS │ │ ├── CONTRIBUTORS │ │ ├── LICENSE │ │ ├── PATENTS │ │ └── context/ │ │ ├── context.go │ │ ├── go17.go │ │ └── pre_go17.go │ └── gopkg.in/ │ └── alexcesaro/ │ └── statsd.v2/ │ ├── .travis.yml │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── conn.go │ ├── doc.go │ ├── options.go │ └── statsd.go ├── version └── wandoujia_license.txt
Showing preview only (866K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (10690 symbols across 735 files)
FILE: cmd/admin/admin.go
type cmdAdmin (line 18) | type cmdAdmin struct
method Main (line 22) | func (t *cmdAdmin) Main(d map[string]interface{}) {
method newTopomClient (line 39) | func (t *cmdAdmin) newTopomClient(d map[string]interface{}) models.Cli...
method newTopomStore (line 76) | func (t *cmdAdmin) newTopomStore(d map[string]interface{}) *models.Sto...
method handleRemoveLock (line 84) | func (t *cmdAdmin) handleRemoveLock(d map[string]interface{}) {
method handleConfigDump (line 95) | func (t *cmdAdmin) handleConfigDump(d map[string]interface{}) {
method dumpConfigV1 (line 110) | func (t *cmdAdmin) dumpConfigV1(d map[string]interface{}) {
method dumpConfigV1Recursively (line 126) | func (t *cmdAdmin) dumpConfigV1Recursively(client models.Client, path ...
method dumpConfigV3 (line 152) | func (t *cmdAdmin) dumpConfigV3(d map[string]interface{}) {
method loadJsonConfigV1 (line 187) | func (t *cmdAdmin) loadJsonConfigV1(file string) map[string]interface{} {
method convertSlotsV1 (line 199) | func (t *cmdAdmin) convertSlotsV1(slots map[int]*models.SlotMapping, v...
method convertGroupV1 (line 224) | func (t *cmdAdmin) convertGroupV1(group map[int]*models.Group, v inter...
method handleConfigConvert (line 253) | func (t *cmdAdmin) handleConfigConvert(d map[string]interface{}) {
method loadJsonConfigV3 (line 293) | func (t *cmdAdmin) loadJsonConfigV3(file string) *ConfigV3 {
method handleConfigRestore (line 354) | func (t *cmdAdmin) handleConfigRestore(d map[string]interface{}) {
method handleDashboardList (line 401) | func (t *cmdAdmin) handleDashboardList(d map[string]interface{}) {
type ConfigV3 (line 104) | type ConfigV3 struct
FILE: cmd/admin/dashboard.go
type cmdDashboard (line 19) | type cmdDashboard struct
method Main (line 23) | func (t *cmdDashboard) Main(d map[string]interface{}) {
method newTopomClient (line 90) | func (t *cmdDashboard) newTopomClient() *topom.ApiClient {
method handleOverview (line 111) | func (t *cmdDashboard) handleOverview(d map[string]interface{}) {
method handleLogLevel (line 167) | func (t *cmdDashboard) handleLogLevel(d map[string]interface{}) {
method handleShutdown (line 184) | func (t *cmdDashboard) handleShutdown(d map[string]interface{}) {
method handleReload (line 194) | func (t *cmdDashboard) handleReload(d map[string]interface{}) {
method handleSlotsCommand (line 204) | func (t *cmdDashboard) handleSlotsCommand(d map[string]interface{}) {
method parseProxyTokens (line 282) | func (t *cmdDashboard) parseProxyTokens(d map[string]interface{}) []st...
method handleProxyCommand (line 358) | func (t *cmdDashboard) handleProxyCommand(d map[string]interface{}) {
method handleGroupCommand (line 471) | func (t *cmdDashboard) handleGroupCommand(d map[string]interface{}) {
method handleSentinelCommand (line 635) | func (t *cmdDashboard) handleSentinelCommand(d map[string]interface{}) {
method handleSyncActionCommand (line 673) | func (t *cmdDashboard) handleSyncActionCommand(d map[string]interface{...
method handleSlotActionCommand (line 702) | func (t *cmdDashboard) handleSlotActionCommand(d map[string]interface{...
method handleSlotRebalance (line 775) | func (t *cmdDashboard) handleSlotRebalance(d map[string]interface{}) {
FILE: cmd/admin/main.go
function main (line 12) | func main() {
FILE: cmd/admin/proxy.go
type cmdProxy (line 17) | type cmdProxy struct
method Main (line 22) | func (t *cmdProxy) Main(d map[string]interface{}) {
method newProxyClient (line 44) | func (t *cmdProxy) newProxyClient(xauth bool) *proxy.ApiClient {
method handleOverview (line 69) | func (t *cmdProxy) handleOverview(d map[string]interface{}) {
method handleStart (line 107) | func (t *cmdProxy) handleStart(d map[string]interface{}) {
method handleLogLevel (line 117) | func (t *cmdProxy) handleLogLevel(d map[string]interface{}) {
method handleFillSlots (line 134) | func (t *cmdProxy) handleFillSlots(d map[string]interface{}) {
method handleResetStats (line 166) | func (t *cmdProxy) handleResetStats(d map[string]interface{}) {
method handleForceGC (line 176) | func (t *cmdProxy) handleForceGC(d map[string]interface{}) {
method handleShutdown (line 186) | func (t *cmdProxy) handleShutdown(d map[string]interface{}) {
FILE: cmd/dashboard/main.go
function main (line 25) | func main() {
FILE: cmd/fe/assets/dashboard-fe.js
function genXAuth (line 5) | function genXAuth(name) {
function concatUrl (line 9) | function concatUrl(base, name) {
function padInt2Str (line 17) | function padInt2Str(num, size) {
function toJsonHtml (line 23) | function toJsonHtml(obj) {
function humanSize (line 45) | function humanSize(size) {
function newChatsOpsConfig (line 65) | function newChatsOpsConfig() {
function renderSlotsCharts (line 120) | function renderSlotsCharts(slots_array) {
function processProxyStats (line 230) | function processProxyStats(codis_stats) {
function processSentinels (line 280) | function processSentinels(codis_stats, group_stats, codis_name) {
function alertAction (line 394) | function alertAction(text, callback) {
function alertAction2 (line 415) | function alertAction2(text, callback) {
function alertErrorResp (line 437) | function alertErrorResp(failedResp) {
function isValidInput (line 452) | function isValidInput(text) {
function processGroupStats (line 456) | function processGroupStats(codis_stats) {
FILE: cmd/fe/main.go
function init (line 36) | func init() {
function main (line 56) | func main() {
type ConfigLoader (line 228) | type ConfigLoader interface
type StaticLoader (line 232) | type StaticLoader struct
method Reload (line 236) | func (l *StaticLoader) Reload() (map[string]string, error) {
type DynamicLoader (line 255) | type DynamicLoader struct
method Reload (line 259) | func (l *DynamicLoader) Reload() (map[string]string, error) {
type ReverseProxy (line 281) | type ReverseProxy struct
method reload (line 295) | func (r *ReverseProxy) reload(d time.Duration) {
method GetProxy (line 316) | func (r *ReverseProxy) GetProxy(name string) *httputil.ReverseProxy {
method GetNames (line 322) | func (r *ReverseProxy) GetNames() []string {
function NewReverseProxy (line 288) | func NewReverseProxy(loader ConfigLoader) *ReverseProxy {
FILE: cmd/ha/main.go
function main (line 20) | func main() {
constant CodeAlive (line 103) | CodeAlive = iota + 100
constant CodeError (line 104) | CodeError
constant CodeMissing (line 105) | CodeMissing
constant CodeTimeout (line 106) | CodeTimeout
constant CodeSyncReady (line 110) | CodeSyncReady = iota + 200
constant CodeSyncError (line 111) | CodeSyncError
constant CodeSyncBroken (line 112) | CodeSyncBroken
type HealthyChecker (line 115) | type HealthyChecker struct
method LogProxyStats (line 181) | func (hc *HealthyChecker) LogProxyStats() {
method LogGroupStats (line 211) | func (hc *HealthyChecker) LogGroupStats() {
method Maintains (line 248) | func (hc *HealthyChecker) Maintains(client *topom.ApiClient, maxdown i...
function newHealthyChecker (line 121) | func newHealthyChecker(client *topom.ApiClient) *HealthyChecker {
FILE: cmd/proxy/main.go
function main (line 31) | func main() {
function AutoGOMAXPROCS (line 242) | func AutoGOMAXPROCS(min, max int) {
function AutoOnlineWithDashboard (line 284) | func AutoOnlineWithDashboard(p *proxy.Proxy, dashboard string) {
function AutoOnlineWithCoordinator (line 297) | func AutoOnlineWithCoordinator(p *proxy.Proxy, name, addr, auth string) {
function AutoOnlineWithFillSlots (line 318) | func AutoOnlineWithFillSlots(p *proxy.Proxy, slots []*models.Slot) {
function OnlineProxy (line 327) | func OnlineProxy(p *proxy.Proxy, dashboard string) bool {
FILE: deploy/products/alpha/render.py
function readfile (line 10) | def readfile(path, name):
function generate (line 16) | def generate(path, name, content):
function generate_bash (line 25) | def generate_bash(path, name, content):
function symlink (line 32) | def symlink(src, dst):
class Coordinator (line 40) | class Coordinator:
method __init__ (line 41) | def __init__(self, config):
class Dashboard (line 46) | class Dashboard():
method __init__ (line 47) | def __init__(self, product, config):
method render (line 65) | def render(self, proxylist):
class Template (line 114) | class Template:
method __init__ (line 115) | def __init__(self, config):
class Proxy (line 125) | class Proxy():
method __init__ (line 126) | def __init__(self, product, template, config):
method render (line 141) | def render(self):
class Env (line 172) | class Env:
method __init__ (line 173) | def __init__(self, config):
class Product (line 180) | class Product:
method __init__ (line 181) | def __init__(self, config):
method render (line 198) | def render(self):
FILE: deploy/products/beta/render.py
function readfile (line 10) | def readfile(path, name):
function generate (line 16) | def generate(path, name, content):
function generate_bash (line 25) | def generate_bash(path, name, content):
function symlink (line 32) | def symlink(src, dst):
class Coordinator (line 40) | class Coordinator:
method __init__ (line 41) | def __init__(self, config):
class Dashboard (line 46) | class Dashboard():
method __init__ (line 47) | def __init__(self, product, config):
method render (line 65) | def render(self, proxylist):
class Template (line 114) | class Template:
method __init__ (line 115) | def __init__(self, config):
class Proxy (line 125) | class Proxy():
method __init__ (line 126) | def __init__(self, product, template, config):
method render (line 141) | def render(self):
class Env (line 172) | class Env:
method __init__ (line 173) | def __init__(self, config):
class Product (line 180) | class Product:
method __init__ (line 181) | def __init__(self, config):
method render (line 198) | def render(self):
FILE: example/dashboard.py
class CodisDashboard (line 10) | class CodisDashboard(Process):
method __init__ (line 12) | def __init__(self, admin_port, product_name, product_auth=None):
method _open_config (line 26) | def _open_config(admin_port, product_name, product_auth=None):
FILE: example/fe.py
class CodisFE (line 10) | class CodisFE(Process):
method __init__ (line 12) | def __init__(self, port, assets):
FILE: example/proxy.py
class CodisProxy (line 10) | class CodisProxy(Process):
method __init__ (line 12) | def __init__(self, admin_port, proxy_port, product_name, product_auth=...
method _open_config (line 27) | def _open_config(admin_port, proxy_port, product_name, product_auth=No...
FILE: example/sentinel.py
class CodisSentinel (line 10) | class CodisSentinel(Process):
method __init__ (line 12) | def __init__(self, port):
method _open_config (line 24) | def _open_config(port):
FILE: example/server.py
class CodisServer (line 10) | class CodisServer(Process):
method __init__ (line 12) | def __init__(self, port, master_port=None, requirepass=None):
method _open_config (line 24) | def _open_config(port, master_port=None, requirepass=None):
FILE: example/setup.py
function codis_admin_dashboard (line 10) | def codis_admin_dashboard(admin_port, args=None):
function codis_admin_proxy (line 17) | def codis_admin_proxy(admin_port, args=None):
FILE: example/utils.py
class Process (line 8) | class Process:
method __init__ (line 10) | def __init__(self, command, logfile=None):
method is_running (line 20) | def is_running(self):
method kill (line 27) | def kill(self):
method wait (line 33) | def wait(self):
method get_pid (line 36) | def get_pid(self):
function kill_all (line 40) | def kill_all(children=[]):
function check_alive (line 45) | def check_alive(children=[], seconds=0):
function do_command (line 54) | def do_command(command):
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/adapters/ae.h
type redisAeEvents (line 38) | typedef struct redisAeEvents {
function redisAeReadEvent (line 45) | static void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, in...
function redisAeWriteEvent (line 52) | static void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, i...
function redisAeAddRead (line 59) | static void redisAeAddRead(void *privdata) {
function redisAeDelRead (line 68) | static void redisAeDelRead(void *privdata) {
function redisAeAddWrite (line 77) | static void redisAeAddWrite(void *privdata) {
function redisAeDelWrite (line 86) | static void redisAeDelWrite(void *privdata) {
function redisAeCleanup (line 95) | static void redisAeCleanup(void *privdata) {
function redisAeAttach (line 102) | static int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/adapters/libev.h
type redisLibevEvents (line 39) | typedef struct redisLibevEvents {
function redisLibevReadEvent (line 46) | static void redisLibevReadEvent(EV_P_ ev_io *watcher, int revents) {
function redisLibevWriteEvent (line 56) | static void redisLibevWriteEvent(EV_P_ ev_io *watcher, int revents) {
function redisLibevAddRead (line 66) | static void redisLibevAddRead(void *privdata) {
function redisLibevDelRead (line 76) | static void redisLibevDelRead(void *privdata) {
function redisLibevAddWrite (line 86) | static void redisLibevAddWrite(void *privdata) {
function redisLibevDelWrite (line 96) | static void redisLibevDelWrite(void *privdata) {
function redisLibevCleanup (line 106) | static void redisLibevCleanup(void *privdata) {
function redisLibevAttach (line 113) | static int redisLibevAttach(EV_P_ redisAsyncContext *ac) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/adapters/libevent.h
type redisLibeventEvents (line 37) | typedef struct redisLibeventEvents {
function redisLibeventReadEvent (line 42) | static void redisLibeventReadEvent(int fd, short event, void *arg) {
function redisLibeventWriteEvent (line 48) | static void redisLibeventWriteEvent(int fd, short event, void *arg) {
function redisLibeventAddRead (line 54) | static void redisLibeventAddRead(void *privdata) {
function redisLibeventDelRead (line 59) | static void redisLibeventDelRead(void *privdata) {
function redisLibeventAddWrite (line 64) | static void redisLibeventAddWrite(void *privdata) {
function redisLibeventDelWrite (line 69) | static void redisLibeventDelWrite(void *privdata) {
function redisLibeventCleanup (line 74) | static void redisLibeventCleanup(void *privdata) {
function redisLibeventAttach (line 81) | static int redisLibeventAttach(redisAsyncContext *ac, struct event_base ...
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/adapters/libuv.h
type redisLibuvEvents (line 8) | typedef struct redisLibuvEvents {
function redisLibuvPoll (line 16) | static void redisLibuvPoll(uv_poll_t* handle, int status, int events) {
function redisLibuvAddRead (line 32) | static void redisLibuvAddRead(void *privdata) {
function redisLibuvDelRead (line 41) | static void redisLibuvDelRead(void *privdata) {
function redisLibuvAddWrite (line 54) | static void redisLibuvAddWrite(void *privdata) {
function redisLibuvDelWrite (line 63) | static void redisLibuvDelWrite(void *privdata) {
function on_close (line 76) | static void on_close(uv_handle_t* handle) {
function redisLibuvCleanup (line 83) | static void redisLibuvCleanup(void *privdata) {
function redisLibuvAttach (line 90) | static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/async.c
function callbackHash (line 64) | static unsigned int callbackHash(const void *key) {
function callbackKeyCompare (line 76) | static int callbackKeyCompare(void *privdata, const void *key1, const vo...
function callbackKeyDestructor (line 86) | static void callbackKeyDestructor(void *privdata, void *key) {
function callbackValDestructor (line 91) | static void callbackValDestructor(void *privdata, void *val) {
function redisAsyncContext (line 105) | static redisAsyncContext *redisAsyncInitialize(redisContext *c) {
function __redisAsyncCopyError (line 144) | static void __redisAsyncCopyError(redisAsyncContext *ac) {
function redisAsyncContext (line 150) | redisAsyncContext *redisAsyncConnect(const char *ip, int port) {
function redisAsyncContext (line 168) | redisAsyncContext *redisAsyncConnectBind(const char *ip, int port,
function redisAsyncContext (line 176) | redisAsyncContext *redisAsyncConnectUnix(const char *path) {
function redisAsyncSetConnectCallback (line 194) | int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCall...
function redisAsyncSetDisconnectCallback (line 207) | int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconne...
function __redisPushCallback (line 216) | static int __redisPushCallback(redisCallbackList *list, redisCallback *s...
function __redisShiftCallback (line 238) | static int __redisShiftCallback(redisCallbackList *list, redisCallback *...
function __redisRunCallback (line 254) | static void __redisRunCallback(redisAsyncContext *ac, redisCallback *cb,...
function __redisAsyncFree (line 264) | static void __redisAsyncFree(redisAsyncContext *ac) {
function redisAsyncFree (line 312) | void redisAsyncFree(redisAsyncContext *ac) {
function __redisAsyncDisconnect (line 320) | static void __redisAsyncDisconnect(redisAsyncContext *ac) {
function redisAsyncDisconnect (line 346) | void redisAsyncDisconnect(redisAsyncContext *ac) {
function __redisGetSubscribeCallback (line 353) | static int __redisGetSubscribeCallback(redisAsyncContext *ac, redisReply...
function redisProcessCallbacks (line 400) | void redisProcessCallbacks(redisAsyncContext *ac) {
function __redisAsyncHandleConnect (line 482) | static int __redisAsyncHandleConnect(redisAsyncContext *ac) {
function redisAsyncHandleRead (line 504) | void redisAsyncHandleRead(redisAsyncContext *ac) {
function redisAsyncHandleWrite (line 525) | void redisAsyncHandleWrite(redisAsyncContext *ac) {
function __redisAsyncCommand (line 571) | static int __redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *f...
function redisvAsyncCommand (line 635) | int redisvAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void ...
function redisAsyncCommand (line 645) | int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *...
function redisAsyncCommandArgv (line 654) | int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, vo...
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/async.h
type redisAsyncContext (line 40) | struct redisAsyncContext
type dict (line 41) | struct dict
type redisAsyncContext (line 44) | struct redisAsyncContext
type redisCallback (line 45) | typedef struct redisCallback {
type redisCallbackList (line 52) | typedef struct redisCallbackList {
type redisAsyncContext (line 57) | struct redisAsyncContext
type redisAsyncContext (line 58) | struct redisAsyncContext
type redisAsyncContext (line 61) | typedef struct redisAsyncContext {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/dict.c
function dictGenHashFunction (line 53) | static unsigned int dictGenHashFunction(const unsigned char *buf, int le...
function _dictReset (line 65) | static void _dictReset(dict *ht) {
function dict (line 73) | static dict *dictCreate(dictType *type, void *privDataPtr) {
function _dictInit (line 80) | static int _dictInit(dict *ht, dictType *type, void *privDataPtr) {
function dictExpand (line 88) | static int dictExpand(dict *ht, unsigned long size) {
function dictAdd (line 135) | static int dictAdd(dict *ht, void *key, void *val) {
function dictReplace (line 160) | static int dictReplace(dict *ht, void *key, void *val) {
function dictDelete (line 182) | static int dictDelete(dict *ht, const void *key) {
function _dictClear (line 213) | static int _dictClear(dict *ht) {
function dictRelease (line 238) | static void dictRelease(dict *ht) {
function dictEntry (line 243) | static dictEntry *dictFind(dict *ht, const void *key) {
function dictIterator (line 258) | static dictIterator *dictGetIterator(dict *ht) {
function dictEntry (line 268) | static dictEntry *dictNext(dictIterator *iter) {
function dictReleaseIterator (line 288) | static void dictReleaseIterator(dictIterator *iter) {
function _dictExpandIfNeeded (line 295) | static int _dictExpandIfNeeded(dict *ht) {
function _dictNextPower (line 306) | static unsigned long _dictNextPower(unsigned long size) {
function _dictKeyIndex (line 320) | static int _dictKeyIndex(dict *ht, const void *key) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/dict.h
type dictEntry (line 45) | typedef struct dictEntry {
type dictType (line 51) | typedef struct dictType {
type dict (line 60) | typedef struct dict {
type dictIterator (line 69) | typedef struct dictIterator {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-ae.c
function getCallback (line 13) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 22) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 32) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 43) | int main (int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-libev.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 19) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 27) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 35) | int main (int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-libevent.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 19) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 27) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 35) | int main (int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-libuv.c
function getCallback (line 10) | void getCallback(redisAsyncContext *c, void *r, void *privdata) {
function connectCallback (line 19) | void connectCallback(const redisAsyncContext *c, int status) {
function disconnectCallback (line 27) | void disconnectCallback(const redisAsyncContext *c, int status) {
function main (line 35) | int main (int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/examples/example.c
function main (line 7) | int main(int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/hiredis.c
function redisReply (line 61) | static redisReply *createReplyObject(int type) {
function freeReplyObject (line 72) | void freeReplyObject(void *reply) {
function __redisReaderSetError (line 186) | static void __redisReaderSetError(redisReader *r, int type, const char *...
function chrtos (line 212) | static size_t chrtos(char *buf, size_t size, char byte) {
function __redisReaderSetErrorProtocolByte (line 236) | static void __redisReaderSetErrorProtocolByte(redisReader *r, char byte) {
function __redisReaderSetErrorOOM (line 245) | static void __redisReaderSetErrorOOM(redisReader *r) {
function readLongLong (line 288) | static long long readLongLong(char *s) {
function moveToNextTask (line 330) | static void moveToNextTask(redisReader *r) {
function processLineItem (line 355) | static int processLineItem(redisReader *r) {
function processBulkItem (line 389) | static int processBulkItem(redisReader *r) {
function processMultiBulkItem (line 442) | static int processMultiBulkItem(redisReader *r) {
function processItem (line 507) | static int processItem(redisReader *r) {
function redisReader (line 556) | redisReader *redisReaderCreate(void) {
function redisReaderFree (line 577) | void redisReaderFree(redisReader *r) {
function redisReaderFeed (line 585) | int redisReaderFeed(redisReader *r, const char *buf, size_t len) {
function redisReaderGetReply (line 617) | int redisReaderGetReply(redisReader *r, void **reply) {
function intlen (line 668) | static int intlen(int i) {
function bulklen (line 682) | static size_t bulklen(size_t len) {
function redisvFormatCommand (line 686) | int redisvFormatCommand(char **target, const char *format, va_list ap) {
function redisFormatCommand (line 925) | int redisFormatCommand(char **target, const char *format, ...) {
function redisFormatCommandArgv (line 939) | int redisFormatCommandArgv(char **target, int argc, const char **argv, c...
function __redisSetError (line 973) | void __redisSetError(redisContext *c, int type, const char *str) {
function redisContext (line 989) | static redisContext *redisContextInit(void) {
function redisFree (line 1003) | void redisFree(redisContext *c) {
function redisFreeKeepFd (line 1013) | int redisFreeKeepFd(redisContext *c) {
function redisContext (line 1023) | redisContext *redisConnect(const char *ip, int port) {
function redisContext (line 1035) | redisContext *redisConnectWithTimeout(const char *ip, int port, const st...
function redisContext (line 1047) | redisContext *redisConnectNonBlock(const char *ip, int port) {
function redisContext (line 1059) | redisContext *redisConnectBindNonBlock(const char *ip, int port,
function redisContext (line 1067) | redisContext *redisConnectUnix(const char *path) {
function redisContext (line 1079) | redisContext *redisConnectUnixWithTimeout(const char *path, const struct...
function redisContext (line 1091) | redisContext *redisConnectUnixNonBlock(const char *path) {
function redisContext (line 1103) | redisContext *redisConnectFd(int fd) {
function redisSetTimeout (line 1116) | int redisSetTimeout(redisContext *c, const struct timeval tv) {
function redisEnableKeepAlive (line 1123) | int redisEnableKeepAlive(redisContext *c) {
function redisBufferRead (line 1134) | int redisBufferRead(redisContext *c) {
function redisBufferWrite (line 1171) | int redisBufferWrite(redisContext *c, int *done) {
function redisGetReplyFromReader (line 1202) | int redisGetReplyFromReader(redisContext *c, void **reply) {
function redisGetReply (line 1210) | int redisGetReply(redisContext *c, void **reply) {
function __redisAppendCommand (line 1247) | int __redisAppendCommand(redisContext *c, const char *cmd, size_t len) {
function redisAppendFormattedCommand (line 1260) | int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t...
function redisvAppendCommand (line 1269) | int redisvAppendCommand(redisContext *c, const char *format, va_list ap) {
function redisAppendCommand (line 1288) | int redisAppendCommand(redisContext *c, const char *format, ...) {
function redisAppendCommandArgv (line 1298) | int redisAppendCommandArgv(redisContext *c, int argc, const char **argv,...
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/hiredis.h
type redisReply (line 98) | typedef struct redisReply {
type redisReadTask (line 107) | typedef struct redisReadTask {
type redisReplyObjectFunctions (line 116) | typedef struct redisReplyObjectFunctions {
type redisReader (line 125) | typedef struct redisReader {
type redisContext (line 166) | typedef struct redisContext {
type timeval (line 176) | struct timeval
type timeval (line 180) | struct timeval
type timeval (line 183) | struct timeval
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/net.c
function redisContextCloseFd (line 57) | static void redisContextCloseFd(redisContext *c) {
function __redisSetErrorFromErrno (line 64) | static void __redisSetErrorFromErrno(redisContext *c, int type, const ch...
function redisSetReuseAddr (line 74) | static int redisSetReuseAddr(redisContext *c) {
function redisCreateSocket (line 84) | static int redisCreateSocket(redisContext *c, int type) {
function redisSetBlocking (line 99) | static int redisSetBlocking(redisContext *c, int blocking) {
function redisKeepAlive (line 124) | int redisKeepAlive(redisContext *c, int interval) {
function redisSetTcpNoDelay (line 166) | static int redisSetTcpNoDelay(redisContext *c) {
function redisContextWaitReady (line 178) | static int redisContextWaitReady(redisContext *c, const struct timeval *...
function redisCheckSocketError (line 226) | int redisCheckSocketError(redisContext *c) {
function redisContextSetTimeout (line 244) | int redisContextSetTimeout(redisContext *c, const struct timeval tv) {
function _redisContextConnectTcp (line 256) | static int _redisContextConnectTcp(redisContext *c, const char *addr, in...
function redisContextConnectTcp (line 345) | int redisContextConnectTcp(redisContext *c, const char *addr, int port,
function redisContextConnectBindTcp (line 350) | int redisContextConnectBindTcp(redisContext *c, const char *addr, int port,
function redisContextConnectUnix (line 356) | int redisContextConnectUnix(redisContext *c, const char *path, const str...
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/net.h
type timeval (line 43) | struct timeval
type timeval (line 44) | struct timeval
type timeval (line 46) | struct timeval
type timeval (line 48) | struct timeval
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/sds.c
function sds (line 51) | sds sdsnewlen(const void *init, size_t initlen) {
function sds (line 70) | sds sdsempty(void) {
function sds (line 75) | sds sdsnew(const char *init) {
function sds (line 81) | sds sdsdup(const sds s) {
function sdsfree (line 86) | void sdsfree(sds s) {
function sdsupdatelen (line 105) | void sdsupdatelen(sds s) {
function sdsclear (line 116) | void sdsclear(sds s) {
function sds (line 129) | sds sdsMakeRoomFor(sds s, size_t addlen) {
function sds (line 155) | sds sdsRemoveFreeSpace(sds s) {
function sdsAllocSize (line 171) | size_t sdsAllocSize(sds s) {
function sdsIncrLen (line 200) | void sdsIncrLen(sds s, int incr) {
function sds (line 217) | sds sdsgrowzero(sds s, size_t len) {
function sds (line 239) | sds sdscatlen(sds s, const void *t, size_t len) {
function sds (line 257) | sds sdscat(sds s, const char *t) {
function sds (line 265) | sds sdscatsds(sds s, const sds t) {
function sds (line 271) | sds sdscpylen(sds s, const char *t, size_t len) {
function sds (line 290) | sds sdscpy(sds s, const char *t) {
function sdsll2str (line 301) | int sdsll2str(char *s, long long value) {
function sdsull2str (line 333) | int sdsull2str(char *s, unsigned long long v) {
function sds (line 365) | sds sdsfromlonglong(long long value) {
function sds (line 373) | sds sdscatvprintf(sds s, const char *fmt, va_list ap) {
function sds (line 426) | sds sdscatprintf(sds s, const char *fmt, ...) {
function sds (line 451) | sds sdscatfmt(sds s, char const *fmt, ...) {
function sds (line 565) | sds sdstrim(sds s, const char *cset) {
function sdsrange (line 598) | void sdsrange(sds s, int start, int end) {
function sdstolower (line 629) | void sdstolower(sds s) {
function sdstoupper (line 636) | void sdstoupper(sds s) {
function sdscmp (line 653) | int sdscmp(const sds s1, const sds s2) {
function sds (line 681) | sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, in...
function sdsfreesplitres (line 731) | void sdsfreesplitres(sds *tokens, int count) {
function sds (line 744) | sds sdscatrepr(sds s, const char *p, size_t len) {
function is_hex_digit (line 771) | int is_hex_digit(char c) {
function hex_digit_to_int (line 778) | int hex_digit_to_int(char c) {
function sds (line 819) | sds *sdssplitargs(const char *line, int *argc) {
function sds (line 938) | sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen) {
function sds (line 954) | sds sdsjoin(char **argv, int argc, char *sep) {
function main (line 970) | int main(void) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/sds.h
type sdshdr (line 41) | struct sdshdr {
function sdslen (line 47) | static inline size_t sdslen(const sds s) {
function sdsavail (line 52) | static inline size_t sdsavail(const sds s) {
FILE: extern/deprecated/redis-2.8.21/deps/hiredis/test.c
type connection_type (line 15) | enum connection_type {
type config (line 21) | struct config {
function usec (line 40) | static long long usec(void) {
function redisContext (line 46) | static redisContext *select_database(redisContext *c) {
function disconnect (line 68) | static int disconnect(redisContext *c, int keep_fd) {
function redisContext (line 86) | static redisContext *connect(struct config config) {
function test_format_commands (line 116) | static void test_format_commands(void) {
function test_append_formatted_commands (line 220) | static void test_append_formatted_commands(struct config config) {
function test_reply_reader (line 242) | static void test_reply_reader(void) {
function test_blocking_connection_errors (line 321) | static void test_blocking_connection_errors(void) {
function test_blocking_connection (line 346) | static void test_blocking_connection(struct config config) {
function test_blocking_io_errors (line 424) | static void test_blocking_io_errors(struct config config) {
function test_invalid_timeout_errors (line 475) | static void test_invalid_timeout_errors(struct config config) {
function test_throughput (line 499) | static void test_throughput(struct config config) {
function main (line 663) | int main(int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/arena.h
type arena_chunk_map_t (line 46) | typedef struct arena_chunk_map_s arena_chunk_map_t;
type arena_chunk_t (line 47) | typedef struct arena_chunk_s arena_chunk_t;
type arena_run_t (line 48) | typedef struct arena_run_s arena_run_t;
type arena_bin_info_t (line 49) | typedef struct arena_bin_info_s arena_bin_info_t;
type arena_bin_t (line 50) | typedef struct arena_bin_s arena_bin_t;
type arena_t (line 51) | typedef struct arena_s arena_t;
type arena_chunk_map_s (line 58) | struct arena_chunk_map_s {
type arena_avail_tree_t (line 159) | typedef rb_tree(arena_chunk_map_t) arena_avail_tree_t;
type arena_run_tree_t (line 160) | typedef rb_tree(arena_chunk_map_t) arena_run_tree_t;
type arena_chunk_mapelms_t (line 161) | typedef ql_head(arena_chunk_map_t) arena_chunk_mapelms_t;
type arena_chunk_s (line 164) | struct arena_chunk_s {
type arena_chunk_tree_t (line 194) | typedef rb_tree(arena_chunk_t) arena_chunk_tree_t;
type arena_run_s (line 196) | struct arena_run_s {
type arena_bin_info_s (line 245) | struct arena_bin_info_s {
type arena_bin_s (line 283) | struct arena_bin_s {
type arena_s (line 311) | struct arena_s {
function JEMALLOC_ALWAYS_INLINE (line 504) | JEMALLOC_ALWAYS_INLINE arena_chunk_map_t *
function JEMALLOC_ALWAYS_INLINE (line 514) | JEMALLOC_ALWAYS_INLINE size_t *
function JEMALLOC_ALWAYS_INLINE (line 521) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 528) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 535) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 545) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 556) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 567) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 579) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 588) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 597) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 606) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 615) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 622) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 634) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 646) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 661) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 674) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 690) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_INLINE (line 701) | JEMALLOC_INLINE bool
function JEMALLOC_INLINE (line 716) | JEMALLOC_INLINE bool
function JEMALLOC_INLINE (line 727) | JEMALLOC_INLINE bool
function JEMALLOC_ALWAYS_INLINE (line 746) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_INLINE (line 788) | JEMALLOC_INLINE size_t
function arena_run_regind (line 796) | JEMALLOC_INLINE unsigned
function JEMALLOC_INLINE (line 868) | JEMALLOC_INLINE prof_ctx_t *
function JEMALLOC_INLINE (line 906) | JEMALLOC_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 947) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 978) | JEMALLOC_ALWAYS_INLINE size_t
function JEMALLOC_ALWAYS_INLINE (line 1024) | JEMALLOC_ALWAYS_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/atomic.h
function JEMALLOC_INLINE (line 37) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 44) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 51) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 58) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 65) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 72) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 79) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 92) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 106) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 119) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 128) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 135) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 149) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 156) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 163) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 170) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 177) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 184) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 191) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 204) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 218) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 225) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 232) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 239) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 251) | JEMALLOC_INLINE size_t
function JEMALLOC_INLINE (line 262) | JEMALLOC_INLINE size_t
function atomic_add_u (line 277) | JEMALLOC_INLINE unsigned
function atomic_sub_u (line 288) | JEMALLOC_INLINE unsigned
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/bitmap.h
type bitmap_level_t (line 7) | typedef struct bitmap_level_s bitmap_level_t;
type bitmap_info_t (line 8) | typedef struct bitmap_info_s bitmap_info_t;
type bitmap_t (line 9) | typedef unsigned long bitmap_t;
type bitmap_level_s (line 26) | struct bitmap_level_s {
type bitmap_info_s (line 31) | struct bitmap_info_s {
function JEMALLOC_INLINE (line 67) | JEMALLOC_INLINE bool
function JEMALLOC_INLINE (line 76) | JEMALLOC_INLINE bool
function JEMALLOC_INLINE (line 88) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 122) | JEMALLOC_INLINE size_t
function JEMALLOC_INLINE (line 144) | JEMALLOC_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/chunk_dss.h
type dss_prec_t (line 4) | typedef enum {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/ckh.h
type ckh_t (line 4) | typedef struct ckh_s ckh_t;
type ckhc_t (line 5) | typedef struct ckhc_s ckhc_t;
type ckhc_s (line 27) | struct ckhc_s {
type ckh_s (line 32) | struct ckh_s {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/ctl.h
type ctl_node_t (line 4) | typedef struct ctl_node_s ctl_node_t;
type ctl_named_node_t (line 5) | typedef struct ctl_named_node_s ctl_named_node_t;
type ctl_indexed_node_t (line 6) | typedef struct ctl_indexed_node_s ctl_indexed_node_t;
type ctl_arena_stats_t (line 7) | typedef struct ctl_arena_stats_s ctl_arena_stats_t;
type ctl_stats_t (line 8) | typedef struct ctl_stats_s ctl_stats_t;
type ctl_node_s (line 14) | struct ctl_node_s {
type ctl_named_node_s (line 18) | struct ctl_named_node_s {
type ctl_indexed_node_s (line 28) | struct ctl_indexed_node_s {
type ctl_arena_stats_s (line 33) | struct ctl_arena_stats_s {
type ctl_stats_s (line 51) | struct ctl_stats_s {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/extent.h
type extent_node_t (line 4) | typedef struct extent_node_s extent_node_t;
type extent_node_s (line 11) | struct extent_node_s {
type extent_tree_t (line 30) | typedef rb_tree(extent_node_t) extent_tree_t;
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/hash.h
function JEMALLOC_INLINE (line 34) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 41) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 47) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 54) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 61) | JEMALLOC_INLINE uint32_t
function JEMALLOC_INLINE (line 74) | JEMALLOC_INLINE uint64_t
function JEMALLOC_INLINE (line 87) | JEMALLOC_INLINE uint32_t
function hash_x86_128 (line 138) | void
function hash_x64_128 (line 240) | void
function JEMALLOC_INLINE (line 320) | JEMALLOC_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/mb.h
function JEMALLOC_INLINE (line 31) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 58) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 69) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 80) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 91) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 102) | JEMALLOC_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/mutex.h
type malloc_mutex_t (line 4) | typedef struct malloc_mutex_s malloc_mutex_t;
type malloc_mutex_s (line 27) | struct malloc_mutex_s {
function JEMALLOC_INLINE (line 67) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 82) | JEMALLOC_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/prof.h
type prof_bt_t (line 4) | typedef struct prof_bt_s prof_bt_t;
type prof_cnt_t (line 5) | typedef struct prof_cnt_s prof_cnt_t;
type prof_thr_cnt_t (line 6) | typedef struct prof_thr_cnt_s prof_thr_cnt_t;
type prof_ctx_t (line 7) | typedef struct prof_ctx_s prof_ctx_t;
type prof_tdata_t (line 8) | typedef struct prof_tdata_s prof_tdata_t;
type prof_bt_s (line 56) | struct prof_bt_s {
type prof_unwind_data_t (line 64) | typedef struct {
type prof_cnt_s (line 71) | struct prof_cnt_s {
type prof_thr_cnt_s (line 87) | struct prof_thr_cnt_s {
type prof_ctx_s (line 124) | struct prof_ctx_s {
type prof_ctx_list_t (line 157) | typedef ql_head(prof_ctx_t) prof_ctx_list_t;
type prof_tdata_s (line 159) | struct prof_tdata_s {
function JEMALLOC_INLINE (line 388) | JEMALLOC_INLINE prof_ctx_t *
function JEMALLOC_INLINE (line 407) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 423) | JEMALLOC_INLINE bool
function JEMALLOC_INLINE (line 452) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 497) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 572) | JEMALLOC_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/quarantine.h
type quarantine_obj_t (line 4) | typedef struct quarantine_obj_s quarantine_obj_t;
type quarantine_t (line 5) | typedef struct quarantine_s quarantine_t;
type quarantine_obj_s (line 14) | struct quarantine_obj_s {
type quarantine_s (line 19) | struct quarantine_s {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/rtree.h
type rtree_t (line 11) | typedef struct rtree_s rtree_t;
type rtree_s (line 26) | struct rtree_s {
function JEMALLOC_INLINE (line 130) | JEMALLOC_INLINE bool
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/stats.h
type tcache_bin_stats_t (line 4) | typedef struct tcache_bin_stats_s tcache_bin_stats_t;
type malloc_bin_stats_t (line 5) | typedef struct malloc_bin_stats_s malloc_bin_stats_t;
type malloc_large_stats_t (line 6) | typedef struct malloc_large_stats_s malloc_large_stats_t;
type arena_stats_t (line 7) | typedef struct arena_stats_s arena_stats_t;
type chunk_stats_t (line 8) | typedef struct chunk_stats_s chunk_stats_t;
type tcache_bin_stats_s (line 14) | struct tcache_bin_stats_s {
type malloc_bin_stats_s (line 22) | struct malloc_bin_stats_s {
type malloc_large_stats_s (line 64) | struct malloc_large_stats_s {
type arena_stats_s (line 85) | struct arena_stats_s {
type chunk_stats_s (line 113) | struct chunk_stats_s {
function JEMALLOC_INLINE (line 150) | JEMALLOC_INLINE size_t
function JEMALLOC_INLINE (line 157) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 164) | JEMALLOC_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/tcache.h
type tcache_bin_info_t (line 4) | typedef struct tcache_bin_info_s tcache_bin_info_t;
type tcache_bin_t (line 5) | typedef struct tcache_bin_s tcache_bin_t;
type tcache_t (line 6) | typedef struct tcache_s tcache_t;
type tcache_enabled_t (line 48) | typedef enum {
type tcache_bin_info_s (line 58) | struct tcache_bin_info_s {
type tcache_bin_s (line 62) | struct tcache_bin_s {
type tcache_s (line 70) | struct tcache_s {
function JEMALLOC_INLINE (line 165) | JEMALLOC_INLINE bool
function JEMALLOC_INLINE (line 181) | JEMALLOC_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 209) | JEMALLOC_ALWAYS_INLINE tcache_t *
function JEMALLOC_ALWAYS_INLINE (line 261) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 274) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 290) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 335) | JEMALLOC_ALWAYS_INLINE void *
function JEMALLOC_ALWAYS_INLINE (line 388) | JEMALLOC_ALWAYS_INLINE void
function JEMALLOC_ALWAYS_INLINE (line 412) | JEMALLOC_ALWAYS_INLINE void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/tsd.h
type tsd_init_block_t (line 11) | typedef struct tsd_init_block_s tsd_init_block_t;
type tsd_init_head_t (line 12) | typedef struct tsd_init_head_s tsd_init_head_t;
function a_attr (line 149) | a_attr a_type * \
function a_attr (line 156) | a_attr void \
function a_attr (line 181) | a_attr a_type * \
function a_attr (line 188) | a_attr void \
function a_attr (line 213) | a_attr bool \
function a_attr (line 236) | a_attr bool \
type tsd_init_block_s (line 402) | struct tsd_init_block_s {
type tsd_init_head_s (line 407) | struct tsd_init_head_s {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/jemalloc/internal/util.h
function JEMALLOC_INLINE (line 119) | JEMALLOC_INLINE size_t
function JEMALLOC_INLINE (line 137) | JEMALLOC_INLINE void
function JEMALLOC_INLINE (line 149) | JEMALLOC_INLINE int
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/msvc_compat/inttypes.h
type imaxdiv_t (line 47) | typedef struct {
function _inline (line 284) | static
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/msvc_compat/stdbool.h
type BOOL (line 8) | typedef BOOL _Bool;
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/msvc_compat/stdint.h
type int_least8_t (line 94) | typedef int8_t int_least8_t;
type int_least16_t (line 95) | typedef int16_t int_least16_t;
type int_least32_t (line 96) | typedef int32_t int_least32_t;
type int_least64_t (line 97) | typedef int64_t int_least64_t;
type uint_least8_t (line 98) | typedef uint8_t uint_least8_t;
type uint_least16_t (line 99) | typedef uint16_t uint_least16_t;
type uint_least32_t (line 100) | typedef uint32_t uint_least32_t;
type uint_least64_t (line 101) | typedef uint64_t uint_least64_t;
type int_fast8_t (line 104) | typedef int8_t int_fast8_t;
type int_fast16_t (line 105) | typedef int16_t int_fast16_t;
type int_fast32_t (line 106) | typedef int32_t int_fast32_t;
type int_fast64_t (line 107) | typedef int64_t int_fast64_t;
type uint_fast8_t (line 108) | typedef uint8_t uint_fast8_t;
type uint_fast16_t (line 109) | typedef uint16_t uint_fast16_t;
type uint_fast32_t (line 110) | typedef uint32_t uint_fast32_t;
type uint_fast64_t (line 111) | typedef uint64_t uint_fast64_t;
type intmax_t (line 123) | typedef int64_t intmax_t;
type uintmax_t (line 124) | typedef uint64_t uintmax_t;
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/include/msvc_compat/strings.h
function ffsl (line 8) | static __forceinline int ffsl(long x)
function ffs (line 17) | static __forceinline int ffs(int x)
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/arena.c
function arena_run_comp (line 56) | static inline int
function arena_avail_adjac_succ (line 189) | static inline bool
function arena_avail_adjac (line 205) | static inline bool
function arena_avail_insert (line 213) | static void
function arena_avail_remove (line 246) | static void
function arena_run_reg_dalloc (line 301) | static inline void
function arena_run_zero (line 327) | static inline void
function arena_run_page_mark_zeroed (line 337) | static inline void
function arena_run_page_validate_zeroed (line 345) | static inline void
function arena_cactive_update (line 356) | static void
function arena_run_split_remove (line 369) | static void
function arena_run_split_large_helper (line 410) | static void
function arena_run_split_large (line 463) | static void
function arena_run_init_large (line 470) | static void
function arena_run_split_small (line 477) | static void
function arena_chunk_t (line 523) | static arena_chunk_t *
function arena_chunk_t (line 545) | static arena_chunk_t *
function arena_chunk_t (line 610) | static arena_chunk_t *
function arena_chunk_dealloc (line 630) | static void
function arena_run_t (line 662) | static arena_run_t *
function arena_run_t (line 685) | static arena_run_t *
function arena_run_t (line 717) | static arena_run_t *
function arena_run_t (line 740) | static arena_run_t *
function arena_maybe_purge (line 773) | static inline void
function arena_chunk_t (line 796) | static arena_chunk_t *
function arena_compute_npurgatory (line 806) | static size_t
function arena_chunk_stash_dirty (line 827) | static void
function arena_chunk_purge_stashed (line 885) | static size_t
function arena_chunk_unstash_purged (line 933) | static void
function arena_chunk_purge (line 954) | static inline size_t
function arena_purge (line 1001) | static void
function arena_purge_all (line 1082) | void
function arena_run_coalesce (line 1091) | static void
function arena_run_dalloc (line 1159) | static void
function arena_run_trim_head (line 1235) | static void
function arena_run_trim_tail (line 1267) | static void
function arena_run_t (line 1300) | static arena_run_t *
function arena_bin_runs_insert (line 1321) | static void
function arena_bin_runs_remove (line 1333) | static void
function arena_run_t (line 1345) | static arena_run_t *
function arena_run_t (line 1357) | static arena_run_t *
function arena_tcache_fill_small (line 1461) | void
function arena_alloc_junk_small (line 1502) | void
function arena_redzone_corruption (line 1522) | static void
function arena_redzones_validate (line 1538) | static void
function arena_dalloc_junk_small (line 1572) | void
function arena_quarantine_junk_small (line 1588) | void
function arena_prof_promoted (line 1753) | void
function arena_dissociate_bin_run (line 1776) | static void
function arena_dalloc_bin_run (line 1799) | static void
function arena_bin_lower_run (line 1850) | static void
function arena_dalloc_bin_locked (line 1871) | void
function arena_dalloc_bin (line 1906) | void
function arena_dalloc_small (line 1921) | void
function arena_dalloc_junk_large (line 1940) | static void
function arena_dalloc_large_locked (line 1954) | void
function arena_dalloc_large (line 1974) | void
function arena_ralloc_large_shrink (line 1983) | static void
function arena_ralloc_large_grow (line 2013) | static bool
function arena_ralloc_junk_large (line 2082) | static void
function arena_ralloc_large (line 2102) | static bool
function arena_ralloc_no_move (line 2145) | bool
function dss_prec_t (line 2231) | dss_prec_t
function arena_dss_prec_set (line 2242) | void
function arena_stats_merge (line 2251) | void
function arena_new (line 2299) | bool
function bin_info_run_size_calc (line 2364) | static size_t
function bin_info_init (line 2502) | static void
function arena_boot (line 2517) | void
function arena_prefork (line 2549) | void
function arena_postfork_parent (line 2559) | void
function arena_postfork_child (line 2569) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/base.c
function base_pages_alloc (line 26) | static bool
function extent_node_t (line 82) | extent_node_t *
function base_node_dealloc (line 101) | void
function base_boot (line 112) | bool
function base_prefork (line 123) | void
function base_postfork_parent (line 130) | void
function base_postfork_child (line 137) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/bitmap.c
function bits2groups (line 11) | static size_t
function bitmap_info_init (line 19) | void
function bitmap_info_ngroups (line 47) | size_t
function bitmap_size (line 54) | size_t
function bitmap_init (line 63) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/chunk.c
function chunk_record (line 212) | static void
function chunk_unmap (line 300) | void
function chunk_dealloc (line 314) | void
function chunk_boot (line 336) | bool
function chunk_prefork (line 367) | void
function chunk_postfork_parent (line 377) | void
function chunk_postfork_child (line 387) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/chunk_dss.c
function dss_prec_t (line 43) | dss_prec_t
function chunk_dss_prec_set (line 56) | bool
function chunk_in_dss (line 141) | bool
function chunk_dss_boot (line 159) | bool
function chunk_dss_prefork (line 174) | void
function chunk_dss_postfork_parent (line 182) | void
function chunk_dss_postfork_child (line 190) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/chunk_mmap.c
function pages_purge (line 116) | bool
function chunk_dealloc_mmap (line 202) | bool
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/ckh.c
function JEMALLOC_INLINE_C (line 52) | JEMALLOC_INLINE_C size_t
function JEMALLOC_INLINE_C (line 70) | JEMALLOC_INLINE_C size_t
function JEMALLOC_INLINE_C (line 91) | JEMALLOC_INLINE_C bool
function JEMALLOC_INLINE_C (line 123) | JEMALLOC_INLINE_C bool
function JEMALLOC_INLINE_C (line 193) | JEMALLOC_INLINE_C bool
function JEMALLOC_INLINE_C (line 222) | JEMALLOC_INLINE_C bool
function ckh_grow (line 245) | static bool
function ckh_shrink (line 300) | static void
function ckh_new (line 347) | bool
function ckh_delete (line 402) | void
function ckh_count (line 425) | size_t
function ckh_iter (line 434) | bool
function ckh_insert (line 454) | bool
function ckh_remove (line 478) | bool
function ckh_search (line 509) | bool
function ckh_string_hash (line 528) | void
function ckh_string_keycomp (line 535) | bool
function ckh_pointer_hash (line 545) | void
function ckh_pointer_keycomp (line 558) | bool
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/ctl.c
function ctl_named_node_t (line 20) | static inline const ctl_named_node_t *
function ctl_named_node_t (line 27) | static inline const ctl_named_node_t *
function ctl_indexed_node_t (line 35) | static inline const ctl_indexed_node_t *
function CTL_PROTO (line 67) | CTL_PROTO(version)
function arena_purge (line 1290) | static void
function arena_i_purge_ctl (line 1312) | static int
function arena_i_dss_ctl (line 1329) | static int
function ctl_named_node_t (line 1380) | static const ctl_named_node_t *
function arenas_narenas_ctl (line 1399) | static int
function arenas_initialized_ctl (line 1421) | static int
function ctl_named_node_t (line 1455) | static const ctl_named_node_t *
function ctl_named_node_t (line 1466) | static const ctl_named_node_t *
function arenas_purge_ctl (line 1475) | static int
function arenas_extend_ctl (line 1500) | static int
function prof_active_ctl (line 1524) | static int
function prof_dump_ctl (line 1553) | static int
function ctl_named_node_t (line 1660) | static const ctl_named_node_t *
function ctl_named_node_t (line 1669) | static const ctl_named_node_t *
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/extent.c
function extent_szad_comp (line 6) | static inline int
function extent_ad_comp (line 25) | rb_gen(, extent_tree_szad_, extent_tree_t, extent_node_t, link_szad,
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/huge.c
function huge_ralloc_no_move (line 80) | bool
function huge_dalloc_junk (line 197) | static void
function huge_dalloc (line 216) | void
function huge_salloc (line 246) | size_t
function dss_prec_t (line 266) | dss_prec_t
function prof_ctx_t (line 273) | prof_ctx_t *
function huge_prof_ctx_set (line 293) | void
function huge_boot (line 310) | bool
function huge_prefork (line 328) | void
function huge_postfork_parent (line 335) | void
function huge_postfork_child (line 342) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/jemalloc.c
function malloc_tsd_data (line 7) | malloc_tsd_data(, arenas, arena_t *, NULL)
type malloc_utrace_t (line 80) | typedef struct {
function arena_t (line 116) | arena_t *
function arena_t (line 142) | arena_t *
function stats_print_atexit (line 202) | static void
function malloc_ncpus (line 246) | static unsigned
function arenas_cleanup (line 261) | void
function JEMALLOC_ALWAYS_INLINE_C (line 271) | JEMALLOC_ALWAYS_INLINE_C void
function JEMALLOC_ALWAYS_INLINE_C (line 288) | JEMALLOC_ALWAYS_INLINE_C bool
function malloc_conf_next (line 299) | static bool
function malloc_conf_error (line 375) | static void
function malloc_conf_init (line 384) | static void
function malloc_init_hard (line 649) | static bool
function JEMALLOC_ALWAYS_INLINE_C (line 867) | JEMALLOC_ALWAYS_INLINE_C void *
function JEMALLOC_ALWAYS_INLINE_C (line 968) | JEMALLOC_ALWAYS_INLINE_C void *
function imemalign (line 992) | static int
function je_posix_memalign (line 1058) | int
function JEMALLOC_ALWAYS_INLINE_C (line 1100) | JEMALLOC_ALWAYS_INLINE_C void *
function JEMALLOC_ALWAYS_INLINE_C (line 1197) | JEMALLOC_ALWAYS_INLINE_C void *
function JEMALLOC_INLINE_C (line 1215) | JEMALLOC_INLINE_C void
function je_free (line 1302) | void
function JEMALLOC_ALWAYS_INLINE_C (line 1374) | JEMALLOC_ALWAYS_INLINE_C void *
function JEMALLOC_ALWAYS_INLINE_C (line 1413) | JEMALLOC_ALWAYS_INLINE_C void *
function JEMALLOC_ALWAYS_INLINE_C (line 1510) | JEMALLOC_ALWAYS_INLINE_C void *
function JEMALLOC_ALWAYS_INLINE_C (line 1619) | JEMALLOC_ALWAYS_INLINE_C size_t
function ixallocx_prof_sample (line 1632) | static size_t
function JEMALLOC_ALWAYS_INLINE_C (line 1659) | JEMALLOC_ALWAYS_INLINE_C size_t
function je_xallocx (line 1682) | size_t
function je_sallocx (line 1741) | size_t
function je_dallocx (line 1759) | void
function je_nallocx (line 1793) | size_t
function je_mallctl (line 1810) | int
function je_mallctlnametomib (line 1821) | int
function je_mallctlbymib (line 1831) | int
function je_malloc_stats_print (line 1842) | void
function je_malloc_usable_size (line 1850) | size_t
function je_allocm (line 1875) | int
function je_rallocm (line 1891) | int
function je_sallocm (line 1920) | int
function je_dallocm (line 1929) | int
function je_nallocm (line 1937) | int
function jemalloc_constructor (line 1973) | JEMALLOC_ATTR(constructor)
function jemalloc_prefork (line 1982) | void
function jemalloc_postfork_parent (line 2011) | void
function jemalloc_postfork_child (line 2039) | void
function a0free (line 2096) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/mutex.c
function pthread_create_once (line 37) | static void
function JEMALLOC_EXPORT (line 51) | JEMALLOC_EXPORT int
function malloc_mutex_init (line 71) | bool
function malloc_mutex_prefork (line 105) | void
function malloc_mutex_postfork_parent (line 112) | void
function malloc_mutex_postfork_child (line 119) | void
function mutex_boot (line 135) | bool
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/prof.c
function bt_init (line 81) | void
function bt_destroy (line 91) | static void
function prof_bt_t (line 100) | static prof_bt_t *
function prof_enter (line 126) | static inline void
function prof_leave (line 138) | static inline void
function prof_backtrace (line 161) | void
function _Unwind_Reason_Code (line 196) | static _Unwind_Reason_Code
function _Unwind_Reason_Code (line 205) | static _Unwind_Reason_Code
function prof_backtrace (line 224) | void
function prof_backtrace (line 234) | void
function prof_backtrace (line 403) | void
function malloc_mutex_t (line 412) | static malloc_mutex_t *
function prof_ctx_init (line 420) | static void
function prof_ctx_destroy (line 436) | static void
function prof_ctx_merge (line 478) | static void
function prof_lookup_global (line 516) | static bool
function prof_thr_cnt_t (line 571) | prof_thr_cnt_t *
function prof_bt_count (line 650) | size_t
function prof_dump_open (line 672) | static int
function prof_dump_flush (line 693) | static bool
function prof_dump_close (line 716) | static bool
function prof_dump_write (line 729) | static bool
function prof_dump_printf (line 760) | static bool
function prof_dump_ctx_prep (line 775) | static void
function prof_dump_header (line 834) | static bool
function prof_dump_ctx_cleanup_locked (line 858) | static void
function prof_dump_ctx_cleanup (line 866) | static void
function prof_dump_ctx (line 875) | static bool
function prof_dump_maps (line 930) | static bool
function prof_leakcheck (line 979) | static void
function prof_dump (line 996) | static bool
function prof_dump_filename (line 1064) | static void
function prof_fdump (line 1084) | static void
function prof_idump (line 1102) | void
function prof_mdump (line 1129) | bool
function prof_gdump (line 1152) | void
function prof_bt_hash (line 1179) | static void
function prof_bt_keycomp (line 1189) | static bool
function prof_tdata_t (line 1202) | prof_tdata_t *
function prof_tdata_cleanup (line 1241) | void
function prof_boot0 (line 1286) | void
function prof_boot1 (line 1296) | void
function prof_boot2 (line 1324) | bool
function prof_prefork (line 1378) | void
function prof_postfork_parent (line 1392) | void
function prof_postfork_child (line 1406) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/quarantine.c
function quarantine_t (line 26) | quarantine_t *
function quarantine_t (line 45) | static quarantine_t *
function quarantine_drain_one (line 79) | static void
function quarantine_drain (line 91) | static void
function quarantine (line 99) | void
function quarantine_cleanup (line 161) | void
function quarantine_boot (line 189) | bool
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/rtree.c
function rtree_t (line 4) | rtree_t *
function rtree_delete_subtree (line 61) | static void
function rtree_delete (line 78) | void
function rtree_prefork (line 86) | void
function rtree_postfork_parent (line 93) | void
function rtree_postfork_child (line 100) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/stats.c
function stats_arena_bins_print (line 56) | static void
function stats_arena_lruns_print (line 158) | static void
function stats_arena_print (line 204) | static void
function stats_print (line 268) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/tcache.c
function tcache_salloc (line 21) | size_t tcache_salloc(const void *ptr)
function tcache_event_hard (line 27) | void
function tcache_bin_flush_small (line 81) | void
function tcache_bin_flush_large (line 162) | void
function tcache_arena_associate (line 241) | void
function tcache_arena_dissociate (line 255) | void
function tcache_t (line 268) | tcache_t *
function tcache_destroy (line 315) | void
function tcache_thread_cleanup (line 372) | void
function tcache_stats_merge (line 403) | void
function tcache_boot0 (line 429) | bool
function tcache_boot1 (line 471) | bool
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/tsd.c
function malloc_tsd_dalloc (line 20) | void
function malloc_tsd_no_cleanup (line 27) | void
function _malloc_thread_cleanup (line 38) | void
function malloc_tsd_cleanup_register (line 60) | void
function malloc_tsd_boot (line 69) | void
function BOOL (line 77) | static BOOL WINAPI
function tsd_init_finish (line 133) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/util.c
function wrtmessage (line 43) | static void
function malloc_write (line 65) | void
function buferror (line 79) | int
function uintmax_t (line 99) | uintmax_t
function malloc_vsnprintf (line 309) | int
function malloc_cprintf (line 627) | void
function malloc_printf (line 640) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/src/zone.c
type malloc_introspection_t (line 17) | struct malloc_introspection_t
function zone_size (line 46) | static size_t
function zone_free (line 86) | static void
function zone_free_definite_size (line 121) | static void
function zone_good_size (line 144) | static size_t
function zone_force_lock (line 153) | static void
function zone_force_unlock (line 161) | static void
function register_zone (line 169) | JEMALLOC_ATTR(constructor)
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/SFMT-alti.h
function vec_recursion (line 64) | unsigned int vec_recursion(vector unsigned int a,
function JEMALLOC_INLINE (line 98) | JEMALLOC_INLINE void gen_rand_all(sfmt_t *ctx) {
function JEMALLOC_INLINE (line 125) | JEMALLOC_INLINE void gen_rand_array(sfmt_t *ctx, w128_t *array, int size) {
function JEMALLOC_INLINE (line 176) | JEMALLOC_INLINE void swap(w128_t *array, int size) {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/SFMT-sse2.h
function JEMALLOC_ALWAYS_INLINE (line 63) | JEMALLOC_ALWAYS_INLINE __m128i mm_recursion(__m128i *a, __m128i *b,
function JEMALLOC_INLINE (line 84) | JEMALLOC_INLINE void gen_rand_all(sfmt_t *ctx) {
function JEMALLOC_INLINE (line 114) | JEMALLOC_INLINE void gen_rand_array(sfmt_t *ctx, w128_t *array, int size) {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/SFMT.h
type sfmt_t (line 69) | typedef struct sfmt_s sfmt_t;
function JEMALLOC_INLINE (line 100) | JEMALLOC_INLINE double to_real1(uint32_t v)
function JEMALLOC_INLINE (line 107) | JEMALLOC_INLINE double genrand_real1(sfmt_t *ctx)
function JEMALLOC_INLINE (line 113) | JEMALLOC_INLINE double to_real2(uint32_t v)
function JEMALLOC_INLINE (line 120) | JEMALLOC_INLINE double genrand_real2(sfmt_t *ctx)
function JEMALLOC_INLINE (line 126) | JEMALLOC_INLINE double to_real3(uint32_t v)
function JEMALLOC_INLINE (line 133) | JEMALLOC_INLINE double genrand_real3(sfmt_t *ctx)
function JEMALLOC_INLINE (line 140) | JEMALLOC_INLINE double to_res53(uint64_t v)
function JEMALLOC_INLINE (line 147) | JEMALLOC_INLINE double to_res53_mix(uint32_t x, uint32_t y)
function JEMALLOC_INLINE (line 154) | JEMALLOC_INLINE double genrand_res53(sfmt_t *ctx)
function JEMALLOC_INLINE (line 162) | JEMALLOC_INLINE double genrand_res53_mix(sfmt_t *ctx)
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/math.h
function JEMALLOC_INLINE (line 18) | JEMALLOC_INLINE double
function JEMALLOC_INLINE (line 53) | JEMALLOC_INLINE double
function JEMALLOC_INLINE (line 134) | JEMALLOC_INLINE double
function JEMALLOC_INLINE (line 221) | JEMALLOC_INLINE double
function JEMALLOC_INLINE (line 305) | JEMALLOC_INLINE double
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/mtx.h
type mtx_t (line 8) | typedef struct {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/test.h
type test_status_t (line 289) | typedef enum {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/include/test/thd.h
type HANDLE (line 3) | typedef HANDLE thd_t;
type pthread_t (line 5) | typedef pthread_t thd_t;
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/MALLOCX_ARENA.c
function TEST_BEGIN (line 37) | TEST_BEGIN(test_ALLOCM_ARENA)
function TEST_END (line 50) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/aligned_alloc.c
function TEST_BEGIN (line 8) | TEST_BEGIN(test_alignment_errors)
function TEST_END (line 28) | TEST_END
function TEST_END (line 73) | TEST_END
function TEST_END (line 115) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/allocated.c
function TEST_BEGIN (line 98) | TEST_BEGIN(test_main_thread)
function TEST_END (line 103) | TEST_END
function TEST_END (line 112) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/allocm.c
function TEST_BEGIN (line 7) | TEST_BEGIN(test_basic)
function TEST_END (line 39) | TEST_END
function TEST_END (line 98) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/mallocx.c
function TEST_BEGIN (line 7) | TEST_BEGIN(test_basic)
function TEST_END (line 34) | TEST_END
function TEST_END (line 88) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/mremap.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_mremap)
function TEST_END (line 37) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/posix_memalign.c
function TEST_BEGIN (line 8) | TEST_BEGIN(test_alignment_errors)
function TEST_END (line 26) | TEST_END
function TEST_END (line 65) | TEST_END
function TEST_END (line 109) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/rallocm.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_same_size)
function TEST_END (line 20) | TEST_END
function TEST_END (line 39) | TEST_END
function TEST_END (line 58) | TEST_END
function TEST_END (line 100) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/rallocx.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_grow_and_shrink)
function TEST_END (line 46) | TEST_END
function TEST_BEGIN (line 67) | TEST_BEGIN(test_zero)
function TEST_END (line 109) | TEST_END
function TEST_END (line 134) | TEST_END
function TEST_END (line 171) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/thread_arena.c
function TEST_BEGIN (line 40) | TEST_BEGIN(test_thread_arena)
function TEST_END (line 71) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/thread_tcache_enabled.c
function TEST_BEGIN (line 86) | TEST_BEGIN(test_main_thread)
function TEST_END (line 91) | TEST_END
function TEST_END (line 100) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/integration/xallocx.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_same_size)
function TEST_END (line 17) | TEST_END
function TEST_END (line 33) | TEST_END
function TEST_END (line 49) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/src/SFMT.c
type w128_t (line 77) | typedef union W128_T w128_t;
type w128_t (line 86) | typedef union W128_T w128_t;
type W128_T (line 91) | struct W128_T {
type w128_t (line 95) | typedef struct W128_T w128_t;
type sfmt_s (line 99) | struct sfmt_s {
function JEMALLOC_INLINE_C (line 145) | JEMALLOC_INLINE_C int idxof(int i) {
function JEMALLOC_INLINE_C (line 149) | JEMALLOC_INLINE_C int idxof(int i) {
function JEMALLOC_INLINE_C (line 163) | JEMALLOC_INLINE_C void rshift128(w128_t *out, w128_t const *in, int shif...
function JEMALLOC_INLINE_C (line 178) | JEMALLOC_INLINE_C void rshift128(w128_t *out, w128_t const *in, int shif...
function JEMALLOC_INLINE_C (line 202) | JEMALLOC_INLINE_C void lshift128(w128_t *out, w128_t const *in, int shif...
function JEMALLOC_INLINE_C (line 217) | JEMALLOC_INLINE_C void lshift128(w128_t *out, w128_t const *in, int shif...
function JEMALLOC_INLINE_C (line 244) | JEMALLOC_INLINE_C void do_recursion(w128_t *r, w128_t *a, w128_t *b, w12...
function JEMALLOC_INLINE_C (line 261) | JEMALLOC_INLINE_C void do_recursion(w128_t *r, w128_t *a, w128_t *b, w12...
function JEMALLOC_INLINE_C (line 285) | JEMALLOC_INLINE_C void gen_rand_all(sfmt_t *ctx) {
function JEMALLOC_INLINE_C (line 312) | JEMALLOC_INLINE_C void gen_rand_array(sfmt_t *ctx, w128_t *array, int si...
function JEMALLOC_INLINE_C (line 346) | JEMALLOC_INLINE_C void swap(w128_t *array, int size) {
function func1 (line 366) | static uint32_t func1(uint32_t x) {
function func2 (line 376) | static uint32_t func2(uint32_t x) {
function period_certification (line 383) | static void period_certification(sfmt_t *ctx) {
function get_min_array_size32 (line 428) | int get_min_array_size32(void) {
function get_min_array_size64 (line 437) | int get_min_array_size64(void) {
function gen_rand32 (line 447) | uint32_t gen_rand32(sfmt_t *ctx) {
function gen_rand32_range (line 461) | uint32_t gen_rand32_range(sfmt_t *ctx, uint32_t limit) {
function gen_rand64 (line 482) | uint64_t gen_rand64(sfmt_t *ctx) {
function gen_rand64_range (line 511) | uint64_t gen_rand64_range(sfmt_t *ctx, uint64_t limit) {
function fill_array32 (line 551) | void fill_array32(sfmt_t *ctx, uint32_t *array, int size) {
function fill_array64 (line 587) | void fill_array64(sfmt_t *ctx, uint64_t *array, int size) {
function sfmt_t (line 607) | sfmt_t *init_gen_rand(uint32_t seed) {
function sfmt_t (line 638) | sfmt_t *init_by_array(uint32_t *init_key, int key_length) {
function fini_gen_rand (line 714) | void fini_gen_rand(sfmt_t *ctx) {
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/src/mtx.c
function mtx_init (line 3) | bool
function mtx_fini (line 27) | void
function mtx_lock (line 38) | void
function mtx_unlock (line 51) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/src/test.c
function test_skip (line 9) | void
function test_fail (line 22) | void
function p_test_init (line 46) | void
function p_test_fini (line 55) | void
function test_status_t (line 63) | test_status_t
function p_test_fail (line 88) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/src/thd.c
function thd_create (line 4) | void
function thd_join (line 13) | void
function thd_create (line 21) | void
function thd_join (line 29) | void
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/SFMT.c
function TEST_BEGIN (line 1452) | TEST_BEGIN(test_gen_rand_32)
function TEST_END (line 1485) | TEST_END
function TEST_END (line 1521) | TEST_END
function TEST_END (line 1557) | TEST_END
function TEST_END (line 1594) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/bitmap.c
function TEST_BEGIN (line 9) | TEST_BEGIN(test_bitmap_size)
function TEST_END (line 21) | TEST_END
function TEST_END (line 44) | TEST_END
function TEST_END (line 67) | TEST_END
function TEST_END (line 96) | TEST_END
function TEST_END (line 153) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/ckh.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_new_delete)
function TEST_END (line 15) | TEST_END
function TEST_END (line 100) | TEST_END
function TEST_END (line 196) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/hash.c
type hash_variant_t (line 32) | typedef enum {
function hash_variant_bits (line 38) | static size_t
function hash_variant_verify (line 62) | static void
function TEST_BEGIN (line 142) | TEST_BEGIN(test_hash_x86_32)
function TEST_END (line 147) | TEST_END
function TEST_END (line 154) | TEST_END
function TEST_END (line 161) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/junk.c
function arena_dalloc_junk_small_intercept (line 13) | static void
function arena_dalloc_junk_large_intercept (line 27) | static void
function huge_dalloc_junk_intercept (line 41) | static void
function test_junk (line 54) | static void
function TEST_BEGIN (line 113) | TEST_BEGIN(test_junk_small)
function TEST_END (line 119) | TEST_END
function TEST_END (line 127) | TEST_END
function arena_ralloc_junk_large_intercept (line 140) | static void
function TEST_BEGIN (line 150) | TEST_BEGIN(test_junk_large_ralloc_shrink)
function arena_redzone_corruption_replacement (line 172) | static void
function TEST_BEGIN (line 180) | TEST_BEGIN(test_junk_redzone)
function TEST_END (line 210) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/mallctl.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_mallctl_errors)
function TEST_END (line 27) | TEST_END
function TEST_END (line 38) | TEST_END
function TEST_END (line 73) | TEST_END
function TEST_END (line 100) | TEST_END
function TEST_END (line 115) | TEST_END
function TEST_END (line 147) | TEST_END
function TEST_END (line 190) | TEST_END
function TEST_END (line 215) | TEST_END
function TEST_END (line 232) | TEST_END
function TEST_END (line 252) | TEST_END
function TEST_END (line 268) | TEST_END
function TEST_END (line 280) | TEST_END
function TEST_END (line 297) | TEST_END
function TEST_END (line 317) | TEST_END
function TEST_END (line 336) | TEST_END
function TEST_END (line 353) | TEST_END
function TEST_END (line 371) | TEST_END
function TEST_END (line 390) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/math.c
function double_eq_rel (line 6) | static bool
function factorial (line 17) | static uint64_t
function TEST_BEGIN (line 29) | TEST_BEGIN(test_ln_gamma_factorial)
function TEST_BEGIN (line 181) | TEST_BEGIN(test_ln_gamma_misc)
function TEST_BEGIN (line 232) | TEST_BEGIN(test_pt_norm)
function TEST_BEGIN (line 282) | TEST_BEGIN(test_pt_chi2)
function TEST_BEGIN (line 344) | TEST_BEGIN(test_pt_gamma_shape)
function TEST_END (line 362) | TEST_END
function TEST_END (line 375) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/mq.c
type mq_msg_t (line 6) | typedef struct mq_msg_s mq_msg_t;
type mq_msg_s (line 7) | struct mq_msg_s {
function TEST_BEGIN (line 12) | TEST_BEGIN(test_mq_basic)
function TEST_END (line 31) | TEST_END
function TEST_BEGIN (line 64) | TEST_BEGIN(test_mq_threaded)
function TEST_END (line 83) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/mtx.c
function TEST_BEGIN (line 6) | TEST_BEGIN(test_mtx_basic)
function TEST_END (line 15) | TEST_END
function TEST_BEGIN (line 36) | TEST_BEGIN(test_mtx_race)
function TEST_END (line 51) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/prof_accum.c
function prof_dump_open_intercept (line 8) | static int
function TEST_BEGIN (line 56) | TEST_BEGIN(test_idump)
function TEST_END (line 78) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/prof_gdump.c
function prof_dump_open_intercept (line 9) | static int
function TEST_BEGIN (line 22) | TEST_BEGIN(test_gdump)
function TEST_END (line 48) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/prof_idump.c
function prof_dump_open_intercept (line 11) | static int
function TEST_BEGIN (line 24) | TEST_BEGIN(test_idump)
function TEST_END (line 43) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/ql.c
type list_t (line 6) | typedef struct list_s list_t;
type list_head_t (line 7) | typedef ql_head(list_t) list_head_t;
type list_s (line 9) | struct list_s {
function test_empty_list (line 14) | static void
function TEST_BEGIN (line 37) | TEST_BEGIN(test_ql_empty)
function TEST_END (line 44) | TEST_END
function test_entries_list (line 57) | static void
function TEST_BEGIN (line 94) | TEST_BEGIN(test_ql_tail_insert)
function TEST_END (line 107) | TEST_END
function TEST_END (line 126) | TEST_END
function TEST_END (line 141) | TEST_END
function TEST_END (line 160) | TEST_END
function TEST_END (line 196) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/qr.c
type ring_t (line 8) | typedef struct ring_s ring_t;
type ring_s (line 10) | struct ring_s {
function init_entries (line 15) | static void
function test_independent_entries (line 26) | static void
function TEST_BEGIN (line 64) | TEST_BEGIN(test_qr_one)
function TEST_END (line 71) | TEST_END
function TEST_BEGIN (line 107) | TEST_BEGIN(test_qr_after_insert)
function TEST_END (line 117) | TEST_END
function TEST_END (line 146) | TEST_END
function TEST_END (line 184) | TEST_END
function TEST_BEGIN (line 209) | TEST_BEGIN(test_qr_meld_split)
function TEST_END (line 236) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/quarantine.c
function quarantine_clear (line 12) | void
function TEST_BEGIN (line 22) | TEST_BEGIN(test_quarantine)
function arena_redzone_corruption_replacement (line 61) | static void
function TEST_BEGIN (line 69) | TEST_BEGIN(test_quarantine_redzone)
function TEST_END (line 99) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/rb.c
type node_t (line 14) | typedef struct node_s node_t;
type node_s (line 16) | struct node_s {
function node_cmp (line 23) | static int
type tree_t (line 42) | typedef rb_tree(node_t) tree_t;
function TEST_BEGIN (line 45) | TEST_BEGIN(test_rb_empty)
function TEST_END (line 67) | TEST_END
function node_t (line 108) | static node_t *
function tree_iterate (line 136) | static unsigned
function tree_iterate_reverse (line 147) | static unsigned
function node_remove (line 158) | static void
function node_t (line 192) | static node_t *
function node_t (line 203) | static node_t *
function TEST_BEGIN (line 214) | TEST_BEGIN(test_rb_random)
function TEST_END (line 324) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/rtree.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_rtree_get_empty)
function TEST_END (line 14) | TEST_END
function TEST_END (line 34) | TEST_END
function TEST_END (line 65) | TEST_END
function TEST_END (line 107) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/stats.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_stats_summary)
function TEST_END (line 30) | TEST_END
function TEST_END (line 56) | TEST_END
function TEST_END (line 91) | TEST_END
function TEST_END (line 139) | TEST_END
function no_lazy_lock (line 148) | static void
function TEST_BEGIN (line 157) | TEST_BEGIN(test_stats_arenas_small)
function TEST_END (line 204) | TEST_END
function TEST_END (line 248) | TEST_END
function TEST_END (line 321) | TEST_END
function TEST_END (line 365) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/tsd.c
type data_t (line 5) | typedef unsigned int data_t;
function data_cleanup (line 9) | void
function TEST_BEGIN (line 43) | TEST_BEGIN(test_tsd_main_thread)
function TEST_END (line 48) | TEST_END
function TEST_END (line 60) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/util.c
function TEST_BEGIN (line 3) | TEST_BEGIN(test_pow2_ceil)
function TEST_END (line 32) | TEST_END
function TEST_END (line 43) | TEST_END
function TEST_END (line 136) | TEST_END
function TEST_END (line 169) | TEST_END
function TEST_END (line 282) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/jemalloc/test/unit/zero.c
function test_zero (line 8) | static void
function TEST_BEGIN (line 46) | TEST_BEGIN(test_zero_small)
function TEST_END (line 52) | TEST_END
function TEST_END (line 60) | TEST_END
function TEST_END (line 68) | TEST_END
FILE: extern/deprecated/redis-2.8.21/deps/linenoise/example.c
function completion (line 7) | void completion(const char *buf, linenoiseCompletions *lc) {
function main (line 14) | int main(int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/linenoise/linenoise.c
type termios (line 124) | struct termios
type linenoiseState (line 135) | struct linenoiseState {
type KEY_ACTION (line 150) | enum KEY_ACTION{
type linenoiseState (line 174) | struct linenoiseState
function linenoiseSetMultiLine (line 198) | void linenoiseSetMultiLine(int ml) {
function isUnsupportedTerm (line 204) | static int isUnsupportedTerm(void) {
function enableRawMode (line 215) | static int enableRawMode(int fd) {
function disableRawMode (line 250) | static void disableRawMode(int fd) {
function getCursorPosition (line 259) | static int getCursorPosition(int ifd, int ofd) {
function getColumns (line 283) | static int getColumns(int ifd, int ofd) {
function linenoiseClearScreen (line 317) | void linenoiseClearScreen(void) {
function linenoiseBeep (line 325) | static void linenoiseBeep(void) {
function freeCompletions (line 333) | static void freeCompletions(linenoiseCompletions *lc) {
function completeLine (line 347) | static int completeLine(struct linenoiseState *ls) {
function linenoiseSetCompletionCallback (line 406) | void linenoiseSetCompletionCallback(linenoiseCompletionCallback *fn) {
function linenoiseAddCompletion (line 414) | void linenoiseAddCompletion(linenoiseCompletions *lc, const char *str) {
type abuf (line 436) | struct abuf {
function abInit (line 441) | static void abInit(struct abuf *ab) {
function abAppend (line 446) | static void abAppend(struct abuf *ab, const char *s, int len) {
function abFree (line 455) | static void abFree(struct abuf *ab) {
function refreshSingleLine (line 463) | static void refreshSingleLine(struct linenoiseState *l) {
function refreshMultiLine (line 502) | static void refreshMultiLine(struct linenoiseState *l) {
function refreshLine (line 584) | static void refreshLine(struct linenoiseState *l) {
function linenoiseEditInsert (line 594) | int linenoiseEditInsert(struct linenoiseState *l, char c) {
function linenoiseEditMoveLeft (line 621) | void linenoiseEditMoveLeft(struct linenoiseState *l) {
function linenoiseEditMoveRight (line 629) | void linenoiseEditMoveRight(struct linenoiseState *l) {
function linenoiseEditMoveHome (line 637) | void linenoiseEditMoveHome(struct linenoiseState *l) {
function linenoiseEditMoveEnd (line 645) | void linenoiseEditMoveEnd(struct linenoiseState *l) {
function linenoiseEditHistoryNext (line 656) | void linenoiseEditHistoryNext(struct linenoiseState *l, int dir) {
function linenoiseEditDelete (line 680) | void linenoiseEditDelete(struct linenoiseState *l) {
function linenoiseEditBackspace (line 690) | void linenoiseEditBackspace(struct linenoiseState *l) {
function linenoiseEditDeletePrevWord (line 702) | void linenoiseEditDeletePrevWord(struct linenoiseState *l) {
function linenoiseEdit (line 724) | static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t ...
function linenoisePrintKeyCodes (line 903) | void linenoisePrintKeyCodes(void) {
function linenoiseRaw (line 930) | static int linenoiseRaw(char *buf, size_t buflen, const char *prompt) {
function freeHistory (line 987) | static void freeHistory(void) {
function linenoiseAtExit (line 998) | static void linenoiseAtExit(void) {
function linenoiseHistoryAdd (line 1010) | int linenoiseHistoryAdd(const char *line) {
function linenoiseHistorySetMaxLen (line 1043) | int linenoiseHistorySetMaxLen(int len) {
function linenoiseHistorySave (line 1073) | int linenoiseHistorySave(const char *filename) {
function linenoiseHistoryLoad (line 1089) | int linenoiseHistoryLoad(const char *filename) {
FILE: extern/deprecated/redis-2.8.21/deps/linenoise/linenoise.h
type linenoiseCompletions (line 44) | typedef struct linenoiseCompletions {
FILE: extern/deprecated/redis-2.8.21/deps/lua/etc/min.c
function print (line 12) | static int print(lua_State *L)
function main (line 32) | int main(void)
FILE: extern/deprecated/redis-2.8.21/deps/lua/etc/noparser.c
function LUAI_FUNC (line 21) | LUAI_FUNC void luaX_init (lua_State *L) {
function LUAI_FUNC (line 25) | LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const...
function LUAI_FUNC (line 37) | LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, voi...
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/fpconv.c
function fpconv_update_locale (line 52) | static void fpconv_update_locale()
function valid_number_character (line 75) | static inline int valid_number_character(char ch)
function strtod_buffer_size (line 94) | static int strtod_buffer_size(const char *s)
function fpconv_strtod (line 106) | double fpconv_strtod(const char *nptr, char **endptr)
function set_number_format (line 153) | static void set_number_format(char *fmt, int precision)
function fpconv_g_fmt (line 174) | int fpconv_g_fmt(char *str, double num, int precision)
function fpconv_init (line 199) | void fpconv_init()
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/fpconv.h
function fpconv_init (line 10) | static inline void fpconv_init()
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lapi.c
function TValue (line 49) | static TValue *index2adr (lua_State *L, int idx) {
function Table (line 79) | static Table *getcurrenv (lua_State *L) {
function luaA_pushobject (line 89) | void luaA_pushobject (lua_State *L, const TValue *o) {
function LUA_API (line 95) | LUA_API int lua_checkstack (lua_State *L, int size) {
function LUA_API (line 110) | LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
function LUA_API (line 125) | LUA_API void lua_setlevel (lua_State *from, lua_State *to) {
function LUA_API (line 130) | LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
function LUA_API (line 140) | LUA_API lua_State *lua_newthread (lua_State *L) {
function LUA_API (line 159) | LUA_API int lua_gettop (lua_State *L) {
function LUA_API (line 164) | LUA_API void lua_settop (lua_State *L, int idx) {
function LUA_API (line 180) | LUA_API void lua_remove (lua_State *L, int idx) {
function LUA_API (line 191) | LUA_API void lua_insert (lua_State *L, int idx) {
function LUA_API (line 203) | LUA_API void lua_replace (lua_State *L, int idx) {
function LUA_API (line 228) | LUA_API void lua_pushvalue (lua_State *L, int idx) {
function LUA_API (line 242) | LUA_API int lua_type (lua_State *L, int idx) {
function LUA_API (line 248) | LUA_API const char *lua_typename (lua_State *L, int t) {
function LUA_API (line 254) | LUA_API int lua_iscfunction (lua_State *L, int idx) {
function LUA_API (line 260) | LUA_API int lua_isnumber (lua_State *L, int idx) {
function LUA_API (line 267) | LUA_API int lua_isstring (lua_State *L, int idx) {
function LUA_API (line 273) | LUA_API int lua_isuserdata (lua_State *L, int idx) {
function LUA_API (line 279) | LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
function LUA_API (line 287) | LUA_API int lua_equal (lua_State *L, int index1, int index2) {
function LUA_API (line 299) | LUA_API int lua_lessthan (lua_State *L, int index1, int index2) {
function LUA_API (line 313) | LUA_API lua_Number lua_tonumber (lua_State *L, int idx) {
function LUA_API (line 323) | LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) {
function LUA_API (line 337) | LUA_API int lua_toboolean (lua_State *L, int idx) {
function LUA_API (line 343) | LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
function LUA_API (line 361) | LUA_API size_t lua_objlen (lua_State *L, int idx) {
function LUA_API (line 379) | LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) {
function LUA_API (line 385) | LUA_API void *lua_touserdata (lua_State *L, int idx) {
function LUA_API (line 395) | LUA_API lua_State *lua_tothread (lua_State *L, int idx) {
function LUA_API (line 401) | LUA_API const void *lua_topointer (lua_State *L, int idx) {
function LUA_API (line 421) | LUA_API void lua_pushnil (lua_State *L) {
function LUA_API (line 429) | LUA_API void lua_pushnumber (lua_State *L, lua_Number n) {
function LUA_API (line 437) | LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) {
function LUA_API (line 445) | LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) {
function LUA_API (line 454) | LUA_API void lua_pushstring (lua_State *L, const char *s) {
function LUA_API (line 462) | LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt,
function LUA_API (line 473) | LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {
function LUA_API (line 486) | LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) {
function LUA_API (line 503) | LUA_API void lua_pushboolean (lua_State *L, int b) {
function LUA_API (line 511) | LUA_API void lua_pushlightuserdata (lua_State *L, void *p) {
function LUA_API (line 519) | LUA_API int lua_pushthread (lua_State *L) {
function LUA_API (line 534) | LUA_API void lua_gettable (lua_State *L, int idx) {
function LUA_API (line 544) | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) {
function LUA_API (line 557) | LUA_API void lua_rawget (lua_State *L, int idx) {
function LUA_API (line 567) | LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
function LUA_API (line 578) | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) {
function LUA_API (line 587) | LUA_API int lua_getmetatable (lua_State *L, int objindex) {
function LUA_API (line 616) | LUA_API void lua_getfenv (lua_State *L, int idx) {
function LUA_API (line 645) | LUA_API void lua_settable (lua_State *L, int idx) {
function LUA_API (line 657) | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) {
function LUA_API (line 671) | LUA_API void lua_rawset (lua_State *L, int idx) {
function LUA_API (line 684) | LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
function LUA_API (line 697) | LUA_API int lua_setmetatable (lua_State *L, int objindex) {
function LUA_API (line 734) | LUA_API int lua_setfenv (lua_State *L, int idx) {
function LUA_API (line 776) | LUA_API void lua_call (lua_State *L, int nargs, int nresults) {
type CallS (line 792) | struct CallS { /* data to `f_call' */
function f_call (line 798) | static void f_call (lua_State *L, void *ud) {
function LUA_API (line 805) | LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfun...
type CCallS (line 831) | struct CCallS { /* data to `f_Ccall' */
function f_Ccall (line 837) | static void f_Ccall (lua_State *L, void *ud) {
function LUA_API (line 850) | LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) {
function LUA_API (line 862) | LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data,
function LUA_API (line 875) | LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) {
function LUA_API (line 890) | LUA_API int lua_status (lua_State *L) {
function LUA_API (line 899) | LUA_API int lua_gc (lua_State *L, int what, int data) {
function LUA_API (line 964) | LUA_API int lua_error (lua_State *L) {
function LUA_API (line 973) | LUA_API int lua_next (lua_State *L, int idx) {
function LUA_API (line 990) | LUA_API void lua_concat (lua_State *L, int n) {
function LUA_API (line 1007) | LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) {
function LUA_API (line 1017) | LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) {
function LUA_API (line 1025) | LUA_API void *lua_newuserdata (lua_State *L, size_t size) {
function LUA_API (line 1057) | LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
function LUA_API (line 1071) | LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lauxlib.c
function LUALIB_API (line 43) | LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extram...
function LUALIB_API (line 61) | LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) {
function tag_error (line 68) | static void tag_error (lua_State *L, int narg, int tag) {
function LUALIB_API (line 73) | LUALIB_API void luaL_where (lua_State *L, int level) {
function LUALIB_API (line 86) | LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
function LUALIB_API (line 99) | LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def,
function LUALIB_API (line 112) | LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) {
function LUALIB_API (line 124) | LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tnam...
function LUALIB_API (line 140) | LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *me...
function LUALIB_API (line 146) | LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) {
function LUALIB_API (line 152) | LUALIB_API void luaL_checkany (lua_State *L, int narg) {
function LUALIB_API (line 158) | LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t...
function LUALIB_API (line 165) | LUALIB_API const char *luaL_optlstring (lua_State *L, int narg,
function LUALIB_API (line 176) | LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) {
function LUALIB_API (line 184) | LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number...
function LUALIB_API (line 189) | LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) {
function LUALIB_API (line 197) | LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg,
function LUALIB_API (line 203) | LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *eve...
function LUALIB_API (line 219) | LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) {
function LUALIB_API (line 229) | LUALIB_API void (luaL_register) (lua_State *L, const char *libname,
function libsize (line 235) | static int libsize (const luaL_Reg *l) {
function LUALIB_API (line 242) | LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
function checkint (line 280) | static int checkint (lua_State *L, int topop) {
function getsizes (line 287) | static void getsizes (lua_State *L) {
function LUALIB_API (line 302) | LUALIB_API void luaL_setn (lua_State *L, int t, int n) {
function LUALIB_API (line 321) | LUALIB_API int luaL_getn (lua_State *L, int t) {
function LUALIB_API (line 340) | LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const cha...
function LUALIB_API (line 357) | LUALIB_API const char *luaL_findtable (lua_State *L, int idx,
function emptybuffer (line 398) | static int emptybuffer (luaL_Buffer *B) {
function adjuststack (line 410) | static void adjuststack (luaL_Buffer *B) {
function LUALIB_API (line 429) | LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) {
function LUALIB_API (line 436) | LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) {
function LUALIB_API (line 442) | LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) {
function LUALIB_API (line 447) | LUALIB_API void luaL_pushresult (luaL_Buffer *B) {
function LUALIB_API (line 454) | LUALIB_API void luaL_addvalue (luaL_Buffer *B) {
function LUALIB_API (line 472) | LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) {
function LUALIB_API (line 481) | LUALIB_API int luaL_ref (lua_State *L, int t) {
function LUALIB_API (line 504) | LUALIB_API void luaL_unref (lua_State *L, int t, int ref) {
type LoadF (line 522) | typedef struct LoadF {
function errfile (line 543) | static int errfile (lua_State *L, const char *what, int fnameindex) {
function LUALIB_API (line 552) | LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
type LoadS (line 593) | typedef struct LoadS {
function LUALIB_API (line 609) | LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t s...
function LUALIB_API (line 618) | LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) {
function panic (line 639) | static int panic (lua_State *L) {
function LUALIB_API (line 647) | LUALIB_API lua_State *luaL_newstate (void) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lauxlib.h
type luaL_Reg (line 35) | typedef struct luaL_Reg {
type luaL_Buffer (line 129) | typedef struct luaL_Buffer {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lbaselib.c
function luaB_print (line 31) | static int luaB_print (lua_State *L) {
function luaB_tonumber (line 53) | static int luaB_tonumber (lua_State *L) {
function luaB_error (line 81) | static int luaB_error (lua_State *L) {
function luaB_getmetatable (line 93) | static int luaB_getmetatable (lua_State *L) {
function luaB_setmetatable (line 104) | static int luaB_setmetatable (lua_State *L) {
function getfunc (line 117) | static void getfunc (lua_State *L, int opt) {
function luaB_getfenv (line 133) | static int luaB_getfenv (lua_State *L) {
function luaB_setfenv (line 143) | static int luaB_setfenv (lua_State *L) {
function luaB_rawequal (line 161) | static int luaB_rawequal (lua_State *L) {
function luaB_rawget (line 169) | static int luaB_rawget (lua_State *L) {
function luaB_rawset (line 177) | static int luaB_rawset (lua_State *L) {
function luaB_gcinfo (line 187) | static int luaB_gcinfo (lua_State *L) {
function luaB_collectgarbage (line 193) | static int luaB_collectgarbage (lua_State *L) {
function luaB_type (line 219) | static int luaB_type (lua_State *L) {
function luaB_next (line 226) | static int luaB_next (lua_State *L) {
function luaB_pairs (line 238) | static int luaB_pairs (lua_State *L) {
function ipairsaux (line 247) | static int ipairsaux (lua_State *L) {
function luaB_ipairs (line 257) | static int luaB_ipairs (lua_State *L) {
function load_aux (line 266) | static int load_aux (lua_State *L, int status) {
function luaB_loadstring (line 277) | static int luaB_loadstring (lua_State *L) {
function luaB_loadfile (line 285) | static int luaB_loadfile (lua_State *L) {
function luaB_load (line 315) | static int luaB_load (lua_State *L) {
function luaB_dofile (line 325) | static int luaB_dofile (lua_State *L) {
function luaB_assert (line 334) | static int luaB_assert (lua_State *L) {
function luaB_unpack (line 342) | static int luaB_unpack (lua_State *L) {
function luaB_select (line 358) | static int luaB_select (lua_State *L) {
function luaB_pcall (line 374) | static int luaB_pcall (lua_State *L) {
function luaB_xpcall (line 384) | static int luaB_xpcall (lua_State *L) {
function luaB_tostring (line 396) | static int luaB_tostring (lua_State *L) {
function luaB_newproxy (line 421) | static int luaB_newproxy (lua_State *L) {
function costatus (line 490) | static int costatus (lua_State *L, lua_State *co) {
function luaB_costatus (line 510) | static int luaB_costatus (lua_State *L) {
function auxresume (line 518) | static int auxresume (lua_State *L, lua_State *co, int narg) {
function luaB_coresume (line 543) | static int luaB_coresume (lua_State *L) {
function luaB_auxwrap (line 561) | static int luaB_auxwrap (lua_State *L) {
function luaB_cocreate (line 576) | static int luaB_cocreate (lua_State *L) {
function luaB_cowrap (line 586) | static int luaB_cowrap (lua_State *L) {
function luaB_yield (line 593) | static int luaB_yield (lua_State *L) {
function luaB_corunning (line 598) | static int luaB_corunning (lua_State *L) {
function auxopen (line 618) | static void auxopen (lua_State *L, const char *name,
function base_open (line 626) | static void base_open (lua_State *L) {
function LUALIB_API (line 648) | LUALIB_API int luaopen_base (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lcode.c
function isnumeral (line 30) | static int isnumeral(expdesc *e) {
function luaK_nil (line 35) | void luaK_nil (FuncState *fs, int from, int n) {
function luaK_jump (line 59) | int luaK_jump (FuncState *fs) {
function luaK_ret (line 69) | void luaK_ret (FuncState *fs, int first, int nret) {
function condjump (line 74) | static int condjump (FuncState *fs, OpCode op, int A, int B, int C) {
function fixjump (line 80) | static void fixjump (FuncState *fs, int pc, int dest) {
function luaK_getlabel (line 94) | int luaK_getlabel (FuncState *fs) {
function getjump (line 100) | static int getjump (FuncState *fs, int pc) {
function Instruction (line 109) | static Instruction *getjumpcontrol (FuncState *fs, int pc) {
function need_value (line 122) | static int need_value (FuncState *fs, int list) {
function patchtestreg (line 131) | static int patchtestreg (FuncState *fs, int node, int reg) {
function removevalues (line 144) | static void removevalues (FuncState *fs, int list) {
function patchlistaux (line 150) | static void patchlistaux (FuncState *fs, int list, int vtarget, int reg,
function dischargejpc (line 163) | static void dischargejpc (FuncState *fs) {
function luaK_patchlist (line 169) | void luaK_patchlist (FuncState *fs, int list, int target) {
function luaK_patchtohere (line 179) | void luaK_patchtohere (FuncState *fs, int list) {
function luaK_concat (line 185) | void luaK_concat (FuncState *fs, int *l1, int l2) {
function luaK_checkstack (line 199) | void luaK_checkstack (FuncState *fs, int n) {
function luaK_reserveregs (line 209) | void luaK_reserveregs (FuncState *fs, int n) {
function freereg (line 215) | static void freereg (FuncState *fs, int reg) {
function freeexp (line 223) | static void freeexp (FuncState *fs, expdesc *e) {
function addk (line 229) | static int addk (FuncState *fs, TValue *k, TValue *v) {
function luaK_stringK (line 250) | int luaK_stringK (FuncState *fs, TString *s) {
function luaK_numberK (line 257) | int luaK_numberK (FuncState *fs, lua_Number r) {
function boolK (line 264) | static int boolK (FuncState *fs, int b) {
function nilK (line 271) | static int nilK (FuncState *fs) {
function luaK_setreturns (line 280) | void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
function luaK_setoneret (line 292) | void luaK_setoneret (FuncState *fs, expdesc *e) {
function luaK_dischargevars (line 304) | void luaK_dischargevars (FuncState *fs, expdesc *e) {
function code_label (line 337) | static int code_label (FuncState *fs, int A, int b, int jump) {
function discharge2reg (line 343) | static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
function discharge2anyreg (line 382) | static void discharge2anyreg (FuncState *fs, expdesc *e) {
function exp2reg (line 390) | static void exp2reg (FuncState *fs, expdesc *e, int reg) {
function luaK_exp2nextreg (line 414) | void luaK_exp2nextreg (FuncState *fs, expdesc *e) {
function luaK_exp2anyreg (line 422) | int luaK_exp2anyreg (FuncState *fs, expdesc *e) {
function luaK_exp2val (line 436) | void luaK_exp2val (FuncState *fs, expdesc *e) {
function luaK_exp2RK (line 444) | int luaK_exp2RK (FuncState *fs, expdesc *e) {
function luaK_storevar (line 472) | void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) {
function luaK_self (line 503) | void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
function invertjump (line 516) | static void invertjump (FuncState *fs, expdesc *e) {
function jumponcond (line 524) | static int jumponcond (FuncState *fs, expdesc *e, int cond) {
function luaK_goiftrue (line 539) | void luaK_goiftrue (FuncState *fs, expdesc *e) {
function luaK_goiffalse (line 563) | static void luaK_goiffalse (FuncState *fs, expdesc *e) {
function codenot (line 586) | static void codenot (FuncState *fs, expdesc *e) {
function luaK_indexed (line 621) | void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
function constfolding (line 627) | static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
function codearith (line 653) | static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e...
function codecomp (line 673) | static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1,
function luaK_prefix (line 689) | void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
function luaK_infix (line 710) | void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
function luaK_posfix (line 737) | void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) {
function luaK_fixline (line 784) | void luaK_fixline (FuncState *fs, int line) {
function luaK_code (line 789) | static int luaK_code (FuncState *fs, Instruction i, int line) {
function luaK_codeABC (line 804) | int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) {
function luaK_codeABx (line 812) | int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) {
function luaK_setlist (line 819) | void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lcode.h
type BinOpr (line 26) | typedef enum BinOpr {
type UnOpr (line 36) | typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ldblib.c
function db_getregistry (line 22) | static int db_getregistry (lua_State *L) {
function db_getmetatable (line 28) | static int db_getmetatable (lua_State *L) {
function db_setmetatable (line 37) | static int db_setmetatable (lua_State *L) {
function db_getfenv (line 47) | static int db_getfenv (lua_State *L) {
function db_setfenv (line 54) | static int db_setfenv (lua_State *L) {
function settabss (line 64) | static void settabss (lua_State *L, const char *i, const char *v) {
function settabsi (line 70) | static void settabsi (lua_State *L, const char *i, int v) {
function lua_State (line 76) | static lua_State *getthread (lua_State *L, int *arg) {
function treatstackoption (line 88) | static void treatstackoption (lua_State *L, lua_State *L1, const char *f...
function db_getinfo (line 99) | static int db_getinfo (lua_State *L) {
function db_getlocal (line 144) | static int db_getlocal (lua_State *L) {
function db_setlocal (line 165) | static int db_setlocal (lua_State *L) {
function auxupvalue (line 179) | static int auxupvalue (lua_State *L, int get) {
function db_getupvalue (line 192) | static int db_getupvalue (lua_State *L) {
function db_setupvalue (line 197) | static int db_setupvalue (lua_State *L) {
function hookf (line 207) | static void hookf (lua_State *L, lua_Debug *ar) {
function makemask (line 225) | static int makemask (const char *smask, int count) {
function gethooktable (line 245) | static void gethooktable (lua_State *L) {
function db_sethook (line 258) | static int db_sethook (lua_State *L) {
function db_gethook (line 282) | static int db_gethook (lua_State *L) {
function db_debug (line 302) | static int db_debug (lua_State *L) {
function db_errorfb (line 322) | static int db_errorfb (lua_State *L) {
function LUALIB_API (line 394) | LUALIB_API int luaopen_debug (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ldebug.c
function currentpc (line 36) | static int currentpc (lua_State *L, CallInfo *ci) {
function currentline (line 44) | static int currentline (lua_State *L, CallInfo *ci) {
function LUA_API (line 56) | LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int coun...
function LUA_API (line 69) | LUA_API lua_Hook lua_gethook (lua_State *L) {
function LUA_API (line 74) | LUA_API int lua_gethookmask (lua_State *L) {
function LUA_API (line 79) | LUA_API int lua_gethookcount (lua_State *L) {
function LUA_API (line 84) | LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) {
function Proto (line 107) | static Proto *getluaproto (CallInfo *ci) {
function LUA_API (line 127) | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int...
function LUA_API (line 138) | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int...
function funcinfo (line 150) | static void funcinfo (lua_Debug *ar, Closure *cl) {
function info_tailcall (line 167) | static void info_tailcall (lua_Debug *ar) {
function collectvalidlines (line 177) | static void collectvalidlines (lua_State *L, Closure *f) {
function auxgetinfo (line 193) | static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
function LUA_API (line 232) | LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
function precheck (line 276) | static int precheck (const Proto *pt) {
function luaG_checkopenop (line 290) | int luaG_checkopenop (Instruction i) {
function checkArgMode (line 304) | static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) {
function Instruction (line 317) | static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
function luaG_checkcode (line 484) | int luaG_checkcode (const Proto *pt) {
function isinstack (line 559) | static int isinstack (CallInfo *ci, const TValue *o) {
function luaG_typeerror (line 567) | void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
function luaG_concaterror (line 581) | void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
function luaG_aritherror (line 588) | void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {
function luaG_ordererror (line 596) | int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
function addinfo (line 607) | static void addinfo (lua_State *L, const char *msg) {
function luaG_errormsg (line 618) | void luaG_errormsg (lua_State *L) {
function luaG_runerror (line 631) | void luaG_runerror (lua_State *L, const char *fmt, ...) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ldo.c
type lua_longjmp (line 44) | struct lua_longjmp {
function luaD_seterrorobj (line 51) | void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
function restore_stack_limit (line 71) | static void restore_stack_limit (lua_State *L) {
function resetstack (line 81) | static void resetstack (lua_State *L, int status) {
function luaD_throw (line 94) | void luaD_throw (lua_State *L, int errcode) {
function luaD_rawrunprotected (line 111) | int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
function correctstack (line 126) | static void correctstack (lua_State *L, TValue *oldstack) {
function luaD_reallocstack (line 141) | void luaD_reallocstack (lua_State *L, int newsize) {
function luaD_reallocCI (line 152) | void luaD_reallocCI (lua_State *L, int newsize) {
function luaD_growstack (line 161) | void luaD_growstack (lua_State *L, int n) {
function CallInfo (line 169) | static CallInfo *growCI (lua_State *L) {
function luaD_callhook (line 181) | void luaD_callhook (lua_State *L, int event, int line) {
function StkId (line 208) | static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
function StkId (line 244) | static StkId tryfuncTM (lua_State *L, StkId func) {
function luaD_precall (line 265) | int luaD_precall (lua_State *L, StkId func, int nresults) {
function StkId (line 332) | static StkId callrethooks (lua_State *L, StkId firstResult) {
function luaD_poscall (line 343) | int luaD_poscall (lua_State *L, StkId firstResult) {
function luaD_call (line 370) | void luaD_call (lua_State *L, StkId func, int nResults) {
function resume (line 384) | static void resume (lua_State *L, void *ud) {
function resume_error (line 409) | static int resume_error (lua_State *L, const char *msg) {
function LUA_API (line 418) | LUA_API int lua_resume (lua_State *L, int nargs) {
function LUA_API (line 444) | LUA_API int lua_yield (lua_State *L, int nresults) {
function luaD_pcall (line 456) | int luaD_pcall (lua_State *L, Pfunc func, void *u,
type SParser (line 485) | struct SParser { /* data to `f_parser' */
function f_parser (line 491) | static void f_parser (lua_State *L, void *ud) {
function luaD_protectedparser (line 509) | int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ldump.c
type DumpState (line 18) | typedef struct {
function DumpBlock (line 29) | static void DumpBlock(const void* b, size_t size, DumpState* D)
function DumpChar (line 39) | static void DumpChar(int y, DumpState* D)
function DumpInt (line 45) | static void DumpInt(int x, DumpState* D)
function DumpNumber (line 50) | static void DumpNumber(lua_Number x, DumpState* D)
function DumpVector (line 55) | static void DumpVector(const void* b, int n, size_t size, DumpState* D)
function DumpString (line 61) | static void DumpString(const TString* s, DumpState* D)
function DumpConstants (line 80) | static void DumpConstants(const Proto* f, DumpState* D)
function DumpDebug (line 111) | static void DumpDebug(const Proto* f, DumpState* D)
function DumpFunction (line 129) | static void DumpFunction(const Proto* f, const TString* p, DumpState* D)
function DumpHeader (line 143) | static void DumpHeader(DumpState* D)
function luaU_dump (line 153) | int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, i...
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lfunc.c
function Closure (line 23) | Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) {
function Closure (line 33) | Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) {
function UpVal (line 44) | UpVal *luaF_newupval (lua_State *L) {
function UpVal (line 53) | UpVal *luaF_findupval (lua_State *L, StkId level) {
function unlinkupval (line 82) | static void unlinkupval (UpVal *uv) {
function luaF_freeupval (line 89) | void luaF_freeupval (lua_State *L, UpVal *uv) {
function luaF_close (line 96) | void luaF_close (lua_State *L, StkId level) {
function Proto (line 115) | Proto *luaF_newproto (lua_State *L) {
function luaF_freeproto (line 141) | void luaF_freeproto (lua_State *L, Proto *f) {
function luaF_freeclosure (line 152) | void luaF_freeclosure (lua_State *L, Closure *c) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lgc.c
function removeentry (line 62) | static void removeentry (Node *n) {
function reallymarkobject (line 69) | static void reallymarkobject (global_State *g, GCObject *o) {
function marktmu (line 115) | static void marktmu (global_State *g) {
function luaC_separateudata (line 128) | size_t luaC_separateudata (lua_State *L, int all) {
function traversetable (line 158) | static int traversetable (global_State *g, Table *h) {
function traverseproto (line 203) | static void traverseproto (global_State *g, Proto *f) {
function traverseclosure (line 224) | static void traverseclosure (global_State *g, Closure *cl) {
function checkstacksizes (line 241) | static void checkstacksizes (lua_State *L, StkId max) {
function traversestack (line 256) | static void traversestack (global_State *g, lua_State *l) {
function l_mem (line 277) | static l_mem propagatemark (global_State *g) {
function propagateall (line 323) | static size_t propagateall (global_State *g) {
function iscleared (line 337) | static int iscleared (const TValue *o, int iskey) {
function cleartable (line 351) | static void cleartable (GCObject *l) {
function freeobj (line 378) | static void freeobj (lua_State *L, GCObject *o) {
function GCObject (line 407) | static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) {
function checkSizes (line 431) | static void checkSizes (lua_State *L) {
function GCTM (line 445) | static void GCTM (lua_State *L) {
function luaC_callGCTM (line 477) | void luaC_callGCTM (lua_State *L) {
function luaC_freeall (line 483) | void luaC_freeall (lua_State *L) {
function markmt (line 493) | static void markmt (global_State *g) {
function markroot (line 501) | static void markroot (lua_State *L) {
function remarkupvals (line 515) | static void remarkupvals (global_State *g) {
function atomic (line 525) | static void atomic (lua_State *L) {
function l_mem (line 556) | static l_mem singlestep (lua_State *L) {
function luaC_step (line 610) | void luaC_step (lua_State *L) {
function luaC_fullgc (line 635) | void luaC_fullgc (lua_State *L) {
function luaC_barrierf (line 661) | void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) {
function luaC_barrierback (line 674) | void luaC_barrierback (lua_State *L, Table *t) {
function luaC_link (line 685) | void luaC_link (lua_State *L, GCObject *o, lu_byte tt) {
function luaC_linkupval (line 694) | void luaC_linkupval (lua_State *L, UpVal *uv) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/linit.c
function LUALIB_API (line 30) | LUALIB_API void luaL_openlibs (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/liolib.c
function pushresult (line 30) | static int pushresult (lua_State *L, int i, const char *filename) {
function fileerror (line 48) | static void fileerror (lua_State *L, int arg, const char *filename) {
function io_type (line 57) | static int io_type (lua_State *L) {
function FILE (line 72) | static FILE *tofile (lua_State *L) {
function FILE (line 86) | static FILE **newfile (lua_State *L) {
function io_noclose (line 98) | static int io_noclose (lua_State *L) {
function io_pclose (line 108) | static int io_pclose (lua_State *L) {
function io_fclose (line 119) | static int io_fclose (lua_State *L) {
function aux_close (line 127) | static int aux_close (lua_State *L) {
function io_close (line 134) | static int io_close (lua_State *L) {
function io_gc (line 142) | static int io_gc (lua_State *L) {
function io_tostring (line 151) | static int io_tostring (lua_State *L) {
function io_open (line 161) | static int io_open (lua_State *L) {
function io_popen (line 174) | static int io_popen (lua_State *L) {
function io_tmpfile (line 183) | static int io_tmpfile (lua_State *L) {
function FILE (line 190) | static FILE *getiofile (lua_State *L, int findex) {
function g_iofile (line 200) | static int g_iofile (lua_State *L, int f, const char *mode) {
function io_input (line 221) | static int io_input (lua_State *L) {
function io_output (line 226) | static int io_output (lua_State *L) {
function aux_lines (line 234) | static void aux_lines (lua_State *L, int idx, int toclose) {
function f_lines (line 241) | static int f_lines (lua_State *L) {
function io_lines (line 248) | static int io_lines (lua_State *L) {
function read_number (line 273) | static int read_number (lua_State *L, FILE *f) {
function test_eof (line 286) | static int test_eof (lua_State *L, FILE *f) {
function read_line (line 294) | static int read_line (lua_State *L, FILE *f) {
function read_chars (line 316) | static int read_chars (lua_State *L, FILE *f, size_t n) {
function g_read (line 334) | static int g_read (lua_State *L, FILE *f, int first) {
function io_read (line 381) | static int io_read (lua_State *L) {
function f_read (line 386) | static int f_read (lua_State *L) {
function io_readline (line 391) | static int io_readline (lua_State *L) {
function g_write (line 413) | static int g_write (lua_State *L, FILE *f, int arg) {
function io_write (line 432) | static int io_write (lua_State *L) {
function f_write (line 437) | static int f_write (lua_State *L) {
function f_seek (line 442) | static int f_seek (lua_State *L) {
function f_setvbuf (line 458) | static int f_setvbuf (lua_State *L) {
function io_flush (line 470) | static int io_flush (lua_State *L) {
function f_flush (line 475) | static int f_flush (lua_State *L) {
function createmeta (line 510) | static void createmeta (lua_State *L) {
function createstdfile (line 518) | static void createstdfile (lua_State *L, FILE *f, int k, const char *fna...
function newfenv (line 530) | static void newfenv (lua_State *L, lua_CFunction cls) {
function LUALIB_API (line 537) | LUALIB_API int luaopen_io (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/llex.c
function save (line 51) | static void save (LexState *ls, int c) {
function luaX_init (line 64) | void luaX_init (lua_State *L) {
function luaX_lexerror (line 102) | void luaX_lexerror (LexState *ls, const char *msg, int token) {
function luaX_syntaxerror (line 112) | void luaX_syntaxerror (LexState *ls, const char *msg) {
function TString (line 117) | TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
function inclinenumber (line 129) | static void inclinenumber (LexState *ls) {
function luaX_setinput (line 140) | void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {
function check_next (line 163) | static int check_next (LexState *ls, const char *set) {
function buffreplace (line 171) | static void buffreplace (LexState *ls, char from, char to) {
function trydecpoint (line 179) | static void trydecpoint (LexState *ls, SemInfo *seminfo) {
function read_numeral (line 194) | static void read_numeral (LexState *ls, SemInfo *seminfo) {
function skip_sep (line 210) | static int skip_sep (LexState *ls) {
function read_long_string (line 223) | static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) {
function read_string (line 278) | static void read_string (LexState *ls, int del, SemInfo *seminfo) {
function llex (line 334) | static int llex (LexState *ls, SemInfo *seminfo) {
function luaX_next (line 448) | void luaX_next (LexState *ls) {
function luaX_lookahead (line 459) | void luaX_lookahead (LexState *ls) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/llex.h
type RESERVED (line 24) | enum RESERVED {
type SemInfo (line 43) | typedef union {
type Token (line 49) | typedef struct Token {
type LexState (line 55) | typedef struct LexState {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/llimits.h
type LUAI_UINT32 (line 18) | typedef LUAI_UINT32 lu_int32;
type LUAI_UMEM (line 20) | typedef LUAI_UMEM lu_mem;
type LUAI_MEM (line 22) | typedef LUAI_MEM l_mem;
type lu_byte (line 27) | typedef unsigned char lu_byte;
type LUAI_USER_ALIGNMENT_T (line 47) | typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
type LUAI_UACNUMBER (line 51) | typedef LUAI_UACNUMBER l_uacNumber;
type lu_int32 (line 88) | typedef lu_int32 Instruction;
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lmathlib.c
function math_abs (line 26) | static int math_abs (lua_State *L) {
function math_sin (line 31) | static int math_sin (lua_State *L) {
function math_sinh (line 36) | static int math_sinh (lua_State *L) {
function math_cos (line 41) | static int math_cos (lua_State *L) {
function math_cosh (line 46) | static int math_cosh (lua_State *L) {
function math_tan (line 51) | static int math_tan (lua_State *L) {
function math_tanh (line 56) | static int math_tanh (lua_State *L) {
function math_asin (line 61) | static int math_asin (lua_State *L) {
function math_acos (line 66) | static int math_acos (lua_State *L) {
function math_atan (line 71) | static int math_atan (lua_State *L) {
function math_atan2 (line 76) | static int math_atan2 (lua_State *L) {
function math_ceil (line 81) | static int math_ceil (lua_State *L) {
function math_floor (line 86) | static int math_floor (lua_State *L) {
function math_fmod (line 91) | static int math_fmod (lua_State *L) {
function math_modf (line 96) | static int math_modf (lua_State *L) {
function math_sqrt (line 104) | static int math_sqrt (lua_State *L) {
function math_pow (line 109) | static int math_pow (lua_State *L) {
function math_log (line 114) | static int math_log (lua_State *L) {
function math_log10 (line 119) | static int math_log10 (lua_State *L) {
function math_exp (line 124) | static int math_exp (lua_State *L) {
function math_deg (line 129) | static int math_deg (lua_State *L) {
function math_rad (line 134) | static int math_rad (lua_State *L) {
function math_frexp (line 139) | static int math_frexp (lua_State *L) {
function math_ldexp (line 146) | static int math_ldexp (lua_State *L) {
function math_min (line 153) | static int math_min (lua_State *L) {
function math_max (line 167) | static int math_max (lua_State *L) {
function math_random (line 181) | static int math_random (lua_State *L) {
function math_randomseed (line 209) | static int math_randomseed (lua_State *L) {
function LUALIB_API (line 251) | LUALIB_API int luaopen_math (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/loadlib.c
function ll_unloadlib (line 63) | static void ll_unloadlib (void *lib) {
function lua_CFunction (line 75) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
function setprogdir (line 97) | static void setprogdir (lua_State *L) {
function pusherror (line 112) | static void pusherror (lua_State *L) {
function ll_unloadlib (line 122) | static void ll_unloadlib (void *lib) {
function lua_CFunction (line 134) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
function pusherror (line 159) | static void pusherror (lua_State *L) {
function ll_unloadlib (line 186) | static void ll_unloadlib (void *lib) {
function lua_CFunction (line 212) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
function ll_unloadlib (line 239) | static void ll_unloadlib (void *lib) {
function lua_CFunction (line 251) | static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) {
function gctm (line 286) | static int gctm (lua_State *L) {
function ll_loadfunc (line 294) | static int ll_loadfunc (lua_State *L, const char *path, const char *sym) {
function ll_loadlib (line 309) | static int ll_loadlib (lua_State *L) {
function readable (line 332) | static int readable (const char *filename) {
function loaderror (line 374) | static void loaderror (lua_State *L, const char *filename) {
function loader_Lua (line 380) | static int loader_Lua (lua_State *L) {
function loader_C (line 402) | static int loader_C (lua_State *L) {
function loader_Croot (line 414) | static int loader_Croot (lua_State *L) {
function loader_preload (line 435) | static int loader_preload (lua_State *L) {
function ll_require (line 451) | static int ll_require (lua_State *L) {
function setfenv (line 507) | static void setfenv (lua_State *L) {
function dooptions (line 519) | static void dooptions (lua_State *L, int n) {
function modinit (line 529) | static void modinit (lua_State *L, const char *modname) {
function ll_module (line 544) | static int ll_module (lua_State *L) {
function ll_seeall (line 572) | static int ll_seeall (lua_State *L) {
function setpath (line 592) | static void setpath (lua_State *L, const char *fieldname, const char *en...
function LUALIB_API (line 627) | LUALIB_API int luaopen_package (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lobject.c
function luaO_int2fb (line 35) | int luaO_int2fb (unsigned int x) {
function luaO_fb2int (line 47) | int luaO_fb2int (int x) {
function luaO_log2 (line 54) | int luaO_log2 (unsigned int x) {
function luaO_rawequalObj (line 72) | int luaO_rawequalObj (const TValue *t1, const TValue *t2) {
function luaO_str2d (line 90) | int luaO_str2d (const char *s, lua_Number *result) {
function pushstr (line 104) | static void pushstr (lua_State *L, const char *str) {
function luaO_chunkid (line 182) | void luaO_chunkid (char *out, const char *source, size_t bufflen) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lobject.h
type GCObject (line 36) | typedef union GCObject GCObject;
type GCheader (line 49) | typedef struct GCheader {
type Value (line 59) | typedef union {
type TValue (line 73) | typedef struct lua_TValue {
type TValue (line 193) | typedef TValue *StkId;
type TString (line 199) | typedef union TString {
type Udata (line 215) | typedef union Udata {
type Proto (line 231) | typedef struct Proto {
type LocVar (line 262) | typedef struct LocVar {
type UpVal (line 274) | typedef struct UpVal {
type CClosure (line 295) | typedef struct CClosure {
type LClosure (line 302) | typedef struct LClosure {
type Closure (line 309) | typedef union Closure {
type TKey (line 323) | typedef union TKey {
type Node (line 332) | typedef struct Node {
type Table (line 338) | typedef struct Table {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lopcodes.h
type OpMode (line 31) | enum OpMode {iABC, iABx, iAsBx}
type OpCode (line 150) | typedef enum {
type OpArgMask (line 245) | enum OpArgMask {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/loslib.c
function os_pushresult (line 23) | static int os_pushresult (lua_State *L, int i, const char *filename) {
function os_execute (line 38) | static int os_execute (lua_State *L) {
function os_remove (line 44) | static int os_remove (lua_State *L) {
function os_rename (line 50) | static int os_rename (lua_State *L) {
function os_tmpname (line 57) | static int os_tmpname (lua_State *L) {
function os_getenv (line 68) | static int os_getenv (lua_State *L) {
function os_clock (line 74) | static int os_clock (lua_State *L) {
function setfield (line 88) | static void setfield (lua_State *L, const char *key, int value) {
function setboolfield (line 93) | static void setboolfield (lua_State *L, const char *key, int value) {
function getboolfield (line 100) | static int getboolfield (lua_State *L, const char *key) {
function getfield (line 109) | static int getfield (lua_State *L, const char *key, int d) {
function os_date (line 124) | static int os_date (lua_State *L) {
function os_time (line 170) | static int os_time (lua_State *L) {
function os_difftime (line 195) | static int os_difftime (lua_State *L) {
function os_setlocale (line 204) | static int os_setlocale (lua_State *L) {
function os_exit (line 216) | static int os_exit (lua_State *L) {
function LUALIB_API (line 239) | LUALIB_API int luaopen_os (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lparser.c
type BlockCnt (line 40) | typedef struct BlockCnt {
function anchor_token (line 57) | static void anchor_token (LexState *ls) {
function error_expected (line 65) | static void error_expected (LexState *ls, int token) {
function errorlimit (line 71) | static void errorlimit (FuncState *fs, int limit, const char *what) {
function testnext (line 80) | static int testnext (LexState *ls, int c) {
function check (line 89) | static void check (LexState *ls, int c) {
function checknext (line 94) | static void checknext (LexState *ls, int c) {
function check_match (line 104) | static void check_match (LexState *ls, int what, int who, int where) {
function TString (line 117) | static TString *str_checkname (LexState *ls) {
function init_exp (line 126) | static void init_exp (expdesc *e, expkind k, int i) {
function codestring (line 133) | static void codestring (LexState *ls, expdesc *e, TString *s) {
function checkname (line 138) | static void checkname(LexState *ls, expdesc *e) {
function registerlocalvar (line 143) | static int registerlocalvar (LexState *ls, TString *varname) {
function new_localvar (line 160) | static void new_localvar (LexState *ls, TString *name, int n) {
function adjustlocalvars (line 167) | static void adjustlocalvars (LexState *ls, int nvars) {
function removevars (line 176) | static void removevars (LexState *ls, int tolevel) {
function indexupvalue (line 183) | static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {
function searchvar (line 207) | static int searchvar (FuncState *fs, TString *n) {
function markupval (line 217) | static void markupval (FuncState *fs, int level) {
function singlevaraux (line 224) | static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int ba...
function singlevar (line 248) | static void singlevar (LexState *ls, expdesc *var) {
function adjust_assign (line 256) | static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *...
function enterlevel (line 276) | static void enterlevel (LexState *ls) {
function enterblock (line 285) | static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) {
function leaveblock (line 296) | static void leaveblock (FuncState *fs) {
function pushclosure (line 310) | static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
function open_func (line 328) | static void open_func (LexState *ls, FuncState *fs) {
function close_func (line 356) | static void close_func (LexState *ls) {
function Proto (line 383) | Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *nam...
function field (line 407) | static void field (LexState *ls, expdesc *v) {
function yindex (line 418) | static void yindex (LexState *ls, expdesc *v) {
type ConsControl (line 434) | struct ConsControl {
function recfield (line 443) | static void recfield (LexState *ls, struct ConsControl *cc) {
function closelistfield (line 464) | static void closelistfield (FuncState *fs, struct ConsControl *cc) {
function lastlistfield (line 475) | static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
function listfield (line 490) | static void listfield (LexState *ls, struct ConsControl *cc) {
function constructor (line 498) | static void constructor (LexState *ls, expdesc *t) {
function parlist (line 543) | static void parlist (LexState *ls) {
function body (line 576) | static void body (LexState *ls, expdesc *e, int needself, int line) {
function explist1 (line 596) | static int explist1 (LexState *ls, expdesc *v) {
function funcargs (line 609) | static void funcargs (LexState *ls, expdesc *f) {
function prefixexp (line 667) | static void prefixexp (LexState *ls, expdesc *v) {
function primaryexp (line 690) | static void primaryexp (LexState *ls, expdesc *v) {
function simpleexp (line 727) | static void simpleexp (LexState *ls, expdesc *v) {
function UnOpr (line 778) | static UnOpr getunopr (int op) {
function BinOpr (line 788) | static BinOpr getbinopr (int op) {
function BinOpr (line 828) | static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) {
function expr (line 856) | static void expr (LexState *ls, expdesc *v) {
function block_follow (line 871) | static int block_follow (int token) {
function block (line 881) | static void block (LexState *ls) {
type LHS_assign (line 896) | struct LHS_assign {
function check_conflict (line 908) | static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc...
function assignment (line 931) | static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
function cond (line 965) | static int cond (LexState *ls) {
function breakstat (line 975) | static void breakstat (LexState *ls) {
function whilestat (line 991) | static void whilestat (LexState *ls, int line) {
function repeatstat (line 1010) | static void repeatstat (LexState *ls, int line) {
function exp1 (line 1036) | static int exp1 (LexState *ls) {
function forbody (line 1046) | static void forbody (LexState *ls, int base, int line, int nvars, int is...
function fornum (line 1067) | static void fornum (LexState *ls, TString *varname, int line) {
function forlist (line 1089) | static void forlist (LexState *ls, TString *indexname) {
function forstat (line 1112) | static void forstat (LexState *ls, int line) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lparser.h
type expkind (line 19) | typedef enum {
type expdesc (line 37) | typedef struct expdesc {
type upvaldesc (line 48) | typedef struct upvaldesc {
type BlockCnt (line 54) | struct BlockCnt
type FuncState (line 58) | typedef struct FuncState {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lstate.c
type LG (line 35) | typedef struct LG {
function stack_init (line 42) | static void stack_init (lua_State *L1, lua_State *L) {
function freestack (line 61) | static void freestack (lua_State *L, lua_State *L1) {
function f_luaopen (line 70) | static void f_luaopen (lua_State *L, void *ud) {
function preinit_state (line 84) | static void preinit_state (lua_State *L, global_State *g) {
function close_state (line 105) | static void close_state (lua_State *L) {
function lua_State (line 119) | lua_State *luaE_newthread (lua_State *L) {
function luaE_freethread (line 134) | void luaE_freethread (lua_State *L, lua_State *L1) {
function LUA_API (line 143) | LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
function callallgcTM (line 193) | static void callallgcTM (lua_State *L, void *ud) {
function LUA_API (line 199) | LUA_API void lua_close (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lstate.h
type lua_longjmp (line 18) | struct lua_longjmp
type stringtable (line 38) | typedef struct stringtable {
type CallInfo (line 48) | typedef struct CallInfo {
type global_State (line 68) | typedef struct global_State {
type lua_State (line 100) | struct lua_State {
type Table (line 141) | struct Table
type Proto (line 142) | struct Proto
type UpVal (line 143) | struct UpVal
type lua_State (line 144) | struct lua_State
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lstring.c
function luaS_resize (line 22) | void luaS_resize (lua_State *L, int newsize) {
function TString (line 50) | static TString *newlstr (lua_State *L, const char *str, size_t l,
function TString (line 75) | TString *luaS_newlstr (lua_State *L, const char *str, size_t l) {
function Udata (line 96) | Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lstrlib.c
function str_len (line 28) | static int str_len (lua_State *L) {
function posrelat (line 36) | static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
function str_sub (line 43) | static int str_sub (lua_State *L) {
function str_reverse (line 57) | static int str_reverse (lua_State *L) {
function str_lower (line 68) | static int str_lower (lua_State *L) {
function str_upper (line 81) | static int str_upper (lua_State *L) {
function str_rep (line 93) | static int str_rep (lua_State *L) {
function str_byte (line 106) | static int str_byte (lua_State *L) {
function str_char (line 125) | static int str_char (lua_State *L) {
function writer (line 140) | static int writer (lua_State *L, const void* b, size_t size, void* B) {
function str_dump (line 147) | static int str_dump (lua_State *L) {
type MatchState (line 170) | typedef struct MatchState {
function check_capture (line 186) | static int check_capture (MatchState *ms, int l) {
function capture_to_close (line 194) | static int capture_to_close (MatchState *ms) {
function match_class (line 226) | static int match_class (int c, int cl) {
function matchbracketclass (line 245) | static int matchbracketclass (int c, const char *p, const char *ec) {
function singlematch (line 268) | static int singlematch (int c, const char *p, const char *ep) {
function push_onecapture (line 466) | static void push_onecapture (MatchState *ms, int i, const char *s,
function push_captures (line 485) | static int push_captures (MatchState *ms, const char *s, const char *e) {
function str_find_aux (line 495) | static int str_find_aux (lua_State *L, int find) {
function str_find (line 538) | static int str_find (lua_State *L) {
function str_match (line 543) | static int str_match (lua_State *L) {
function gmatch_aux (line 548) | static int gmatch_aux (lua_State *L) {
function gmatch (line 574) | static int gmatch (lua_State *L) {
function gfind_nodef (line 584) | static int gfind_nodef (lua_State *L) {
function add_s (line 590) | static void add_s (MatchState *ms, luaL_Buffer *b, const char *s,
function add_value (line 612) | static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
function str_gsub (line 644) | static int str_gsub (lua_State *L) {
function addquoted (line 696) | static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {
function addintlen (line 747) | static void addintlen (char *form) {
function str_format (line 756) | static int str_format (lua_State *L) {
function createmetatable (line 847) | static void createmetatable (lua_State *L) {
function LUALIB_API (line 862) | LUALIB_API int luaopen_string (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ltable.c
function Node (line 84) | static Node *hashnum (const Table *t, lua_Number n) {
function Node (line 100) | static Node *mainposition (const Table *t, const TValue *key) {
function arrayindex (line 120) | static int arrayindex (const TValue *key) {
function findindex (line 137) | static int findindex (lua_State *L, Table *t, StkId key) {
function luaH_next (line 162) | int luaH_next (lua_State *L, Table *t, StkId key) {
function computesizes (line 189) | static int computesizes (int nums[], int *narray) {
function countint (line 211) | static int countint (const TValue *key, int *nums) {
function numusearray (line 222) | static int numusearray (const Table *t, int *nums) {
function numusehash (line 247) | static int numusehash (const Table *t, int *nums, int *pnasize) {
function setarrayvector (line 263) | static void setarrayvector (lua_State *L, Table *t, int size) {
function setnodevector (line 272) | static void setnodevector (lua_State *L, Table *t, int size) {
function resize (line 297) | static void resize (lua_State *L, Table *t, int nasize, int nhsize) {
function luaH_resizearray (line 327) | void luaH_resizearray (lua_State *L, Table *t, int nasize) {
function rehash (line 333) | static void rehash (lua_State *L, Table *t, const TValue *ek) {
function Table (line 358) | Table *luaH_new (lua_State *L, int narray, int nhash) {
function luaH_free (line 374) | void luaH_free (lua_State *L, Table *t) {
function Node (line 382) | static Node *getfreepos (Table *t) {
function TValue (line 399) | static TValue *newkey (lua_State *L, Table *t, const TValue *key) {
function TValue (line 435) | const TValue *luaH_getnum (Table *t, int key) {
function TValue (line 455) | const TValue *luaH_getstr (Table *t, TString *key) {
function TValue (line 469) | const TValue *luaH_get (Table *t, const TValue *key) {
function TValue (line 494) | TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
function TValue (line 508) | TValue *luaH_setnum (lua_State *L, Table *t, int key) {
function TValue (line 520) | TValue *luaH_setstr (lua_State *L, Table *t, TString *key) {
function unbound_search (line 532) | static int unbound_search (Table *t, unsigned int j) {
function luaH_getn (line 560) | int luaH_getn (Table *t) {
function Node (line 582) | Node *luaH_mainposition (const Table *t, const TValue *key) {
function luaH_isdummy (line 586) | int luaH_isdummy (Node *n) { return n == dummynode; }
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ltablib.c
function foreachi (line 22) | static int foreachi (lua_State *L) {
function foreach (line 39) | static int foreach (lua_State *L) {
function maxn (line 56) | static int maxn (lua_State *L) {
function getn (line 72) | static int getn (lua_State *L) {
function setn (line 78) | static int setn (lua_State *L) {
function tinsert (line 90) | static int tinsert (lua_State *L) {
function tremove (line 118) | static int tremove (lua_State *L) {
function addfield (line 135) | static void addfield (lua_State *L, luaL_Buffer *b, int i) {
function tconcat (line 144) | static int tconcat (lua_State *L) {
function set2 (line 173) | static void set2 (lua_State *L, int i, int j) {
function sort_comp (line 178) | static int sort_comp (lua_State *L, int a, int b) {
function auxsort (line 193) | static void auxsort (lua_State *L, int l, int u) {
function sort (line 256) | static int sort (lua_State *L) {
function LUALIB_API (line 283) | LUALIB_API int luaopen_table (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ltm.c
function luaT_init (line 30) | void luaT_init (lua_State *L) {
function TValue (line 50) | const TValue *luaT_gettm (Table *events, TMS event, TString *ename) {
function TValue (line 61) | const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/ltm.h
type TMS (line 18) | typedef enum {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lua.c
function lstop (line 28) | static void lstop (lua_State *L, lua_Debug *ar) {
function laction (line 35) | static void laction (int i) {
function print_usage (line 42) | static void print_usage (void) {
function l_message (line 58) | static void l_message (const char *pname, const char *msg) {
function report (line 65) | static int report (lua_State *L, int status) {
function traceback (line 76) | static int traceback (lua_State *L) {
function docall (line 96) | static int docall (lua_State *L, int narg, int clear) {
function print_version (line 111) | static void print_version (void) {
function getargs (line 116) | static int getargs (lua_State *L, char **argv, int n) {
function dofile (line 134) | static int dofile (lua_State *L, const char *name) {
function dostring (line 140) | static int dostring (lua_State *L, const char *s, const char *name) {
function dolibrary (line 146) | static int dolibrary (lua_State *L, const char *name) {
function incomplete (line 163) | static int incomplete (lua_State *L, int status) {
function pushline (line 177) | static int pushline (lua_State *L, int firstline) {
function loadline (line 196) | static int loadline (lua_State *L) {
function dotty (line 216) | static void dotty (lua_State *L) {
function handle_script (line 239) | static int handle_script (lua_State *L, char **argv, int n) {
function collectargs (line 261) | static int collectargs (char **argv, int *pi, int *pv, int *pe) {
function runargs (line 294) | static int runargs (lua_State *L, char **argv, int n) {
function handle_luainit (line 323) | static int handle_luainit (lua_State *L) {
type Smain (line 333) | struct Smain {
function pmain (line 340) | static int pmain (lua_State *L) {
function main (line 377) | int main (int argc, char **argv) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lua.h
type lua_State (line 50) | typedef struct lua_State lua_State;
type LUA_NUMBER (line 99) | typedef LUA_NUMBER lua_Number;
type LUA_INTEGER (line 103) | typedef LUA_INTEGER lua_Integer;
type lua_Debug (line 326) | typedef struct lua_Debug lua_Debug;
type lua_Debug (line 346) | struct lua_Debug {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lua_bit.c
type __int32 (line 37) | typedef __int32 int32_t;
type SBits (line 44) | typedef int32_t SBits;
type UBits (line 45) | typedef uint32_t UBits;
type BitNum (line 47) | typedef union {
function UBits (line 57) | static UBits barg(lua_State *L, int idx)
function bit_tobit (line 96) | static int bit_tobit(lua_State *L) { BRET(barg(L, 1)) }
function bit_bnot (line 97) | static int bit_bnot(lua_State *L) { BRET(~barg(L, 1)) }
function bit_bswap (line 120) | static int bit_bswap(lua_State *L)
function bit_tohex (line 127) | static int bit_tohex(lua_State *L)
type luaL_Reg (line 141) | struct luaL_Reg
function LUALIB_API (line 163) | LUALIB_API int luaopen_bit(lua_State *L)
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lua_cjson.c
type json_token_type_t (line 79) | typedef enum {
type json_config_t (line 114) | typedef struct {
type json_parse_t (line 134) | typedef struct {
type json_token_t (line 142) | typedef struct {
function json_config_t (line 194) | static json_config_t *json_fetch_config(lua_State *l)
function json_config_t (line 208) | static json_config_t *json_arg_init(lua_State *l, int args)
function json_integer_option (line 220) | static int json_integer_option(lua_State *l, int optindex, int *setting,
function json_enum_option (line 239) | static int json_enum_option(lua_State *l, int optindex, int *setting,
function json_cfg_encode_sparse_array (line 268) | static int json_cfg_encode_sparse_array(lua_State *l)
function json_cfg_encode_max_depth (line 281) | static int json_cfg_encode_max_depth(lua_State *l)
function json_cfg_decode_max_depth (line 290) | static int json_cfg_decode_max_depth(lua_State *l)
function json_cfg_encode_number_precision (line 298) | static int json_cfg_encode_number_precision(lua_State *l)
function json_cfg_encode_keep_buffer (line 306) | static int json_cfg_encode_keep_buffer(lua_State *l)
function json_verify_invalid_number_setting (line 327) | void json_verify_invalid_number_setting(lua_State *l, int *setting)
function json_cfg_encode_invalid_numbers (line 338) | static int json_cfg_encode_invalid_numbers(lua_State *l)
function json_cfg_decode_invalid_numbers (line 350) | static int json_cfg_decode_invalid_numbers(lua_State *l)
function json_destroy_config (line 361) | static int json_destroy_config(lua_State *l)
function json_create_config (line 373) | static void json_create_config(lua_State *l)
function json_encode_exception (line 448) | static void json_encode_exception(lua_State *l, json_config_t *cfg, strb...
function json_append_string (line 463) | static void json_append_string(lua_State *l, strbuf_t *json, int lindex)
function lua_array_length (line 493) | static int lua_array_length(lua_State *l, json_config_t *cfg, strbuf_t *...
function json_check_encode_depth (line 536) | static void json_check_encode_depth(lua_State *l, json_config_t *cfg,
function json_append_array (line 566) | static void json_append_array(lua_State *l, json_config_t *cfg, int curr...
function json_append_number (line 588) | static void json_append_number(lua_State *l, json_config_t *cfg,
function json_append_object (line 618) | static void json_append_object(lua_State *l, json_config_t *cfg,
function json_append_data (line 660) | static void json_append_data(lua_State *l, json_config_t *cfg,
function json_encode (line 703) | static int json_encode(lua_State *l)
function hexdigit2int (line 739) | static int hexdigit2int(char hex)
function decode_hex4 (line 752) | static int decode_hex4(const char *hex)
function codepoint_to_utf8 (line 775) | static int codepoint_to_utf8(char *utf8, int codepoint)
function json_append_unicode_escape (line 819) | static int json_append_unicode_escape(json_parse_t *json)
function json_set_token_error (line 877) | static void json_set_token_error(json_token_t *token, json_parse_t *json,
function json_next_string_token (line 885) | static void json_next_string_token(json_parse_t *json, json_token_t *token)
function json_is_invalid_number (line 960) | static int json_is_invalid_number(json_parse_t *json)
function json_next_number_token (line 996) | static void json_next_number_token(json_parse_t *json, json_token_t *token)
function json_next_token (line 1014) | static void json_next_token(json_parse_t *json, json_token_t *token)
function json_throw_parse_error (line 1099) | static void json_throw_parse_error(lua_State *l, json_parse_t *json,
function json_decode_ascend (line 1116) | static inline void json_decode_ascend(json_parse_t *json)
function json_decode_descend (line 1121) | static void json_decode_descend(lua_State *l, json_parse_t *json, int sl...
function json_parse_object_context (line 1135) | static void json_parse_object_context(lua_State *l, json_parse_t *json)
function json_parse_array_context (line 1186) | static void json_parse_array_context(lua_State *l, json_parse_t *json)
function json_process_value (line 1224) | static void json_process_value(lua_State *l, json_parse_t *json,
function json_decode (line 1253) | static int json_decode(lua_State *l)
function luaL_setfuncs (line 1300) | static void luaL_setfuncs (lua_State *l, const luaL_Reg *reg, int nup)
function json_protect_conversion (line 1318) | static int json_protect_conversion(lua_State *l)
function lua_cjson_new (line 1344) | static int lua_cjson_new(lua_State *l)
function lua_cjson_safe_new (line 1384) | static int lua_cjson_safe_new(lua_State *l)
function luaopen_cjson (line 1404) | int luaopen_cjson(lua_State *l)
function luaopen_cjson_safe (line 1418) | int luaopen_cjson_safe(lua_State *l)
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lua_cmsgpack.c
function memrevifle (line 69) | void memrevifle(void *ptr, size_t len) {
type mp_buf (line 93) | typedef struct mp_buf {
function mp_buf (line 108) | mp_buf *mp_buf_new(lua_State *L) {
function mp_buf_append (line 120) | void mp_buf_append(mp_buf *buf, const unsigned char *s, size_t len) {
function mp_buf_free (line 132) | void mp_buf_free(mp_buf *buf) {
type mp_cur (line 150) | typedef struct mp_cur {
function mp_cur_init (line 156) | void mp_cur_init(mp_cur *cursor, const unsigned char *s, size_t len) {
function mp_encode_bytes (line 176) | void mp_encode_bytes(mp_buf *buf, const unsigned char *s, size_t len) {
function mp_encode_double (line 205) | void mp_encode_double(mp_buf *buf, double d) {
function mp_encode_int (line 223) | void mp_encode_int(mp_buf *buf, int64_t n) {
function mp_encode_array (line 295) | void mp_encode_array(mp_buf *buf, int64_t n) {
function mp_encode_map (line 318) | void mp_encode_map(mp_buf *buf, int64_t n) {
function mp_encode_lua_string (line 343) | void mp_encode_lua_string(lua_State *L, mp_buf *buf) {
function mp_encode_lua_bool (line 351) | void mp_encode_lua_bool(lua_State *L, mp_buf *buf) {
function mp_encode_lua_integer (line 357) | void mp_encode_lua_integer(lua_State *L, mp_buf *buf) {
function mp_encode_lua_number (line 369) | void mp_encode_lua_number(lua_State *L, mp_buf *buf) {
function mp_encode_lua_table_as_array (line 382) | void mp_encode_lua_table_as_array(lua_State *L, mp_buf *buf, int level) {
function mp_encode_lua_table_as_map (line 398) | void mp_encode_lua_table_as_map(lua_State *L, mp_buf *buf, int level) {
function table_is_an_array (line 425) | int table_is_an_array(lua_State *L) {
function mp_encode_lua_table (line 468) | void mp_encode_lua_table(lua_State *L, mp_buf *buf, int level) {
function mp_encode_lua_null (line 475) | void mp_encode_lua_null(lua_State *L, mp_buf *buf) {
function mp_encode_lua_type (line 483) | void mp_encode_lua_type(lua_State *L, mp_buf *buf, int level) {
function mp_pack (line 513) | int mp_pack(lua_State *L) {
function mp_decode_to_lua_array (line 548) | void mp_decode_to_lua_array(lua_State *L, mp_cur *c, size_t len) {
function mp_decode_to_lua_hash (line 561) | void mp_decode_to_lua_hash(lua_State *L, mp_cur *c, size_t len) {
type luaL_Reg (line 885) | struct luaL_Reg
function LUALIB_API (line 928) | LUALIB_API int luaopen_cmsgpack_safe(lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lua_struct.c
type STRUCT_INT (line 52) | typedef STRUCT_INT Inttype;
type Uinttype (line 55) | typedef unsigned STRUCT_INT Uinttype;
type cD (line 65) | struct cD {
type Header (line 86) | typedef struct Header {
function getnum (line 92) | static int getnum (const char **fmt, int df) {
function optsize (line 109) | static size_t optsize (lua_State *L, char opt, const char **fmt) {
function gettoalign (line 135) | static int gettoalign (size_t len, Header *h, int opt, size_t size) {
function controloptions (line 146) | static void controloptions (lua_State *L, int opt, const char **fmt,
function putinteger (line 167) | static void putinteger (lua_State *L, luaL_Buffer *b, int arg, int endian,
function correctbytes (line 194) | static void correctbytes (char *b, int size, int endian) {
function b_pack (line 206) | static int b_pack (lua_State *L) {
function lua_Number (line 264) | static lua_Number getinteger (const char *buff, int endian,
function b_unpack (line 291) | static int b_unpack (lua_State *L) {
function b_size (line 358) | static int b_size (lua_State *L) {
type luaL_Reg (line 383) | struct luaL_Reg
function LUALIB_API (line 393) | LUALIB_API int luaopen_struct (lua_State *L) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/luac.c
function fatal (line 36) | static void fatal(const char* message)
function cannot (line 42) | static void cannot(const char* what)
function usage (line 48) | static void usage(const char* message)
function doargs (line 70) | static int doargs(int argc, char* argv[])
function Proto (line 119) | static const Proto* combine(lua_State* L, int n)
function writer (line 147) | static int writer(lua_State* L, const void* p, size_t size, void* u)
type Smain (line 153) | struct Smain {
function pmain (line 158) | static int pmain(lua_State* L)
function main (line 186) | int main(int argc, char* argv[])
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lundump.c
type LoadState (line 23) | typedef struct {
function error (line 36) | static void error(LoadState* S, const char* why)
function LoadBlock (line 48) | static void LoadBlock(LoadState* S, void* b, size_t size)
function LoadChar (line 54) | static int LoadChar(LoadState* S)
function LoadInt (line 61) | static int LoadInt(LoadState* S)
function lua_Number (line 69) | static lua_Number LoadNumber(LoadState* S)
function TString (line 76) | static TString* LoadString(LoadState* S)
function LoadCode (line 90) | static void LoadCode(LoadState* S, Proto* f)
function LoadConstants (line 100) | static void LoadConstants(LoadState* S, Proto* f)
function LoadDebug (line 137) | static void LoadDebug(LoadState* S, Proto* f)
function Proto (line 161) | static Proto* LoadFunction(LoadState* S, TString* p)
function LoadHeader (line 183) | static void LoadHeader(LoadState* S)
function Proto (line 195) | Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name)
function luaU_header (line 214) | void luaU_header (char* h)
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lvm.c
function TValue (line 35) | const TValue *luaV_tonumber (const TValue *obj, TValue *n) {
function luaV_tostring (line 47) | int luaV_tostring (lua_State *L, StkId obj) {
function traceexec (line 60) | static void traceexec (lua_State *L, const Instruction *pc) {
function callTMres (line 80) | static void callTMres (lua_State *L, StkId res, const TValue *f,
function callTM (line 96) | static void callTM (lua_State *L, const TValue *f, const TValue *p1,
function luaV_gettable (line 108) | void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId va...
function luaV_settable (line 134) | void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId va...
function call_binTM (line 165) | static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,
function TValue (line 176) | static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2,
function call_orderTM (line 190) | static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2,
function l_strcmp (line 203) | static int l_strcmp (const TString *ls, const TString *rs) {
function luaV_lessthan (line 225) | int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) {
function lessequal (line 239) | static int lessequal (lua_State *L, const TValue *l, const TValue *r) {
function luaV_equalval (line 255) | int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) {
function luaV_concat (line 282) | void luaV_concat (lua_State *L, int total, int last) {
function Arith (line 317) | static void Arith (lua_State *L, StkId ra, const TValue *rb,
function luaV_execute (line 377) | void luaV_execute (lua_State *L, int nexeccalls) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lzio.c
function luaZ_fill (line 21) | int luaZ_fill (ZIO *z) {
function luaZ_lookahead (line 35) | int luaZ_lookahead (ZIO *z) {
function luaZ_init (line 48) | void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) {
function luaZ_read (line 58) | size_t luaZ_read (ZIO *z, void *b, size_t n) {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/lzio.h
type ZIO (line 18) | typedef struct Zio ZIO;
type Mbuffer (line 24) | typedef struct Mbuffer {
type Zio (line 56) | struct Zio {
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/print.c
function PrintString (line 23) | static void PrintString(const TString* ts)
function PrintConstant (line 51) | static void PrintConstant(const Proto* f, int i)
function PrintCode (line 74) | static void PrintCode(const Proto* f)
function PrintHeader (line 161) | static void PrintHeader(const Proto* f)
function PrintConstants (line 181) | static void PrintConstants(const Proto* f)
function PrintLocals (line 193) | static void PrintLocals(const Proto* f)
function PrintUpvalues (line 204) | static void PrintUpvalues(const Proto* f)
function PrintFunction (line 215) | void PrintFunction(const Proto* f, int full)
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/strbuf.c
function die (line 32) | static void die(const char *fmt, ...)
function strbuf_init (line 44) | void strbuf_init(strbuf_t *s, int len)
function strbuf_t (line 68) | strbuf_t *strbuf_new(int len)
function strbuf_set_increment (line 84) | void strbuf_set_increment(strbuf_t *s, int increment)
function debug_stats (line 94) | static inline void debug_stats(strbuf_t *s)
function strbuf_free (line 104) | void strbuf_free(strbuf_t *s)
function calculate_new_size (line 134) | static int calculate_new_size(strbuf_t *s, int len)
function strbuf_resize (line 164) | void strbuf_resize(strbuf_t *s, int len)
function strbuf_append_string (line 182) | void strbuf_append_string(strbuf_t *s, const char *str)
function strbuf_append_fmt (line 202) | void strbuf_append_fmt(strbuf_t *s, int len, const char *fmt, ...)
function strbuf_append_fmt_retry (line 221) | void strbuf_append_fmt_retry(strbuf_t *s, const char *fmt, ...)
FILE: extern/deprecated/redis-2.8.21/deps/lua/src/strbuf.h
type strbuf_t (line 34) | typedef struct {
function strbuf_reset (line 78) | static inline void strbuf_reset(strbuf_t *s)
function strbuf_allocated (line 83) | static inline int strbuf_allocated(strbuf_t *s)
function strbuf_empty_length (line 90) | static inline int strbuf_empty_length(strbuf_t *s)
function strbuf_ensure_empty_length (line 95) | static inline void strbuf_ensure_empty_length(strbuf_t *s, int len)
function strbuf_extend_length (line 106) | static inline void strbuf_extend_length(strbuf_t *s, int len)
function strbuf_length (line 111) | static inline int strbuf_length(strbuf_t *s)
function strbuf_append_char (line 116) | static inline void strbuf_append_char(strbuf_t *s, const char c)
function strbuf_append_char_unsafe (line 122) | static inline void strbuf_append_char_unsafe(strbuf_t *s, const char c)
function strbuf_append_mem (line 127) | static inline void strbuf_append_mem(strbuf_t *s, const char *c, int len)
function strbuf_append_mem_unsafe (line 134) | static inline void strbuf_append_mem_unsafe(strbuf_t *s, const char *c, ...
function strbuf_ensure_null (line 140) | static inline void strbuf_ensure_null(strbuf_t *s)
FILE: extern/deprecated/redis-2.8.21/src/adlist.c
function list (line 41) | list *listCreate(void)
function listRelease (line 58) | void listRelease(list *list)
function list (line 80) | list *listAddNodeHead(list *list, void *value)
function list (line 106) | list *listAddNodeTail(list *list, void *value)
function list (line 126) | list *listInsertNode(list *list, listNode *old_node, void *value, int af...
function listDelNode (line 159) | void listDelNode(list *list, listNode *node)
function listIter (line 178) | listIter *listGetIterator(list *list, int direction)
function listReleaseIterator (line 192) | void listReleaseIterator(listIter *iter) {
function listRewind (line 197) | void listRewind(list *list, listIter *li) {
function listRewindTail (line 202) | void listRewindTail(list *list, listIter *li) {
function listNode (line 221) | listNode *listNext(listIter *iter)
function list (line 242) | list *listDup(list *orig)
function listNode (line 285) | listNode *listSearchKey(list *list, void *key)
function listNode (line 313) | listNode *listIndex(list *list, long index) {
function listRotate (line 328) | void listRotate(list *list) {
FILE: extern/deprecated/redis-2.8.21/src/adlist.h
type listNode (line 36) | typedef struct listNode {
type listIter (line 42) | typedef struct listIter {
type list (line 47) | typedef struct list {
FILE: extern/deprecated/redis-2.8.21/src/ae.c
function aeEventLoop (line 63) | aeEventLoop *aeCreateEventLoop(int setsize) {
function aeGetSetSize (line 95) | int aeGetSetSize(aeEventLoop *eventLoop) {
function aeResizeSetSize (line 106) | int aeResizeSetSize(aeEventLoop *eventLoop, int setsize) {
function aeDeleteEventLoop (line 124) | void aeDeleteEventLoop(aeEventLoop *eventLoop) {
function aeStop (line 131) | void aeStop(aeEventLoop *eventLoop) {
function aeCreateFileEvent (line 135) | int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask,
function aeDeleteFileEvent (line 155) | void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask)
function aeGetFileEvents (line 173) | int aeGetFileEvents(aeEventLoop *eventLoop, int fd) {
function aeGetTime (line 180) | static void aeGetTime(long *seconds, long *milliseconds)
function aeAddMillisecondsToNow (line 189) | static void aeAddMillisecondsToNow(long long milliseconds, long *sec, lo...
function aeCreateTimeEvent (line 203) | long long aeCreateTimeEvent(aeEventLoop *eventLoop, long long milliseconds,
function aeDeleteTimeEvent (line 222) | int aeDeleteTimeEvent(aeEventLoop *eventLoop, long long id)
function aeTimeEvent (line 255) | static aeTimeEvent *aeSearchNearestTimer(aeEventLoop *eventLoop)
function processTimeEvents (line 271) | static int processTimeEvents(aeEventLoop *eventLoop) {
function aeProcessEvents (line 352) | int aeProcessEvents(aeEventLoop *eventLoop, int flags)
function aeWait (line 430) | int aeWait(int fd, int mask, long long milliseconds) {
function aeMain (line 450) | void aeMain(aeEventLoop *eventLoop) {
function aeSetBeforeSleepProc (line 463) | void aeSetBeforeSleepProc(aeEventLoop *eventLoop, aeBeforeSleepProc *bef...
FILE: extern/deprecated/redis-2.8.21/src/ae.h
type aeEventLoop (line 53) | struct aeEventLoop
type aeEventLoop (line 56) | struct aeEventLoop
type aeEventLoop (line 57) | struct aeEventLoop
type aeEventLoop (line 58) | struct aeEventLoop
type aeEventLoop (line 59) | struct aeEventLoop
type aeFileEvent (line 62) | typedef struct aeFileEvent {
type aeTimeEvent (line 70) | typedef struct aeTimeEvent {
type aeFiredEvent (line 81) | typedef struct aeFiredEvent {
type aeEventLoop (line 87) | typedef struct aeEventLoop {
FILE: extern/deprecated/redis-2.8.21/src/ae_epoll.c
type aeApiState (line 34) | typedef struct aeApiState {
function aeApiCreate (line 39) | static int aeApiCreate(aeEventLoop *eventLoop) {
function aeApiResize (line 58) | static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
function aeApiFree (line 65) | static void aeApiFree(aeEventLoop *eventLoop) {
function aeApiAddEvent (line 73) | static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiDelEvent (line 91) | static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int delmask) {
function aeApiPoll (line 110) | static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
FILE: extern/deprecated/redis-2.8.21/src/ae_evport.c
type aeApiState (line 68) | typedef struct aeApiState {
function aeApiCreate (line 75) | static int aeApiCreate(aeEventLoop *eventLoop) {
function aeApiResize (line 97) | static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
function aeApiFree (line 102) | static void aeApiFree(aeEventLoop *eventLoop) {
function aeApiLookupPending (line 109) | static int aeApiLookupPending(aeApiState *state, int fd) {
function aeApiAssociate (line 123) | static int aeApiAssociate(const char *where, int portfd, int fd, int mas...
function aeApiAddEvent (line 152) | static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiDelEvent (line 183) | static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiPoll (line 243) | static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
FILE: extern/deprecated/redis-2.8.21/src/ae_kqueue.c
type aeApiState (line 36) | typedef struct aeApiState {
function aeApiCreate (line 41) | static int aeApiCreate(aeEventLoop *eventLoop) {
function aeApiResize (line 60) | static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
function aeApiFree (line 67) | static void aeApiFree(aeEventLoop *eventLoop) {
function aeApiAddEvent (line 75) | static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiDelEvent (line 90) | static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiPoll (line 104) | static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
FILE: extern/deprecated/redis-2.8.21/src/ae_select.c
type aeApiState (line 34) | typedef struct aeApiState {
function aeApiCreate (line 41) | static int aeApiCreate(aeEventLoop *eventLoop) {
function aeApiResize (line 51) | static int aeApiResize(aeEventLoop *eventLoop, int setsize) {
function aeApiFree (line 57) | static void aeApiFree(aeEventLoop *eventLoop) {
function aeApiAddEvent (line 61) | static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiDelEvent (line 69) | static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int mask) {
function aeApiPoll (line 76) | static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
FILE: extern/deprecated/redis-2.8.21/src/anet.c
function anetSetError (line 51) | static void anetSetError(char *err, const char *fmt, ...)
function anetSetBlock (line 61) | int anetSetBlock(char *err, int fd, int non_block) {
function anetNonBlock (line 84) | int anetNonBlock(char *err, int fd) {
function anetBlock (line 88) | int anetBlock(char *err, int fd) {
function anetKeepAlive (line 95) | int anetKeepAlive(char *err, int fd, int interval)
function anetSetTcpNoDelay (line 141) | static int anetSetTcpNoDelay(char *err, int fd, int val)
function anetEnableTcpNoDelay (line 151) | int anetEnableTcpNoDelay(char *err, int fd)
function anetDisableTcpNoDelay (line 156) | int anetDisableTcpNoDelay(char *err, int fd)
function anetSetSendBuffer (line 162) | int anetSetSendBuffer(char *err, int fd, int buffsize)
function anetTcpKeepAlive (line 172) | int anetTcpKeepAlive(char *err, int fd)
function anetSendTimeout (line 184) | int anetSendTimeout(char *err, int fd, long long ms) {
function anetGenericResolve (line 203) | int anetGenericResolve(char *err, char *host, char *ipbuf, size_t ipbuf_...
function anetResolve (line 230) | int anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len) {
function anetResolveIP (line 234) | int anetResolveIP(char *err, char *host, char *ipbuf, size_t ipbuf_len) {
function anetSetReuseAddr (line 238) | static int anetSetReuseAddr(char *err, int fd) {
function anetCreateSocket (line 249) | static int anetCreateSocket(char *err, int domain) {
function anetTcpGenericConnect (line 267) | static int anetTcpGenericConnect(char *err, char *addr, int port, int fl...
function anetTcpConnect (line 318) | int anetTcpConnect(char *err, char *addr, int port)
function anetTcpNonBlockConnect (line 323) | int anetTcpNonBlockConnect(char *err, char *addr, int port)
function anetUnixGenericConnect (line 328) | int anetUnixGenericConnect(char *err, char *path, int flags)
function anetUnixConnect (line 354) | int anetUnixConnect(char *err, char *path)
function anetUnixNonBlockConnect (line 359) | int anetUnixNonBlockConnect(char *err, char *path)
function anetRead (line 366) | int anetRead(int fd, char *buf, int count)
function anetWrite (line 381) | int anetWrite(int fd, char *buf, int count)
function anetListen (line 394) | static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t l...
function anetV6Only (line 409) | static int anetV6Only(char *err, int s) {
function _anetTcpServer (line 419) | static int _anetTcpServer(char *err, int port, char *bindaddr, int af, i...
function anetTcpServer (line 456) | int anetTcpServer(char *err, int port, char *bindaddr, int backlog)
function anetTcp6Server (line 461) | int anetTcp6Server(char *err, int port, char *bindaddr, int backlog)
function anetUnixServer (line 466) | int anetUnixServer(char *err, char *path, mode_t perm, int backlog)
function anetGenericAccept (line 484) | static int anetGenericAccept(char *err, int s, struct sockaddr *sa, sock...
function anetTcpAccept (line 501) | int anetTcpAccept(char *err, int s, char *ip, size_t ip_len, int *port) {
function anetUnixAccept (line 520) | int anetUnixAccept(char *err, int s) {
function anetPeerToString (line 530) | int anetPeerToString(int fd, char *ip, size_t ip_len, int *port) {
function anetSockName (line 552) | int anetSockName(int fd, char *ip, size_t ip_len, int *port) {
FILE: extern/deprecated/redis-2.8.21/src/aof.c
type aofrwblock (line 60) | typedef struct aofrwblock {
function aofRewriteBufferReset (line 68) | void aofRewriteBufferReset(void) {
function aofRewriteBufferSize (line 77) | unsigned long aofRewriteBufferSize(void) {
function aofRewriteBufferAppend (line 89) | void aofRewriteBufferAppend(unsigned char *s, unsigned long len) {
function aofRewriteBufferWrite (line 131) | ssize_t aofRewriteBufferWrite(int fd) {
function aof_background_fsync (line 159) | void aof_background_fsync(int fd) {
function stopAppendOnly (line 165) | void stopAppendOnly(void) {
function startAppendOnly (line 192) | int startAppendOnly(void) {
function flushAppendOnlyFile (line 230) | void flushAppendOnlyFile(int force) {
function sds (line 392) | sds catAppendOnlyGenericCommand(sds dst, int argc, robj **argv) {
function sds (line 424) | sds catAppendOnlyExpireAtCommand(sds buf, struct redisCommand *cmd, robj...
function feedAppendOnlyFile (line 454) | void feedAppendOnlyFile(struct redisCommand *cmd, int dictid, robj **arg...
type redisClient (line 510) | struct redisClient
type redisClient (line 511) | struct redisClient
function freeFakeClientArgv (line 536) | void freeFakeClientArgv(struct redisClient *c) {
function freeFakeClient (line 544) | void freeFakeClient(struct redisClient *c) {
function loadAppendOnlyFile (line 555) | int loadAppendOnlyFile(char *filename) {
function rioWriteBulkObject (line 712) | int rioWriteBulkObject(rio *r, robj *obj) {
function rewriteListObject (line 726) | int rewriteListObject(rio *r, robj *key, robj *o) {
function rewriteSetObject (line 783) | int rewriteSetObject(rio *r, robj *key, robj *o) {
function rewriteSortedSetObject (line 830) | int rewriteSortedSetObject(rio *r, robj *key, robj *o) {
function rioWriteHashIteratorCursor (line 903) | static int rioWriteHashIteratorCursor(rio *r, hashTypeIterator *hi, int ...
function rewriteHashObject (line 929) | int rewriteHashObject(rio *r, robj *key, robj *o) {
function rewriteAppendOnlyFile (line 962) | int rewriteAppendOnlyFile(char *filename) {
function rewriteAppendOnlyFileBackground (line 1079) | int rewriteAppendOnlyFileBackground(void) {
function bgrewriteaofCommand (line 1132) | void bgrewriteaofCommand(redisClient *c) {
function aofRemoveTempFile (line 1145) | void aofRemoveTempFile(pid_t childpid) {
function aofUpdateCurrentSize (line 1156) | void aofUpdateCurrentSize(void) {
function backgroundRewriteDoneHandler (line 1173) | void backgroundRewriteDoneHandler(int exitcode, int bysignal) {
FILE: extern/deprecated/redis-2.8.21/src/bio.c
type bio_job (line 78) | struct bio_job {
function bioInit (line 92) | void bioInit(void) {
function bioCreateBackgroundJob (line 126) | void bioCreateBackgroundJob(int type, void *arg1, void *arg2, void *arg3) {
type bio_job (line 141) | struct bio_job
function bioPendingJobsOfType (line 193) | unsigned long long bioPendingJobsOfType(int type) {
function bioKillThreads (line 205) | void bioKillThreads(void) {
FILE: extern/deprecated/redis-2.8.21/src/bitops.c
function getBitOffsetFromArgument (line 40) | static int getBitOffsetFromArgument(redisClient *c, robj *o, size_t *off...
function redisPopcount (line 61) | size_t redisPopcount(void *s, long count) {
function redisBitpos (line 110) | long redisBitpos(void *s, unsigned long count, int bit) {
function setbitCommand (line 200) | void setbitCommand(redisClient *c) {
function getbitCommand (line 249) | void getbitCommand(redisClient *c) {
function bitopCommand (line 276) | void bitopCommand(redisClient *c) {
function bitcountCommand (line 450) | void bitcountCommand(redisClient *c) {
function bitposCommand (line 504) | void bitposCommand(redisClient *c) {
FILE: extern/deprecated/redis-2.8.21/src/config.c
function yesnotoi (line 62) | int yesnotoi(char *s) {
function appendServerSaveParams (line 68) | void appendServerSaveParams(time_t seconds, int changes) {
function resetServerSaveParams (line 75) | void resetServerSaveParams(void) {
function loadServerConfigFromString (line 81) | void loadServerConfigFromString(char *config) {
function loadServerConfig (line 528) | void loadServerConfig(char *filename, char *options) {
function configSetCommand (line 562) | void configSetCommand(redisClient *c) {
function configGetCommand (line 948) | void configGetCommand(redisClient *c) {
type rewriteConfigState (line 1182) | struct rewriteConfigState
type rewriteConfigState (line 1203) | struct rewriteConfigState {
function rewriteConfigAppendLine (line 1213) | void rewriteConfigAppendLine(struct rewriteConfigState *state, sds line) {
function rewriteConfigAddLineNumberToOption (line 1219) | void rewriteConfigAddLineNumberToOption(struct rewriteConfigState *state...
function rewriteConfigMarkAsProcessed (line 1233) | void rewriteConfigMarkAsProcessed(struct rewriteConfigState *state, char...
type rewriteConfigState (line 1244) | struct rewriteConfigState
type rewriteConfigState (line 1246) | struct rewriteConfigState
function rewriteConfigRewriteLine (line 1317) | void rewriteConfigRewriteLine(struct rewriteConfigState *state, char *op...
function rewriteConfigFormatMemory (line 1354) | int rewriteConfigFormatMemory(char *buf, size_t len, long long bytes) {
function rewriteConfigBytesOption (line 1371) | void rewriteConfigBytesOption(struct rewriteConfigState *state, char *op...
function rewriteConfigYesNoOption (line 1382) | void rewriteConfigYesNoOption(struct rewriteConfigState *state, char *op...
function rewriteConfigStringOption (line 1391) | void rewriteConfigStringOption(struct rewriteConfigState *state, char *o...
function rewriteConfigNumericalOption (line 1413) | void rewriteConfigNumericalOption(struct rewriteConfigState *state, char...
function rewriteConfigOctalOption (line 1421) | void rewriteConfigOctalOption(struct rewriteConfigState *state, char *op...
function rewriteConfigEnumOption (line 1431) | void rewriteConfigEnumOption(struct rewriteConfigState *state, char *opt...
function rewriteConfigSyslogfacilityOption (line 1455) | void rewriteConfigSyslogfacilityOption(struct rewriteConfigState *state) {
function rewriteConfigSaveOption (line 1472) | void rewriteConfigSaveOption(struct rewriteConfigState *state) {
function rewriteConfigDirOption (line 1489) | void rewriteConfigDirOption(struct rewriteConfigState *state) {
function rewriteConfigSlaveofOption (line 1500) | void rewriteConfigSlaveofOption(struct rewriteConfigState *state) {
function rewriteConfigNotifykeyspaceeventsOption (line 1516) | void rewriteConfigNotifykeyspaceeventsOption(struct rewriteConfigState *...
function rewriteConfigClientoutputbufferlimitOption (line 1530) | void rewriteConfigClientoutputbufferlimitOption(struct rewriteConfigStat...
function rewriteConfigBindOption (line 1557) | void rewriteConfigBindOption(struct rewriteConfigState *state) {
function sds (line 1580) | sds rewriteConfigGetContentFromState(struct rewriteConfigState *state) {
function rewriteConfigReleaseState (line 1599) | void rewriteConfigReleaseState(struct rewriteConfigState *state) {
function rewriteConfigRemoveOrphaned (line 1614) | void rewriteConfigRemoveOrphaned(struct rewriteConfigState *state) {
function rewriteConfigOverwriteFile (line 1653) | int rewriteConfigOverwriteFile(char *configfile, sds content) {
function rewriteConfig (line 1706) | int rewriteConfig(char *path) {
function configCommand (line 1818) | void configCommand(redisClient *c) {
FILE: extern/deprecated/redis-2.8.21/src/crc32.c
function crc32_tabinit (line 9) | static void
function crc32_init (line 25) | void
function crc32_update (line 30) | static uint32_t
function crc32_checksum (line 40) | uint32_t
FILE: extern/deprecated/redis-2.8.21/src/crc64.c
function crc64 (line 173) | uint64_t crc64(uint64_t crc, const unsigned char *s, uint64_t l) {
function main (line 186) | int main(void) {
FILE: extern/deprecated/redis-2.8.21/src/db.c
function robj (line 39) | robj *lookupKey(redisDb *db, robj *key) {
function robj (line 55) | robj *lookupKeyRead(redisDb *db, robj *key) {
function robj (line 67) | robj *lookupKeyWrite(redisDb *db, robj *key) {
function robj (line 72) | robj *lookupKeyReadOrReply(redisClient *c, robj *key, robj *reply) {
function robj (line 78) | robj *lookupKeyWriteOrReply(redisClient *c, robj *key, robj *reply) {
function dbAdd (line 88) | void dbAdd(redisDb *db, robj *key, robj *val) {
function dbOverwrite (line 113) | void dbOverwrite(redisDb *db, robj *key, robj *val) {
function setKey (line 126) | void setKey(redisDb *db, robj *key, robj *val) {
function dbExists (line 137) | int dbExists(redisDb *db, robj *key) {
function robj (line 145) | robj *dbRandomKey(redisDb *db) {
function dbDelete (line 168) | int dbDelete(redisDb *db, robj *key) {
function robj (line 218) | robj *dbUnshareStringValue(redisDb *db, robj *key, robj *o) {
function emptyDb (line 229) | long long emptyDb(void(callback)(void*)) {
function selectDb (line 248) | int selectDb(redisClient *c, int id) {
function signalModifiedKey (line 264) | void signalModifiedKey(redisDb *db, robj *key) {
function signalFlushedDb (line 268) | void signalFlushedDb(int dbid) {
function flushdbCommand (line 276) | void flushdbCommand(redisClient *c) {
function flushallCommand (line 292) | void flushallCommand(redisClient *c) {
function delCommand (line 310) | void delCommand(redisClient *c) {
function existsCommand (line 326) | void existsCommand(redisClient *c) {
function selectCommand (line 335) | void selectCommand(redisClient *c) {
function randomkeyCommand (line 349) | void randomkeyCommand(redisClient *c) {
function keysCommand (line 361) | void keysCommand(redisClient *c) {
function scanCallback (line 390) | void scanCallback(void *privdata, const dictEntry *de) {
function parseScanCursorOrReply (line 423) | int parseScanCursorOrReply(redisClient *c, robj *o, unsigned long *curso...
function scanGenericCommand (line 449) | void scanGenericCommand(redisClient *c, robj *o, unsigned long cursor) {
function scanCommand (line 627) | void scanCommand(redisClient *c) {
function dbsizeCommand (line 633) | void dbsizeCommand(redisClient *c) {
function lastsaveCommand (line 637) | void lastsaveCommand(redisClient *c) {
function typeCommand (line 641) | void typeCommand(redisClient *c) {
function shutdownCommand (line 661) | void shutdownCommand(redisClient *c) {
function renameGenericCommand (line 697) | void renameGenericCommand(redisClient *c, int nx) {
function renameCommand (line 735) | void renameCommand(redisClient *c) {
function renamenxCommand (line 739) | void renamenxCommand(redisClient *c) {
function moveCommand (line 743) | void moveCommand(redisClient *c) {
function removeExpire (line 795) | int removeExpire(redisDb *db, robj *key) {
function setExpire (line 802) | void setExpire(redisDb *db, robj *key, long long when) {
function getExpire (line 814) | long long getExpire(redisDb *db, robj *key) {
function propagateExpire (line 835) | void propagateExpire(redisDb *db, robj *key) {
function expireIfNeeded (line 851) | int expireIfNeeded(redisDb *db, robj *key) {
function expireGenericCommand (line 898) | void expireGenericCommand(redisClient *c, long long basetime, int unit) {
function expireCommand (line 944) | void expireCommand(redisClient *c) {
function expireatCommand (line 948) | void expireatCommand(redisClient *c) {
function pexpireCommand (line 952) | void pexpireCommand(redisClient *c) {
function pexpireatCommand (line 956) | void pexpireatCommand(redisClient *c) {
function ttlGenericCommand (line 960) | void ttlGenericCommand(redisClient *c, int output_ms) {
function ttlCommand (line 982) | void ttlCommand(redisClient *c) {
function pttlCommand (line 986) | void pttlCommand(redisClient *c) {
function persistCommand (line 990) | void persistCommand(redisClient *c) {
type redisCommand (line 1010) | struct redisCommand
type redisCommand (line 1029) | struct redisCommand
function getKeysFreeResult (line 1037) | void getKeysFreeResult(int *result) {
type redisCommand (line 1041) | struct redisCommand
type redisCommand (line 1050) | struct redisCommand
type redisCommand (line 1061) | struct redisCommand
FILE: extern/deprecated/redis-2.8.21/src/debug.c
function xorDigest (line 58) | void xorDigest(unsigned char *digest, void *ptr, size_t len) {
function xorObjectDigest (line 71) | void xorObjectDigest(unsigned char *digest, robj *o) {
function mixDigest (line 91) | void mixDigest(unsigned char *digest, void *ptr, size_t len) {
function mixObjectDigest (line 101) | void mixObjectDigest(unsigned char *digest, robj *o) {
function computeDatasetDigest (line 113) | void computeDatasetDigest(unsigned char *final) {
function debugCommand (line 255) | void debugCommand(redisClient *c) {
function _redisAssert (line 390) | void _redisAssert(char *estr, char *file, int line) {
function _redisAssertPrintClientInfo (line 403) | void _redisAssertPrintClientInfo(redisClient *c) {
function redisLogObjectDebugInfo (line 429) | void redisLogObjectDebugInfo(robj *o) {
function _redisAssertPrintObject (line 453) | void _redisAssertPrintObject(robj *o) {
function _redisAssertWithInfo (line 459) | void _redisAssertWithInfo(redisClient *c, robj *o, char *estr, char *fil...
function _redisPanic (line 465) | void _redisPanic(char *msg, char *file, int line) {
function bugReportStart (line 477) | void bugReportStart(void) {
function logStackContent (line 517) | void logStackContent(void **sp) {
function logRegisters (line 530) | void logRegisters(ucontext_t *uc) {
function logStackTrace (line 661) | void logStackTrace(ucontext_t *uc) {
function logCurrentClient (line 689) | void logCurrentClient(void) {
function memtest_test_linux_anonymous_maps (line 729) | int memtest_test_linux_anonymous_maps(void) {
function sigsegvHandler (line 807) | void sigsegvHandler(int sig, siginfo_t *info, void *secret) {
function redisLogHexDump (line 876) | void redisLogHexDump(int level, char *descr, void *value, size_t len) {
function watchdogSignalHandler (line 901) | void watchdogSignalHandler(int sig, siginfo_t *info, void *secret) {
function watchdogScheduleSignal (line 920) | void watchdogScheduleSignal(int period) {
function enableWatchdog (line 933) | void enableWatchdog(int period) {
function disableWatchdog (line 956) | void disableWatchdog(void) {
FILE: extern/deprecated/redis-2.8.21/src/dict.c
function dictIntHashFunction (line 71) | unsigned int dictIntHashFunction(unsigned int key)
function dictSetHashFunctionSeed (line 84) | void dictSetHashFunctionSeed(uint32_t seed) {
function dictGetHashFunctionSeed (line 88) | uint32_t dictGetHashFunctionSeed(void) {
function dictGenHashFunction (line 103) | unsigned int dictGenHashFunction(const void *key, int len) {
function dictGenCaseHashFunction (line 147) | unsigned int dictGenCaseHashFunction(const unsigned char *buf, int len) {
function _dictReset (line 159) | static void _dictReset(dictht *ht)
function dict (line 168) | dict *dictCreate(dictType *type,
function _dictInit (line 178) | int _dictInit(dict *d, dictType *type,
function dictResize (line 192) | int dictResize(dict *d)
function dictExpand (line 204) | int dictExpand(dict *d, unsigned long size)
function dictRehash (line 237) | int dictRehash(dict *d, int n) {
function timeInMilliseconds (line 276) | long long timeInMilliseconds(void) {
function dictRehashMilliseconds (line 284) | int dictRehashMilliseconds(dict *d, int ms) {
function _dictRehashStep (line 303) | static void _dictRehashStep(dict *d) {
function dictAdd (line 308) | int dictAdd(dict *d, void *key, void *val)
function dictEntry (line 332) | dictEntry *dictAddRaw(dict *d, void *key)
function dictReplace (line 361) | int dictReplace(dict *d, void *key, void *val)
function dictEntry (line 388) | dictEntry *dictReplaceRaw(dict *d, void *key) {
function dictGenericDelete (line 395) | static int dictGenericDelete(dict *d, const void *key, int nofree)
function dictDelete (line 432) | int dictDelete(dict *ht, const void *key) {
function dictDeleteNoFree (line 436) | int dictDeleteNoFree(dict *ht, const void *key) {
function _dictClear (line 441) | int _dictClear(dict *d, dictht *ht, void(callback)(void *)) {
function dictRelease (line 468) | void dictRelease(dict *d)
function dictEntry (line 475) | dictEntry *dictFind(dict *d, const void *key)
function dictFingerprint (line 509) | long long dictFingerprint(dict *d) {
function dictIterator (line 541) | dictIterator *dictGetIterator(dict *d)
function dictIterator (line 554) | dictIterator *dictGetSafeIterator(dict *d) {
function dictEntry (line 561) | dictEntry *dictNext(dictIterator *iter)
function dictReleaseIterator (line 596) | void dictReleaseIterator(dictIterator *iter)
function dictEntry (line 609) | dictEntry *dictGetRandomKey(dict *d)
function rev (line 648) | static unsigned long rev(unsigned long v) {
function dictScan (line 742) | unsigned long dictScan(dict *d,
function _dictExpandIfNeeded (line 816) | static int _dictExpandIfNeeded(dict *d)
function _dictNextPower (line 838) | static unsigned long _dictNextPower(unsigned long size)
function _dictKeyIndex (line 856) | static int _dictKeyIndex(dict *d, const void *key)
function dictEmpty (line 880) | void dictEmpty(dict *d, void(callback)(void*)) {
function dictEnableResize (line 887) | void dictEnableResize(void) {
function dictDisableResize (line 891) | void dictDisableResize(void) {
function _dictPrintStatsHt (line 903) | static void _dictPrintStatsHt(dictht *ht) {
function dictPrintStats (line 947) | void dictPrintStats(dict *d) {
function _dictStringCopyHTHashFunction (line 957) | static unsigned int _dictStringCopyHTHashFunction(const void *key)
function _dictStringCopyHTKeyCompare (line 973) | static int _dictStringCopyHTKeyCompare(void *privdata, const void *key1,
function _dictStringDestructor (line 981) | static void _dictStringDestructor(void *privdata, void *key)
FILE: extern/deprecated/redis-2.8.21/src/dict.h
type dictEntry (line 47) | typedef struct dictEntry {
type dictType (line 58) | typedef struct dictType {
type dictht (line 69) | typedef struct dictht {
type dict (line 76) | typedef struct dict {
type dictIterator (line 88) | typedef struct dictIterator {
FILE: extern/deprecated/redis-2.8.21/src/endianconv.c
function memrev16 (line 49) | void memrev16(void *p) {
function memrev32 (line 59) | void memrev32(void *p) {
function memrev64 (line 72) | void memrev64(void *p) {
function intrev16 (line 89) | uint16_t intrev16(uint16_t v) {
function intrev32 (line 94) | uint32_t intrev32(uint32_t v) {
function intrev64 (line 99) | uint64_t intrev64(uint64_t v) {
function main (line 107) | int main(void) {
FILE: extern/deprecated/redis-2.8.21/src/help.h
type commandHelp (line 21) | struct commandHelp {
FILE: extern/deprecated/redis-2.8.21/src/hyperloglog.c
type hllhdr (line 182) | struct hllhdr {
function MurmurHash64A (line 393) | uint64_t MurmurHash64A (const void * key, int len, unsigned int seed) {
function hllPatLen (line 444) | int hllPatLen(unsigned char *ele, size_t elesize, long *regp) {
function hllDenseAdd (line 485) | int hllDenseAdd(uint8_t *registers, unsigned char *ele, size_t elesize) {
function hllDenseSum (line 504) | double hllDenseSum(uint8_t *registers, double *PE, int *ezp) {
function hllSparseToDense (line 568) | int hllSparseToDense(robj *o) {
function hllSparseAdd (line 638) | int hllSparseAdd(robj *o, unsigned char *ele, size_t elesize) {
function hllSparseSum (line 888) | double hllSparseSum(uint8_t *sparse, int sparselen, double *PE, int *ezp...
function hllRawSum (line 928) | double hllRawSum(uint8_t *registers, double *PE, int *ezp) {
function hllCount (line 967) | uint64_t hllCount(struct hllhdr *hdr, int *invalid) {
function hllAdd (line 1027) | int hllAdd(robj *o, unsigned char *ele, size_t elesize) {
function hllMerge (line 1044) | int hllMerge(uint8_t *max, robj *hll) {
function robj (line 1089) | robj *createHLLObject(void) {
function isHLLObjectOrReply (line 1124) | int isHLLObjectOrReply(redisClient *c, robj *o) {
function pfaddCommand (line 1155) | void pfaddCommand(redisClient *c) {
function pfcountCommand (line 1195) | void pfcountCommand(redisClient *c) {
function pfmergeCommand (line 1285) | void pfmergeCommand(redisClient *c) {
function pfselftestCommand (line 1351) | void pfselftestCommand(redisClient *c) {
function pfdebugCommand (line 1455) | void pfdebugCommand(redisClient *c) {
FILE: extern/deprecated/redis-2.8.21/src/intset.c
function _intsetValueEncoding (line 45) | static uint8_t _intsetValueEncoding(int64_t v) {
function _intsetGetEncoded (line 55) | static int64_t _intsetGetEncoded(intset *is, int pos, uint8_t enc) {
function _intsetGet (line 76) | static int64_t _intsetGet(intset *is, int pos) {
Copy disabled (too large)
Download .json
Condensed preview — 2968 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (16,645K chars).
[
{
"path": ".gitignore",
"chars": 109,
"preview": "*.log\n*.swp\n*.out\n*.dump\n*.log.*\n*.tmp\n*.rdb\n\n.DS_Store\n.htaccess\n\n/bin\n/tmp\n/pkg/utils/version.go\n\nmakefile\n"
},
{
"path": ".travis.yml",
"chars": 851,
"preview": "language: go\n\nos:\n - linux\n - osx\n\ngo:\n - 1.11.x\n - 1.10.x\n - 1.9.x\n - 1.8.x\n\nscript:\n - make\n -"
},
{
"path": "Dockerfile",
"chars": 281,
"preview": "FROM golang:1.8\n\nRUN apt-get update\nRUN apt-get install -y autoconf\n\nENV GOPATH /gopath\nENV CODIS ${GOPATH}/src/github."
},
{
"path": "Godeps/Godeps.json",
"chars": 3530,
"preview": "{\n\t\"ImportPath\": \"github.com/CodisLabs/codis\",\n\t\"GoVersion\": \"go1.8\",\n\t\"GodepVersion\": \"v79\",\n\t\"Packages\": [\n\t\t\"./...\"\n\t"
},
{
"path": "Godeps/Readme",
"chars": 136,
"preview": "This directory tree is generated automatically by godep.\n\nPlease do not edit.\n\nSee https://github.com/tools/godep for mo"
},
{
"path": "MIT-LICENSE.txt",
"chars": 1076,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 CodisLabs\n\nPermission is hereby granted, free of charge, to any person obtaini"
},
{
"path": "Makefile",
"chars": 1722,
"preview": ".DEFAULT_GOAL := build-all\n\nexport GO15VENDOREXPERIMENT=1\n\nbuild-all: codis-server codis-dashboard codis-proxy codis-adm"
},
{
"path": "README.md",
"chars": 3117,
"preview": "<img src=\"doc/pictures/logo-3.png\" height=80></img>\n\n[](https://gitte"
},
{
"path": "admin/codis-dashboard-admin.sh",
"chars": 2282,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "admin/codis-fe-admin.sh",
"chars": 1796,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "admin/codis-proxy-admin.sh",
"chars": 2102,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "admin/codis-server-admin.sh",
"chars": 1722,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "ansible/group_vars/all",
"chars": 411,
"preview": "---\ncodis_dir: /home/codis/codis\n\ncoordinator_name: filesystem\n\ncoordinator_addr: /tmp/codis\n\ncodis_install_dir: /data/c"
},
{
"path": "ansible/hosts",
"chars": 158,
"preview": "[codis-dashboard-servers]\n127.0.0.1\n[codis-proxy-servers]\n127.0.0.1\n[codis-servers]\n127.0.0.1\n[codis-fe-servers]\n127.0.0"
},
{
"path": "ansible/roles/codis-dashboard/tasks/main.yml",
"chars": 673,
"preview": "---\n- name: Copy codis-admin binary\n copy: src={{ codis_dir }}/bin/codis-admin dest={{ codis_install_dir }}/bin/codis-a"
},
{
"path": "ansible/roles/codis-dashboard/templates/codis-dashboard-admin.sh",
"chars": 2311,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "ansible/roles/codis-dashboard/templates/dashboard.toml",
"chars": 1155,
"preview": "\n##################################################\n# #\n# "
},
{
"path": "ansible/roles/codis-fe/tasks/main.yml",
"chars": 462,
"preview": "---\n- name: Copy codis-fe binary\n copy: src={{ codis_dir }}/bin/codis-fe dest={{ codis_install_dir }}/bin/codis-fe mode"
},
{
"path": "ansible/roles/codis-fe/templates/codis-fe-admin.sh",
"chars": 1820,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "ansible/roles/codis-proxy/tasks/main.yml",
"chars": 498,
"preview": "---\n- name: Copy codis-proxy binary\n copy: src={{ codis_dir }}/bin/codis-proxy dest={{ codis_install_dir }}/bin/codis-p"
},
{
"path": "ansible/roles/codis-proxy/templates/codis-proxy-admin.sh",
"chars": 2107,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "ansible/roles/codis-proxy/templates/proxy.toml",
"chars": 3521,
"preview": "\n##################################################\n# #\n# "
},
{
"path": "ansible/roles/codis-server/tasks/main.yml",
"chars": 631,
"preview": "---\n- name: Create codis server work directory\n file: path={{ codis_server_workdir }} state=directory owner=codis group"
},
{
"path": "ansible/roles/codis-server/templates/codis-server-admin.sh",
"chars": 1804,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "ansible/roles/codis-server/templates/redis.conf",
"chars": 46843,
"preview": "# Redis configuration file example.\n#\n# Note that in order to read the configuration file, Redis must be\n# started with "
},
{
"path": "ansible/roles/common/tasks/main.yml",
"chars": 479,
"preview": "---\n- name: Create codis install directory\n file: path={{ codis_install_dir }} state=directory owner=codis group=codis\n"
},
{
"path": "ansible/roles/redis-sentinel/tasks/main.yml",
"chars": 657,
"preview": "---\n- name: Create redis sentinel work directory\n file: path={{ redis_sentinel_workdir }} state=directory owner=codis g"
},
{
"path": "ansible/roles/redis-sentinel/templates/redis-sentinel-admin.sh",
"chars": 1873,
"preview": "#!/usr/bin/env bash\n\nCODIS_ADMIN=\"${BASH_SOURCE-$0}\"\nCODIS_ADMIN=\"$(dirname \"${CODIS_ADMIN}\")\"\nCODIS_ADMIN_DIR=\"$(cd \"${"
},
{
"path": "ansible/roles/redis-sentinel/templates/sentinel.conf",
"chars": 7827,
"preview": "# Example sentinel.conf\n\n# *** IMPORTANT ***\n#\n# By default Sentinel will not be reachable from interfaces different tha"
},
{
"path": "ansible/site.yml",
"chars": 629,
"preview": "---\n- name: codis environment init\n hosts: all\n remote_user: codis\n roles:\n - common\n\n- name: Install codis-dashbo"
},
{
"path": "cmd/admin/admin.go",
"chars": 10870,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/admin/dashboard.go",
"chars": 21214,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/admin/main.go",
"chars": 4522,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/admin/proxy.go",
"chars": 4577,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/dashboard/main.go",
"chars": 5084,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/fe/assets/css/main.css",
"chars": 5359,
"preview": "body {\n min-height: 20000px;\n min-width: 1000px;\n}\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cl"
},
{
"path": "cmd/fe/assets/dashboard-fe.js",
"chars": 52347,
"preview": "'use strict';\n\nvar dashboard = angular.module('dashboard-fe', [\"highcharts-ng\", \"ui.bootstrap\"]);\n\nfunction genXAuth(nam"
},
{
"path": "cmd/fe/assets/index.html",
"chars": 45130,
"preview": "<!doctype html>\n<html lang=\"en\" ng-app=\"dashboard-fe\" data-framework=\"angularjs\">\n<head>\n <meta charset=\"utf-8\">\n "
},
{
"path": "cmd/fe/assets/package.json",
"chars": 261,
"preview": "{\n \"dependencies\": {\n \"angular\": \"^1.4.8\",\n \"angular-ui-bootstrap\": \"^0.14.3\",\n \"bootstrap\": \"^3.3.6\",\n \"bo"
},
{
"path": "cmd/fe/main.go",
"chars": 8379,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/ha/main.go",
"chars": 9790,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "cmd/proxy/main.go",
"chars": 8940,
"preview": "// Copyright 2016 CodisLabs. All Rights Reserved.\n// Licensed under the MIT (MIT-LICENSE.txt) license.\n\npackage main\n\nim"
},
{
"path": "config/dashboard.toml",
"chars": 1215,
"preview": "\n##################################################\n# #\n# "
},
{
"path": "config/proxy.toml",
"chars": 3903,
"preview": "\n##################################################\n# #\n# "
},
{
"path": "config/redis.conf",
"chars": 46711,
"preview": "# Redis configuration file example.\n#\n# Note that in order to read the configuration file, Redis must be\n# started with "
},
{
"path": "config/sentinel.conf",
"chars": 7614,
"preview": "# Example sentinel.conf\n\n# *** IMPORTANT ***\n#\n# By default Sentinel will not be reachable from interfaces different tha"
},
{
"path": "deploy/Makefile",
"chars": 70,
"preview": "all:\n\t@cd products && for d in `ls .`; do make -C $$d || exit 1; done\n"
},
{
"path": "deploy/products/alpha/.gitignore",
"chars": 14,
"preview": "instance.json\n"
},
{
"path": "deploy/products/alpha/Makefile",
"chars": 30,
"preview": "all:\n\t./gen.py && ./render.py\n"
},
{
"path": "deploy/products/alpha/config.json",
"chars": 421,
"preview": "{\n \"product_name\": \"demo-alpha\",\n \"product_auth\": \"\",\n \"dashboard\": {\n \"admin_addr\": \"127.0.0.1:18080\",\n"
},
{
"path": "deploy/products/alpha/gen.py",
"chars": 782,
"preview": "#!/usr/bin/env python3\n\nimport json\n\nproxy = {\n \"\": [\n \"127.0.0.1\",\n ]\n }\n\nproxy_lis"
},
{
"path": "deploy/products/alpha/render.py",
"chars": 7522,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport json\nimport stat\n\ntemplate_root = \"../../templates\"\ngenerate_root = \"../../root"
},
{
"path": "deploy/products/beta/.gitignore",
"chars": 14,
"preview": "instance.json\n"
},
{
"path": "deploy/products/beta/Makefile",
"chars": 30,
"preview": "all:\n\t./gen.py && ./render.py\n"
},
{
"path": "deploy/products/beta/config.json",
"chars": 802,
"preview": "{\n \"env\": {\n \"bin_path\": \"/opt/codis/bin\",\n \"etc_path\": \"/opt/codis/etc\",\n \"log_path\": \"/opt/cod"
},
{
"path": "deploy/products/beta/gen.py",
"chars": 924,
"preview": "#!/usr/bin/env python3\n\nimport json\n\nproxy = {\n \"dc1\": [\n \"10.4.10.200\",\n \"10.4.10.201\",\n "
},
{
"path": "deploy/products/beta/render.py",
"chars": 7522,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport json\nimport stat\n\ntemplate_root = \"../../templates\"\ngenerate_root = \"../../root"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.200_19000/codis_proxy_19000.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19000\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.200_19000/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.200_19000/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.2.16.200:11080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.200_19002/codis_proxy_19002.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19002\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.200_19002/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.200_19002/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.2.16.200:11082 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.201_19000/codis_proxy_19000.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19000\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.201_19000/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.201_19000/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.2.16.201:11080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.201_19002/codis_proxy_19002.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19002\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.201_19002/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.201_19002/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.2.16.201:11082 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.202_19000/codis_proxy_19000.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19000\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.202_19000/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.202_19000/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.2.16.202:11080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.202_19002/codis_proxy_19002.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19002\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.202_19002/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.2.16.202_19002/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.2.16.202:11082 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.100_18080/codis_dashboard_18080.service",
"chars": 260,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@18080\n[Service]\nExecStart=/opt/codis/bin/codis-dashboard \\\n --config=/opt/codis/"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.100_18080/dashboard.toml",
"chars": 1044,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.100_18080/dashboard_admin",
"chars": 96,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --dashboard=10.4.10.100:18080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.100_18080/foreach_proxy",
"chars": 701,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\nd=1\nsleep $d; /opt/codis/bin/codis-admin --proxy=10.4.10.200:11080 $@\nsleep $d; /opt"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.100_18080/foreach_proxy_online",
"chars": 1111,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\nd=1\nsleep $d; /opt/codis/bin/codis-admin --dashboard=10.4.10.100:18080 --online-prox"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.100_18080/foreach_proxy_reinit",
"chars": 1111,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\nd=1\nsleep $d; /opt/codis/bin/codis-admin --dashboard=10.4.10.100:18080 --reinit-prox"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.200_19000/codis_proxy_19000.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19000\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.200_19000/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.200_19000/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.4.10.200:11080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.200_19002/codis_proxy_19002.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19002\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.200_19002/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.200_19002/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.4.10.200:11082 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.201_19000/codis_proxy_19000.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19000\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.201_19000/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.201_19000/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.4.10.201:11080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.201_19002/codis_proxy_19002.service",
"chars": 287,
"preview": "[Unit]\nDescription=Codis-[demo-beta]@19002\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n --"
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.201_19002/proxy.toml",
"chars": 3047,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/10.4.10.201_19002/proxy_admin",
"chars": 92,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=10.4.10.201:11082 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_18080/codis_dashboard_18080.service",
"chars": 257,
"preview": "[Unit]\nDescription=Codis-[demo-alpha]@18080\n[Service]\nExecStart=/opt/codis/bin/codis-dashboard \\\n --config=/opt/codis"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_18080/dashboard.toml",
"chars": 968,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_18080/dashboard_admin",
"chars": 94,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --dashboard=127.0.0.1:18080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_18080/foreach_proxy",
"chars": 233,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\nd=1\nsleep $d; /opt/codis/bin/codis-admin --proxy=127.0.0.1:11080 $@\nsleep $d; /opt/c"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_18080/foreach_proxy_online",
"chars": 350,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\nd=1\nsleep $d; /opt/codis/bin/codis-admin --dashboard=127.0.0.1:18080 --online-proxy "
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_18080/foreach_proxy_reinit",
"chars": 350,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\nd=1\nsleep $d; /opt/codis/bin/codis-admin --dashboard=127.0.0.1:18080 --reinit-proxy "
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19000/codis_proxy_19000.service",
"chars": 284,
"preview": "[Unit]\nDescription=Codis-[demo-alpha]@19000\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n -"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19000/proxy.toml",
"chars": 2950,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19000/proxy_admin",
"chars": 90,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=127.0.0.1:11080 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19001/codis_proxy_19001.service",
"chars": 284,
"preview": "[Unit]\nDescription=Codis-[demo-alpha]@19001\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n -"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19001/proxy.toml",
"chars": 2950,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19001/proxy_admin",
"chars": 90,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=127.0.0.1:11081 $@\n"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19002/codis_proxy_19002.service",
"chars": 284,
"preview": "[Unit]\nDescription=Codis-[demo-alpha]@19002\n[Service]\nExecStart=/opt/codis/bin/codis-proxy --ncpu=4 --max-ncpu=8 \\\n -"
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19002/proxy.toml",
"chars": 2950,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/root/opt/codis/etc/127.0.0.1_19002/proxy_admin",
"chars": 90,
"preview": "#!/usr/bin/env bash\n\nset -x\nset -e\n\n/opt/codis/bin/codis-admin --proxy=127.0.0.1:11082 $@\n"
},
{
"path": "deploy/templates/dashboard.service.template",
"chars": 250,
"preview": "[Unit]\nDescription=Codis-[{PRODUCT_NAME}]@{ADMIN_PORT}\n[Service]\nExecStart={BIN_PATH}/codis-dashboard \\\n --config={ET"
},
{
"path": "deploy/templates/dashboard.toml.template",
"chars": 1035,
"preview": "##################################################\n# #\n# "
},
{
"path": "deploy/templates/proxy.service.template",
"chars": 300,
"preview": "[Unit]\nDescription=Codis-[{PRODUCT_NAME}]@{PROXY_PORT}\n[Service]\nExecStart={BIN_PATH}/codis-proxy --ncpu={MIN_CPU} --max"
},
{
"path": "deploy/templates/proxy.toml.template",
"chars": 3016,
"preview": "##################################################\n# #\n# "
},
{
"path": "doc/FAQ_en.md",
"chars": 1287,
"preview": "####What is Codis?\nCodis is a distributed redis service developed by wandoujia infrasstructure team, codis can be viewed"
},
{
"path": "doc/FAQ_zh.md",
"chars": 6490,
"preview": "### Codis 是什么?\n\nCodis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务, 用户可以看成是一个无限内存的 Redis 服务, 有动态扩/缩容的能力. 对偏存储型的业务更实"
},
{
"path": "doc/bench1/Makefile",
"chars": 108,
"preview": "all:\n\tgnuplot bench.plot\n\tconvert -density 300 bench.pdf -quality 90 -background white -alpha off bench.png\n"
},
{
"path": "doc/bench1/bench.plot",
"chars": 3176,
"preview": "set terminal pdfcairo enhanced color lw 1.2 size 20cm,34cm\nset output 'bench.pdf'\n\nset border 11 back\n\nset tics font \",1"
},
{
"path": "doc/bench1/input1",
"chars": 624,
"preview": "1 35275.01 17680.675 18808.07 1 1 1\n2 72842.26 30272.58 32675.88 1 1 1\n3 101501.92 61790.96"
},
{
"path": "doc/bench1/input2",
"chars": 672,
"preview": "1 456597.59 23740.63 323324.175 1 1 1\n2 446909.715 43555.16 489904.325 2 1 1\n3 449501.985 85"
},
{
"path": "doc/bench1/input3",
"chars": 637,
"preview": "1 58505.19 1496.54 55020.63 2 1 7\n2 57595.39 3106.7 80176.39 5 1 8\n3 47003.52 6401.74 "
},
{
"path": "doc/bench2/Makefile",
"chars": 108,
"preview": "all:\n\tgnuplot bench.plot\n\tconvert -density 300 bench.pdf -quality 90 -background white -alpha off bench.png\n"
},
{
"path": "doc/bench2/bench.plot",
"chars": 6376,
"preview": "set terminal pdfcairo enhanced color lw 1.2 size 20cm,58cm\nset output 'bench.pdf'\n\nset border 11 back\n\nset tics font \",1"
},
{
"path": "doc/bench2/input1",
"chars": 936,
"preview": "1 18557.08 10126.97 10883.62 10796.98 11399.43 1 1 1 1 1\n2 37087.41 19901.09 22334.27 20070.87 22"
},
{
"path": "doc/bench2/input2",
"chars": 1062,
"preview": "1 217536.05 13450.21 212852.50 14612.26 190323.13 1 2 1 1 1\n2 226996.26 27849.18 304040.84 27"
},
{
"path": "doc/bench2/input3",
"chars": 1014,
"preview": "1 32791.18 752.88 36521.68 818.00 30865.15 4 2 1 2 1\n2 31797.51 1592.48 57084.14 1608.30 5"
},
{
"path": "doc/bench2/input4",
"chars": 988,
"preview": "1 18213.37 8363.70 10106.52 9801.79 10729.49 0 0 0 0 0\n2 33021.27 15056.21 18510.74 16631.42"
},
{
"path": "doc/bench2/input5",
"chars": 1078,
"preview": "1 5073.26 11934.46 226841.37 15205.84 214063.54 25 17 1 7 0\n2 9444.98 20950.69 299400.73 2"
},
{
"path": "doc/benchmark.md",
"chars": 2531,
"preview": "\n## Performance (Benchmark)\n#### Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz x 1 + 16G RAM\n+ Archlinux: 4.0.5-1-ARCH #1 SMP "
},
{
"path": "doc/pictures/.gitignore",
"chars": 4,
"preview": "tmp\n"
},
{
"path": "doc/pictures/Makefile",
"chars": 172,
"preview": "all:\n\t@mkdir -p tmp\n\t@xelatex -output-directory tmp architecture.tex\n\t@convert -density 300 tmp/architecture.pdf -qualit"
},
{
"path": "doc/pictures/architecture.tex",
"chars": 4077,
"preview": "\\documentclass{article}\n\\usepackage[letterpaper, landscape, margin=2in]{geometry}\n\\usepackage[active,tightpage]{preview}"
},
{
"path": "doc/redis_change_zh.md",
"chars": 6406,
"preview": "### redis 修改部分(增加若干指令) \n--------------------------------\n\n##### SLOTSINFO [start] [count] \n\n+ 命令说明:获取 redis 中 slot 的个数以及"
},
{
"path": "doc/tutorial_en.md",
"chars": 9466,
"preview": "# Codis Tutorial\n\nCodis is a distributed Redis solution, there is no obvious difference between connecting to a Codis pr"
},
{
"path": "doc/tutorial_zh.md",
"chars": 17390,
"preview": "# Codis 使用文档\n\nCodis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有显著区别 ([不支持的命令列表](unsupported_cmd"
},
{
"path": "doc/unsupported_cmds.md",
"chars": 3650,
"preview": "These commands are disallowed in codis proxy, if you use them, proxy will close the connection to warn you.\n\n| Command"
},
{
"path": "example/.gitignore",
"chars": 72,
"preview": "*.conf\n*.toml\n*.pyc\n*.log\n*.rdb\n*.tmp\n*.swp\n\n.idea\n__pycache__\n\n/rootfs\n"
},
{
"path": "example/Makefile",
"chars": 94,
"preview": "all: clean\n\t@python3 setup.py\n\nclean:\n\t@rm -f *.conf *.toml *.pyc *.log *.rdb\n\t@rm -rf rootfs\n"
},
{
"path": "example/dashboard.py",
"chars": 2338,
"preview": "#!/usr/bin/env python3\n\nfrom utils import *\n\nimport atexit\nimport json\nimport datetime\n\n\nclass CodisDashboard(Process):\n"
},
{
"path": "example/fe.py",
"chars": 780,
"preview": "#!/usr/bin/env python3\n\nfrom utils import *\n\nimport atexit\nimport json\nimport datetime\n\n\nclass CodisFE(Process):\n\n de"
},
{
"path": "example/proxy.py",
"chars": 2701,
"preview": "#!/usr/bin/env python3\n\nfrom utils import *\n\nimport atexit\nimport json\nimport datetime\n\n\nclass CodisProxy(Process):\n\n "
},
{
"path": "example/sentinel.py",
"chars": 1015,
"preview": "#!/usr/bin/env python3\n\nfrom utils import *\n\nimport atexit\nimport json\nimport datetime\n\n\nclass CodisSentinel(Process):\n\n"
},
{
"path": "example/sentinel_notify.sh",
"chars": 44,
"preview": "#!/bin/bash\n\necho $@ >> sentinel_notify.log\n"
},
{
"path": "example/sentinel_reconfig.sh",
"chars": 46,
"preview": "#!/bin/bash\n\necho $@ >> sentinel_reconfig.log\n"
},
{
"path": "example/server.py",
"chars": 1618,
"preview": "#!/usr/bin/env python3\n\nfrom utils import *\n\nimport atexit\nimport json\nimport datetime\n\n\nclass CodisServer(Process):\n\n "
},
{
"path": "example/setup.py",
"chars": 2555,
"preview": "#!/usr/bin/env python3\n\nfrom server import *\nfrom sentinel import *\nfrom dashboard import *\nfrom proxy import *\nfrom fe "
},
{
"path": "example/utils.py",
"chars": 1434,
"preview": "#!/usr/bin/env python3\n\nimport subprocess\nimport time\nimport os\n\n\nclass Process:\n\n def __init__(self, command, logfil"
},
{
"path": "extern/.gitignore",
"chars": 12,
"preview": "/Dockerfile\n"
},
{
"path": "extern/README.md",
"chars": 40,
"preview": "codis's redis build & external librarys\n"
},
{
"path": "extern/deprecated/redis-2.8.21/.gitignore",
"chars": 332,
"preview": ".*.swp\n*.o\n*.log\ndump.rdb\nredis-benchmark\nredis-check-aof\nredis-check-dump\nredis-cli\nredis-sentinel\nredis-server\ndoc-too"
},
{
"path": "extern/deprecated/redis-2.8.21/00-RELEASENOTES",
"chars": 32622,
"preview": "Redis 2.8 release notes\n=======================\n\n** IMPORTANT ** Check the 'Migrating from 2.6 to 2.8' section at the en"
},
{
"path": "extern/deprecated/redis-2.8.21/0000-redis.patch",
"chars": 41101,
"preview": "diff --git a/extern/redis-2.8.21/redis.conf b/extern/redis-2.8.21/redis.conf\nindex 6c76569..0dadba0 100644\n--- a/extern/"
},
{
"path": "extern/deprecated/redis-2.8.21/0001-slotsscan.patch",
"chars": 3433,
"preview": "diff --git a/extern/redis-2.8.21/src/redis.c b/extern/redis-2.8.21/src/redis.c\nindex 21e75d0..33ba3a3 100644\n--- a/exter"
},
{
"path": "extern/deprecated/redis-2.8.21/0002-rehash.patch",
"chars": 1364,
"preview": "diff --git a/extern/redis-2.8.21/src/redis.c b/extern/redis-2.8.21/src/redis.c\nindex 33ba3a3..f035bb2 100644\n--- a/exter"
},
{
"path": "extern/deprecated/redis-2.8.21/BUGS",
"chars": 53,
"preview": "Please check https://github.com/antirez/redis/issues\n"
},
{
"path": "extern/deprecated/redis-2.8.21/CONTRIBUTING",
"chars": 1439,
"preview": "Note: by contributing code to the Redis project in any form, including sending\na pull request via Github, a code fragmen"
},
{
"path": "extern/deprecated/redis-2.8.21/COPYING",
"chars": 1487,
"preview": "Copyright (c) 2006-2015, Salvatore Sanfilippo\nAll rights reserved.\n\nRedistribution and use in source and binary forms, w"
},
{
"path": "extern/deprecated/redis-2.8.21/INSTALL",
"chars": 11,
"preview": "See README\n"
},
{
"path": "extern/deprecated/redis-2.8.21/MANIFESTO",
"chars": 4223,
"preview": "[Note: this is the Redis manifesto, for general information about\n installing and running Redis read the README fi"
},
{
"path": "extern/deprecated/redis-2.8.21/Makefile",
"chars": 151,
"preview": "# Top level makefile, the real shit is at src/Makefile\n\ndefault: all\n\n.DEFAULT:\n\tcd src && $(MAKE) $@\n\ninstall:\n\tcd src "
},
{
"path": "extern/deprecated/redis-2.8.21/README",
"chars": 5199,
"preview": "Where to find complete Redis documentation?\n-------------------------------------------\n\nThis README is just a fast \"qui"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/Makefile",
"chars": 2480,
"preview": "# Redis dependency Makefile\n\nuname_S:= $(shell sh -c 'uname -s 2>/dev/null || echo not')\n\nCCCOLOR=\"\\033[34m\"\nLINKCOLOR=\""
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/.gitignore",
"chars": 66,
"preview": "/hiredis-test\n/examples/hiredis-example*\n/*.o\n/*.so\n/*.dylib\n/*.a\n"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/.travis.yml",
"chars": 68,
"preview": "language: c\ncompiler:\n - gcc\n - clang\n\nscript: make && make check\n"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/CHANGELOG.md",
"chars": 701,
"preview": "### 0.11.0\n\n* Increase the maximum multi-bulk reply depth to 7.\n\n* Increase the read buffer size from 2k to 16k.\n\n* Use "
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/COPYING",
"chars": 1588,
"preview": "Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\nCopyright (c) 2010-2011, Pieter Noordhuis <pcno"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/Makefile",
"chars": 5166,
"preview": "# Hiredis Makefile\n# Copyright (C) 2010-2011 Salvatore Sanfilippo <antirez at gmail dot com>\n# Copyright (C) 2010-2011 P"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/README.md",
"chars": 17437,
"preview": "[](https://travis-ci.org/redis/hiredis)\n\n# HIREDIS\n\nHiredis is a"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/adapters/ae.h",
"chars": 4219,
"preview": "/*\n * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>\n *\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/adapters/libev.h",
"chars": 4587,
"preview": "/*\n * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>\n *\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/adapters/libevent.h",
"chars": 3980,
"preview": "/*\n * Copyright (c) 2010-2011, Pieter Noordhuis <pcnoordhuis at gmail dot com>\n *\n * All rights reserved.\n *\n * Redistri"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/adapters/libuv.h",
"chars": 2487,
"preview": "#ifndef __HIREDIS_LIBUV_H__\n#define __HIREDIS_LIBUV_H__\n#include <uv.h>\n#include \"../hiredis.h\"\n#include \"../async.h\"\n#i"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/async.c",
"chars": 22338,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/async.h",
"chars": 5021,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/dict.c",
"chars": 10549,
"preview": "/* Hash table implementation.\n *\n * This file implements in memory hash tables with insert/del/replace/find/\n * get-rand"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/dict.h",
"chars": 4691,
"preview": "/* Hash table implementation.\n *\n * This file implements in memory hash tables with insert/del/replace/find/\n * get-rand"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-ae.c",
"chars": 1583,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-libev.c",
"chars": 1405,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-libevent.c",
"chars": 1455,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/examples/example-libuv.c",
"chars": 1445,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\n#include <hiredis.h>\n#include <async.h>\n"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/examples/example.c",
"chars": 2236,
"preview": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <hiredis.h>\n\nint main(int argc, char **argv) {\n "
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/fmacros.h",
"chars": 396,
"preview": "#ifndef __HIREDIS_FMACRO_H\n#define __HIREDIS_FMACRO_H\n\n#if !defined(_BSD_SOURCE)\n#define _BSD_SOURCE\n#endif\n\n#if defined"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/hiredis.c",
"chars": 38056,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/hiredis.h",
"chars": 9403,
"preview": "/*\n * Copyright (c) 2009-2011, Salvatore Sanfilippo <antirez at gmail dot com>\n * Copyright (c) 2010-2011, Pieter Noordh"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/net.c",
"chars": 12238,
"preview": "/* Extracted from anet.c to work properly with Hiredis error reporting.\n *\n * Copyright (c) 2006-2011, Salvatore Sanfili"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/net.h",
"chars": 2453,
"preview": "/* Extracted from anet.c to work properly with Hiredis error reporting.\n *\n * Copyright (c) 2006-2011, Salvatore Sanfili"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/sds.c",
"chars": 34743,
"preview": "/* SDSLib, A C dynamic strings library\n *\n * Copyright (c) 2006-2012, Salvatore Sanfilippo <antirez at gmail dot com>\n *"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/sds.h",
"chars": 3622,
"preview": "/* SDSLib, A C dynamic strings library\n *\n * Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>\n *"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/test.c",
"chars": 25570,
"preview": "#include \"fmacros.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <strings.h>\n#include <sys/time."
},
{
"path": "extern/deprecated/redis-2.8.21/deps/hiredis/zmalloc.h",
"chars": 267,
"preview": "/* Drop in replacement for zmalloc.h in order to just use libc malloc without\n * any wrappering. */\n\n#ifndef ZMALLOC_H\n#"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/.gitignore",
"chars": 1460,
"preview": "/*.gcov.*\n\n/autom4te.cache/\n\n/bin/jemalloc.sh\n\n/config.stamp\n/config.log\n/config.status\n/configure\n\n/doc/html.xsl\n/doc/m"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/COPYING",
"chars": 1703,
"preview": "Unless otherwise specified, files in the jemalloc source distribution are\nsubject to the following license:\n------------"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/ChangeLog",
"chars": 24322,
"preview": "Following are change highlights associated with official releases. Important\nbug fixes are all mentioned, but internal "
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/INSTALL",
"chars": 11046,
"preview": "Building and installing jemalloc can be as simple as typing the following while\nin the root directory of the source tree"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/Makefile.in",
"chars": 15962,
"preview": "# Clear out all vpaths, then set just one (default vpath) for the main build\n# directory.\nvpath\nvpath % .\n\n# Clear the d"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/README",
"chars": 1084,
"preview": "jemalloc is a general purpose malloc(3) implementation that emphasizes\nfragmentation avoidance and scalable concurrency "
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/autogen.sh",
"chars": 266,
"preview": "#!/bin/sh\n\nfor i in autoconf; do\n echo \"$i\"\n $i\n if [ $? -ne 0 ]; then\n\techo \"Error $? in $i\"\n\texit 1\n fi\ndo"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/bin/jemalloc.sh.in",
"chars": 151,
"preview": "#!/bin/sh\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\n\n@LD_PRELOAD_VAR@=${libdir}/libjemalloc.@SOREV@\nexp"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/bin/pprof",
"chars": 171375,
"preview": "#! /usr/bin/env perl\n\n# Copyright (c) 1998-2007, Google Inc.\n# All rights reserved.\n# \n# Redistribution and use in sourc"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/config.guess",
"chars": 45297,
"preview": "#! /bin/sh\n# Attempt to guess a canonical system name.\n# Copyright 1992-2013 Free Software Foundation, Inc.\n\ntimestamp"
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/config.stamp.in",
"chars": 0,
"preview": ""
},
{
"path": "extern/deprecated/redis-2.8.21/deps/jemalloc/config.sub",
"chars": 35594,
"preview": "#! /bin/sh\n# Configuration validation subroutine script.\n# Copyright 1992-2013 Free Software Foundation, Inc.\n\ntimesta"
}
]
// ... and 2768 more files (download for full content)
About this extraction
This page contains the full source code of the CodisLabs/codis GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2968 files (28.1 MB), approximately 4.1M tokens, and a symbol index with 10690 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.