Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Sync changes from twitter/twemproxy #61

Open
wants to merge 92 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
1e078e9
Fix typo circunous -> circonus
postwait Jul 26, 2016
ced2044
Merge pull request #484 from postwait/patch-1
andyqzb Aug 1, 2016
558e0d4
fix a memory leak bug for mset command
deep011 Aug 3, 2016
330f43a
Merge pull request #486 from deep011/deep011-patch-1
andyqzb Aug 4, 2016
eed1953
Update redis docs for PING and QUIT
rohitpaulk Aug 9, 2016
e573933
Merge pull request #489 from rohitpaulk/update-redis-docs
manjuraj Aug 9, 2016
b87ba1a
Fix typo
kalifg Aug 30, 2016
80ef6a7
Update README.md
dennismartensson Sep 1, 2016
fe68175
Update the sensu-metrics link
mortonfox Sep 2, 2016
017d445
Merge pull request #494 from mortonfox/patch-1
manjuraj Sep 3, 2016
6fd9220
Merge pull request #493 from dennismartensson/patch-1
manjuraj Sep 3, 2016
0f9e1ba
Merge pull request #492 from kalifg/patch-1
manjuraj Sep 3, 2016
1dd442b
fix typo README.md
Feb 11, 2017
34eb60f
Merge pull request #517 from takayamaki/fix_typo
manjuraj Feb 11, 2017
2c1567b
Initial version Dockerfile.
pataquets Mar 29, 2017
a2159df
fix list indentation
essanpupil Nov 13, 2017
85fb83f
Initialize file permissions field for unix domain socket
TysonAndre Dec 19, 2017
ee44974
Adding issue and pull request templates to comply with twitter OSS po…
pavanky Feb 15, 2018
141e621
allow spop can parameters
charsyam Mar 22, 2018
6885783
move spop to use redis_argn
charsyam Mar 22, 2018
67d8848
Merge pull request #548 from pavanky/master
manjuraj Jun 8, 2018
c5c725d
Merge pull request #551 from charsyam/feature/fix_spop
manjuraj Jun 13, 2018
e350a6e
Improve formatting of README file
Jan 2, 2019
fc02f09
Fix README typo
raghukul01 Feb 26, 2019
62b724a
Merge branch 'master' of github.com:twitter/twemproxy
pataquets May 13, 2019
c6cc79a
Merge pull request #524 from pataquets/master
manjuraj Nov 5, 2020
48e3f39
Merge pull request #571 from raghukul01/master
manjuraj Nov 5, 2020
a575ab2
Add a clang-format file approximating the c style guide
TysonAndre May 11, 2021
f68f86c
Fix typo in c style guide
TysonAndre May 11, 2021
0421ad3
[skip ci] Add .editorconfig
TysonAndre May 11, 2021
1fde0f4
Merge pull request #602 from ifwe/twitter-editorconfig
manjuraj May 12, 2021
973ef77
Fix failing unit tests, run in Docker
TysonAndre Apr 9, 2021
3140cda
Add nosetests_verbose.sh script
TysonAndre Apr 9, 2021
96a9fbd
Remove accidentally committed file
TysonAndre Apr 9, 2021
e25f23e
Start using github workflow to build branches and PRs
TysonAndre Apr 9, 2021
d224107
Fix second check
TysonAndre Apr 9, 2021
8caa0a2
Update test of auth for redis 6+
TysonAndre Apr 9, 2021
5c2a373
Merge pull request #598 from ifwe/update-unit-tests
TysonAndre Jun 30, 2021
0667d61
Don't hang for dns error responding to fragmented requests
TysonAndre Mar 19, 2021
05032ce
Switch to GitHub actions for builds
TysonAndre Jun 30, 2021
95e8de5
Merge pull request #607 from twitter/twitter-switch-github-actions
TysonAndre Jun 30, 2021
eca60d6
Merge pull request #597 from ifwe/twitter-dns-lookup-error-tolerance
TysonAndre Jun 30, 2021
f96e354
Merge pull request #601 from ifwe/twitter-clangformat
TysonAndre Jun 30, 2021
8ebfd61
Use nservers instead of ncontinuum
TysonAndre Feb 24, 2021
3558a39
Don't fragment memcache get commands with a single key
TysonAndre Apr 9, 2021
14bac40
Follow c style guide
TysonAndre Jun 30, 2021
0984586
Merge pull request #595 from ifwe/twitter-use-nservers-instead-of-nco…
TysonAndre Jun 30, 2021
d81d8c4
Merge pull request #545 from TysonAndre/unset-perm-twitter
TysonAndre Jun 30, 2021
cb81d61
FIX: increase the host length to 273 in ketama_update, check the host…
Nov 22, 2018
25d540d
Add various unit tests and integration tests
TysonAndre Jul 1, 2021
0b98d99
Sync changes to Dockerfile, install redis-py 3.5.3
TysonAndre Jul 1, 2021
cb6c564
Merge pull request #610 from ifwe/twitter-add-unit-test
TysonAndre Jul 1, 2021
b97f720
Fix parsing of error message without space
TysonAndre May 1, 2021
7a4e7ad
Update changelog entries
TysonAndre Jul 1, 2021
ace7c2d
Merge pull request #611 from ifwe/twitter-fix-redis-err-no-space
TysonAndre Jul 1, 2021
77f033a
Support various commands from newer redis versions
TysonAndre Apr 15, 2021
4b81d66
Remove BITOP operation destkey key ..., add missing command parser
TysonAndre Apr 16, 2021
c71cb03
Update docs
TysonAndre Apr 16, 2021
2e4f1c7
Merge pull request #599 from ifwe/twitter-support-more-commands
TysonAndre Jul 1, 2021
f08bcfc
Make twemproxy able to parse nested multibulks
qingping209 May 1, 2021
f387657
Add c unit test of multi-bulk result parsing
TysonAndre May 1, 2021
621e7d6
Support arbitrarily nested redis multibulks
TysonAndre Jul 1, 2021
523348f
Update the changelog
TysonAndre Jul 1, 2021
746216c
Merge pull request #612 from ifwe/twitter-fix-multibulk
TysonAndre Jul 1, 2021
7e131f8
Followup for new redis commands and multibulk support
TysonAndre Jul 1, 2021
6006065
Merge pull request #613 from ifwe/twitter-support-new-redis-commands-…
TysonAndre Jul 1, 2021
3f7cc0c
Update libyaml to 0.2.5, strictly check compiler warnings in CI
TysonAndre Jul 1, 2021
709de01
Fix compilation warnings about log sprintf format strings
TysonAndre Jul 1, 2021
1239ef9
[skip ci] Update documentation of supported redis commands
TysonAndre Jul 1, 2021
db2e642
Merge pull request #615 from ifwe/twitter-update-checks
TysonAndre Jul 1, 2021
9258716
[skip ci] Add script to extract redis key/arg count ranges
TysonAndre Jul 1, 2021
c741bf1
Merge pull request #616 from twitter/extract_redis_commands_argcounts
TysonAndre Jul 1, 2021
34dcc49
Fix a crash seen when logging redis `COMMAND` in recent patches
TysonAndre Jul 2, 2021
67e1124
Merge pull request #619 from twitter/fix-logging-crash
TysonAndre Jul 2, 2021
cb0db33
Merge pull request #541 from essanpupil/master
TysonAndre Jul 2, 2021
2e28feb
[skip ci] Remove reference to outdated python-memcached version
TysonAndre Jul 2, 2021
d486c11
Merge pull request #622 from twitter/python-memcached-outdated
TysonAndre Jul 2, 2021
42c2a1d
Merge pull request #570 from erikwebb/patch-1
TysonAndre Jul 2, 2021
9022647
Update tests
TysonAndre Jul 2, 2021
4b33ca8
Merge pull request #623 from twitter/update-tests
TysonAndre Jul 3, 2021
d627f53
Make pointers const qualified where possible
TysonAndre Jul 2, 2021
35ee7a3
Add more const flags
TysonAndre Jul 2, 2021
ef03bf9
Add constant qualifiers.
TysonAndre Jul 3, 2021
ca2683f
Update tests
TysonAndre Jul 3, 2021
0440112
Make static variables const where usage is const
TysonAndre Jul 3, 2021
abb3623
Add more const annotations
TysonAndre Jul 3, 2021
219d167
Add const qualifier
TysonAndre Jul 3, 2021
b7177ba
Use the renamed redis repo url in CI docker build
TysonAndre Jul 3, 2021
9339bcf
Merge pull request #628 from twitter/const-values
TysonAndre Jul 3, 2021
45dc829
Merge remote-tracking branch 'twitter/master' into ifwe-github-merge-…
TysonAndre Jul 3, 2021
a00acf5
Merge remote-tracking branch 'twitter/master' into ifwe-github-merge-…
TysonAndre Jul 3, 2021
e6da0d7
Fix build failure after fixing merge conflicts
TysonAndre Jul 3, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .clang-format.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# This may be useful with https://clang.llvm.org/docs/ClangFormat.html#script-for-patch-reformatting
# but some of clang's reformattings may conflict with notes/c-style-guide.txt, which takes precedence.
#
# This is deliberately named .clang-format.example instead of .clang-format to avoid editors
# unexpectedly using this to reformatting entire files because of these shortcomings.
# It can be copied into .clang-format to use this for local development selectively.
#
# Note: this clang format file has many shortcomings.
# Attempting to apply this automatically to everything may make code less readable.
# However, this may be useful for spot checking new code,
# or if you're not certain of indentation style or general spacing/wrapping rules
#
# Known shortcomings:
# - Some places exceed the 80 column limit deliberately for readability, e.g. help strings or error messages or function prototypes. (BreakStringLiterals helps preserve some of those)
# - Some places deliberately put blocks on a single line when there are a lot of similar blocks.
# AllowShortBlocksOnASingleLine is not useful.
# - Some places deliberately put blocks on a single line when there are a lot of similar blocks.
# - No good way to eliminate space before and after PRIu64 and other macros for adjacent string literal concatenation
# - clang-format is not aware of macros, some of which have different styles from functions.
# - Function declarations are not typically aligned
# - Some variable declarations are aligned and others aren't on a case by case basis
# - The choice of function argument grouping should depends on which function arguments are semantically related,
# not just on fitting within 80 columns.

AllowShortBlocksOnASingleLine: true
BasedOnStyle: LLVM
AlwaysBreakAfterDefinitionReturnType: All
UseTab: Never
IndentWidth: 4
TabWidth: 4
ColumnLimit: 80
BreakBeforeBraces: Linux
SortIncludes: false

BreakStringLiterals: false
# BitFieldColonSpacing is too new to work in clang-format 11
# https://releases.llvm.org/11.0.0/tools/clang/docs/ClangFormatStyleOptions.html
# Latest: https://clang.llvm.org/docs/ClangFormatStyleOptions.html
#
# BitFieldColonSpacing: None
#
# XXX no way to treat the `*` indicating a value is a pointer as part of the aligned name for the declaration
# XXX function declarations are not typically aligned
AlignConsecutiveDeclarations: true
AlignConsecutiveMacros: true
2 changes: 1 addition & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ core*
nutcracker

# extracted yaml
!/contrib/yaml-0.1.4.tar.gz
!/contrib/yaml-0.2.5.tar.gz

# Autotools
.deps
Expand Down
19 changes: 19 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# https://editorconfig.org/

root = true

[*]
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
charset = utf-8

# See twemproxy/notes/c-styleguide.txt
[*.c,*.h]
tab_width = 4
indent_size = 4
indent_style = space
# indent_brace_style depends on function vs conditional
max_line_length = 80
spaces_around_brackets = none
spaces_around_operators = true
10 changes: 9 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ core*
nutcracker

# extracted yaml
!/contrib/yaml-0.1.4.tar.gz
!/contrib/yaml-0.2.5.tar.gz

# Autotools
.deps
Expand Down Expand Up @@ -71,3 +71,11 @@ nutcracker

Makefile
Makefile.in

# The .clang-format.example file may be copied here for use with -style=file
.clang-format

test_all
*.trs
tags

13 changes: 0 additions & 13 deletions .travis.yml

This file was deleted.

33 changes: 29 additions & 4 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
Fix memory corruption seen when all hosts are ejected from a pool with
auto_eject_hosts: true (tyson)
Update tests to work with python 3 (tyson)
Ensure file permissions aren't chosen based on uninitialized memory. (tyson)
Add a heartbeat patch to detect dead servers (charsyam)
Add improvements to the heartbeat patch (tyson)
Decrease the verbosity of logging clients establishing/closing connections to
Expand All @@ -32,15 +31,41 @@
server when reconnecting to a server. Reduce concurrent reconnection attempts. (tyson)

2016-04-27 Misha Nasledov <[email protected]>
* twemproxy: version 0.5.1 release
* twemproxy: version 0.5.1 release (ifwe fork on github)
updated to latest master from twitter/twemproxy
updated to latest version of andyqzb's sentinel patch

2015-07-14 Misha Nasledov <[email protected]>
* twemproxy: version 0.5.0 release
* twemproxy: version 0.5.0 release (ifwe fork on github)
redis-sentinel support (andyqzb)

2015-22-06 Manju Rajashekhar <[email protected]>
2021-??-?? Tyson Andre
* twemproxy: version 0.5.0 release (dev)
Fix parsing of redis error response for error type with no space,
add tests (tyson, tom dalton)
Update integration tests, add C unit test suite for 'make check' (tyson)
Increase the maximum host length+port+identifier to 273
in ketama_update (李广博)
Always initialize file permissions field when listening on a unix domain
socket (tyson)
Use number of servers instead of number of points on the continuum when
sharding requests to backend services to improve sharding performance
and fix potential invalid memory access when all hosts were ejected
from a pool. (tyson)
Don't fragment memcache/redis get commands when they only have a single
key (improves performance and error handling of single key case) (tyson)
Don't let requests hang when there is a dns error when processing a
fragmented request (e.g. multiget with multiple keys) (tyson)
Allow extra parameters for redis spop (charsyam)
Update documentation and README (various)
Fix memory leak bug for redis mset (deep011)
Support arbitrarily deep nested redis multi-bulk
responses (nested arrays) (qingping209, tyson)
Upgrade from libyaml 0.1.4 to 0.2.5 (tyson)
Fix compiler warnings about wrong conversion specifiers in format
strings for logging (tyson)

2015-22-06 Manju Rajashekhar <[email protected]>
* twemproxy: version 0.4.1 release
backend server hostnames are resolved lazily
redis_auth is only valid for a redis pool
Expand Down
2 changes: 1 addition & 1 deletion NOTICE
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The source also includes libyaml (yaml-0.1.4) in contrib/ directory
The source also includes libyaml (yaml-0.2.5) in contrib/ directory

Copyright (c) 2006 Kirill Simonov

Expand Down
38 changes: 19 additions & 19 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,23 +83,23 @@ Twemproxy can be configured through a YAML file specified by the -c or --conf-fi
+ **listen**: The listening address and port (name:port or ip:port) or an absolute path to sock file (e.g. /var/run/nutcracker.sock) for this server pool.
+ **client_connections**: The maximum number of connections allowed from redis clients. Unlimited by default, though OS-imposed limitations will still apply.
+ **hash**: The name of the hash function. Possible values are:
+ one_at_a_time
+ md5
+ crc16
+ crc32 (crc32 implementation compatible with [libmemcached](http://libmemcached.org/))
+ crc32a (correct crc32 implementation as per the spec)
+ fnv1_64
+ fnv1a_64
+ fnv1_32
+ fnv1a_32
+ hsieh
+ murmur
+ jenkins
+ one_at_a_time
+ md5
+ crc16
+ crc32 (crc32 implementation compatible with [libmemcached](http://libmemcached.org/))
+ crc32a (correct crc32 implementation as per the spec)
+ fnv1_64
+ fnv1a_64
+ fnv1_32
+ fnv1a_32
+ hsieh
+ murmur
+ jenkins
+ **hash_tag**: A two character string that specifies the part of the key used for hashing. Eg "{}" or "$$". [Hash tag](notes/recommendation.md#hash-tags) enable mapping different keys to the same server as long as the part of the key within the tag is the same.
+ **distribution**: The key distribution mode. Possible values are:
+ ketama (default, recommended. An implementation of https://en.wikipedia.org/wiki/Consistent_hashing)
+ modula (use hash modulo number of servers to choose the backend)
+ random (choose a random backend)
+ ketama (default, recommended. An implementation of https://en.wikipedia.org/wiki/Consistent_hashing)
+ modula (use hash modulo number of servers to choose the backend)
+ random (choose a random backend)
+ **timeout**: The timeout value in msec that we wait for to establish a connection to the server or receive a response from a server. By default, we wait indefinitely.
+ **backlog**: The TCP backlog argument. Defaults to 512.
+ **preconnect**: A boolean value that controls if twemproxy should preconnect to all the servers in this pool on process start. Defaults to false.
Expand Down Expand Up @@ -201,13 +201,13 @@ For example, the configuration file in [conf/nutcracker.yml](conf/nutcracker.yml
- 127.0.0.1:26380:1
- 127.0.0.1:26381:1

Finally, to make writing a syntactically correct configuration file easier, twemproxy provides a command-line argument -t or --test-conf that can be used to test the YAML configuration file for any syntax error.
Finally, to make writing a syntactically correct configuration file easier, twemproxy provides a command-line argument `-t` or `--test-conf` that can be used to test the YAML configuration file for any syntax error.

## Observability

Observability in twemproxy is through logs and stats.

Twemproxy exposes stats at the granularity of server pool and servers per pool through the stats monitoring port. The stats are essentially JSON formatted key-value pairs, with the keys corresponding to counter names. By default stats are exposed on port 22222 and aggregated every 30 seconds. Both these values can be configured on program start using the -c or --conf-file and -i or --stats-interval command-line arguments respectively. You can print the description of all stats exported by using the -D or --describe-stats command-line argument.
Twemproxy exposes stats at the granularity of server pool and servers per pool through the stats monitoring port. The stats are essentially JSON formatted key-value pairs, with the keys corresponding to counter names. By default stats are exposed on port 22222 and aggregated every 30 seconds. Both these values can be configured on program start using the `-c` or `--conf-file` and `-i` or `--stats-interval` command-line arguments respectively. You can print the description of all stats exported by using the `-D` or `--describe-stats` command-line argument.

$ nutcracker --describe-stats

Expand All @@ -233,13 +233,13 @@ Twemproxy exposes stats at the granularity of server pool and servers per pool t
out_queue "# requests in outgoing queue"
out_queue_bytes "current request bytes in outgoing queue"

Logging in twemproxy is only available when twemproxy is built with logging enabled. By default logs are written to stderr. Twemproxy can also be configured to write logs to a specific file through the -o or --output command-line argument. On a running twemproxy, we can turn log levels up and down by sending it SIGTTIN and SIGTTOU signals respectively and reopen log files by sending it SIGHUP signal.
Logging in twemproxy is only available when twemproxy is built with logging enabled. By default logs are written to stderr. Twemproxy can also be configured to write logs to a specific file through the `-o` or `--output` command-line argument. On a running twemproxy, we can turn log levels up and down by sending it SIGTTIN and SIGTTOU signals respectively and reopen log files by sending it SIGHUP signal.

## Pipelining

Twemproxy enables proxying multiple client connections onto one or few server connections. This architectural setup makes it ideal for pipelining requests and responses and hence saving on the round trip time.

For example, if twemproxy is proxying three client connections onto a single server and we get requests - 'get key\r\n', 'set key 0 0 3\r\nval\r\n' and 'delete key\r\n' on these three connections respectively, twemproxy would try to batch these requests and send them as a single message onto the server connection as 'get key\r\nset key 0 0 3\r\nval\r\ndelete key\r\n'.
For example, if twemproxy is proxying three client connections onto a single server and we get requests - `get key\r\n`, `set key 0 0 3\r\nval\r\n` and `delete key\r\n` on these three connections respectively, twemproxy would try to batch these requests and send them as a single message onto the server connection as `get key\r\nset key 0 0 3\r\nval\r\ndelete key\r\n`.

Pipelining is the reason why twemproxy ends up doing better in terms of throughput even though it introduces an extra hop between the client and server.

Expand Down
2 changes: 1 addition & 1 deletion ci/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ RUN pip3.6 install nose && \
# RUN yum install -y redis redis-sentinel

ARG REDIS_VER=3.2.11
RUN wget https://github.com/antirez/redis/archive/$REDIS_VER.tar.gz && \
RUN wget https://github.com/redis/redis/archive/$REDIS_VER.tar.gz && \
tar zxvf $REDIS_VER.tar.gz && \
pushd redis-$REDIS_VER && \
make install && \
Expand Down
5 changes: 4 additions & 1 deletion ci/build-nutcracker.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ trap cleanup INT
cleanup

export CFLAGS="-O3 -fno-strict-aliasing -I/usr/lib/x86_64-redhat-linux6E/include -B /usr/lib/x86_64-redhat-linux6E/lib64"
# TODO: Figure out how to make this apply only to the contrib/ directory. Maybe override the yaml directory's Makefile.am after extracting it.
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119
CFLAGS+=" -Werror -Wall -Wno-pointer-sign -Wno-sign-conversion -Wno-missing-braces -Wno-unused-value -Wno-builtin-declaration-mismatch -Wno-maybe-uninitialized"
export LDFLAGS="-lc_nonshared"
cd /usr/src/twemproxy
autoreconf -fvi
./configure --enable-debug=log --prefix=/usr/src/twemproxy/work/usr
./configure --enable-debug=yes --prefix=/usr/src/twemproxy/work/usr
make -j5
make install
8 changes: 4 additions & 4 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -199,11 +199,11 @@ AS_IF([test "x$disable_stats" = xyes],
[AC_DEFINE([HAVE_STATS], [1], [Define to 1 if stats is not disabled])])
AC_MSG_RESULT($disable_stats)

# Untar the yaml-0.1.4 in contrib/ before config.status is rerun
AC_CONFIG_COMMANDS_PRE([tar xvfz contrib/yaml-0.1.4.tar.gz -C contrib])
# Untar the yaml-0.2.5 in contrib/ before config.status is rerun
AC_CONFIG_COMMANDS_PRE([tar xvfz contrib/yaml-0.2.5.tar.gz -C contrib])

# Call yaml-0.1.4 ./configure recursively
AC_CONFIG_SUBDIRS([contrib/yaml-0.1.4])
# Call yaml-0.2.5 ./configure recursively
AC_CONFIG_SUBDIRS([contrib/yaml-0.2.5])

# Define Makefiles
AC_CONFIG_FILES([Makefile
Expand Down
4 changes: 2 additions & 2 deletions contrib/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
SUBDIRS = yaml-0.1.4
SUBDIRS = yaml-0.2.5

EXTRA_DIST = yaml-0.1.4.tar.gz
EXTRA_DIST = yaml-0.2.5.tar.gz
Binary file removed contrib/yaml-0.1.4.tar.gz
Binary file not shown.
Binary file added contrib/yaml-0.2.5.tar.gz
Binary file not shown.
File renamed without changes.
Loading