Permalink
Browse files

TCP and UDP ports should follow each other. bug67

  • Loading branch information...
1 parent b8ff918 commit 6dc28e905d7b9f7809f6e8c0e372588740c28e47 @dustin dustin committed with dormando Oct 30, 2009
Showing with 94 additions and 0 deletions.
  1. +10 −0 memcached.c
  2. +84 −0 t/issue_67.t
View
10 memcached.c
@@ -4250,6 +4250,8 @@ int main (int argc, char **argv) {
/* udp socket */
static int *u_socket = NULL;
bool protocol_specified = false;
+ bool tcp_specified = false;
+ bool udp_specified = false;
/* handle SIGINT */
signal(SIGINT, sig_handler);
@@ -4297,9 +4299,11 @@ int main (int argc, char **argv) {
case 'U':
settings.udpport = atoi(optarg);
+ udp_specified = true;
break;
case 'p':
settings.port = atoi(optarg);
+ tcp_specified = true;
break;
case 's':
settings.socketpath = optarg;
@@ -4465,6 +4469,12 @@ int main (int argc, char **argv) {
}
}
+ if (tcp_specified && !udp_specified) {
+ settings.udpport = settings.port;
+ } else if (udp_specified && !tcp_specified) {
+ settings.port = settings.udpport;
+ }
+
if (maxcore != 0) {
struct rlimit rlim_new;
/*
View
84 t/issue_67.t
@@ -0,0 +1,84 @@
+#!/usr/bin/perl
+
+use strict;
+use Test::More tests => 22;
+use FindBin qw($Bin);
+use lib "$Bin/lib";
+use MemcachedTest;
+use Carp qw(croak);
+
+use Cwd;
+my $builddir = getcwd;
+
+$ENV{'MEMCACHED_PORT_FILENAME'} = "/tmp/ports.$$";
+
+sub read_ports {
+ my %rv = ();
+ open(my $f, "/tmp/ports.$$") || die("Can't open ports file.");
+ while(<$f>) {
+ my ($type, $port) = split(/:\s+/);
+ $rv{$type} = $port + 0;
+ }
+ unlink "/tmp/ports.$$";
+ return %rv;
+}
+
+sub validate_port {
+ my ($name, $got, $expected) = @_;
+ # diag "Wanted $expected, got $got";
+ if ($expected == -1) {
+ ok(!defined($got), "$name expected no port, got $got");
+ } elsif ($expected == 0) {
+ ok($got != 11211, "$name expected random port (got $got)");
+ } else {
+ is($got, $expected, "$name");
+ }
+}
+
+sub run_server {
+ my ($args) = @_;
+
+ my $exe = "$builddir/memcached-debug";
+ croak("memcached binary doesn't exist. Haven't run 'make' ?\n") unless -e $exe;
+
+ my $childpid = fork();
+
+ my $cmd = "$builddir/timedrun 10 $exe $args";
+
+ unless($childpid) {
+ exec $cmd;
+ exit; # NOTREACHED
+ }
+
+ for (1..20) {
+ if (-f "/tmp/ports.$$") {
+ return Memcached::Handle->new(pid => $childpid);
+ }
+ select undef, undef, undef, 0.10;
+ }
+ croak "Failed to start server.";
+}
+
+sub when {
+ my ($name, $params, $expected_tcp, $expected_udp) = @_;
+
+ my $server = run_server($params);
+ my %ports = read_ports();
+
+ validate_port($name, $ports{'TCP INET'}, $expected_tcp);
+ validate_port($name, $ports{'UDP INET'}, $expected_udp);
+}
+
+# Disabling the defaults since it conflicts with a running instance.
+# when('no arguments', '', 11211, 11211);
+when('specifying tcp port', '-p 11212', 11212, 11212);
+when('specifying udp port', '-U 11222', 11222, 11222);
+when('specifying tcp ephemeral port', '-p -1', 0, 0);
+when('specifying udp ephemeral port', '-U -1', 0, 0);
+when('tcp port disabled', '-p 0', -1, -1);
+when('udp port disabled', '-U 0', -1, -1);
+when('specifying tcp and udp ports', '-p 11232 -U 11233', 11232, 11233);
+when('specifying tcp and disabling udp', '-p 11242 -U 0', 11242, -1);
+when('specifying udp and disabling tcp', '-p -1 -U 11252', 0, 11252);
+when('specifying tcp and ephemeral udp', '-p 11262 -U -1', 11262, 0);
+when('specifying udp and ephemeral tcp', '-p -1 -U 11272', 0, 11272);

0 comments on commit 6dc28e9

Please sign in to comment.