naver / arcus-memcached

ARCUS memory cache server
https://github.com/naver/arcus
Apache License 2.0
70 stars 55 forks source link

INTERNAL: Fix problems about not released items and an assertion in UDP #754

Closed ing-eoking closed 5 months ago

ing-eoking commented 6 months ago

๐Ÿ”— Related Issue

โŒจ๏ธ What I did

๐Ÿ”ย  About Issue

conn_cleanup ๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š”๊ฒฝ์šฐ sfd๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๐Ÿงช Test

jhpark816 commented 6 months ago

UDP ์†Œ์ผ“ ์‹คํŒจ ์‹œ conn_closing์œผ๋กœ ๋ฐ”๊พธ๊ฒŒ ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‚ด์šฉ์€ ํ•ด๋‹น ์ด์Šˆ์—์„œ ์„ค๋ช…ํ•œ ๋ถ€๋ถ„์ด๋ฏ€๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

UDP์—์„œ connection ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด conn_cleanup ์ผ๋ถ€ ๋กœ์ง์„ conn_close๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. UDP์—์„œ conn_cleanup ์ˆ˜ํ–‰ ํ›„ conn_read๋กœ ๋ฐ”๊พธ๊ฒŒ ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค. conn_cleanup๊ณผ conn_mwrite์—์„œ ๊ณตํ†ต๋˜๋Š” ๋กœ์ง(item release ๋“ฑ)์„ conn_item_free ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํŒฉํ† ๋ง์ด ๋“ค์–ด๊ฐ„ ๊ฒƒ ๊ฐ™์€ ๋ฐ, ์ด๋ฒˆ ์ด์Šˆ๋Š” ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ ๋ฒ„๊ทธ ์ˆ˜์ •ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ํ•ฉ์‹œ๋‹ค.

๋ฒ„๊ทธ ์ˆ˜์ •์„ mergeํ•œ ํ›„์— ๋ฆฌํŒฉํ† ๋ง์€ ๋‹ค์‹œ PR ๋ฐ›์„๊ฒŒ์š”.

ing-eoking commented 6 months ago

์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

UDP์—์„œ connection ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด conn_cleanup ์ผ๋ถ€ ๋กœ์ง์„ conn_close๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. UDP์—์„œ conn_cleanup ์ˆ˜ํ–‰ ํ›„ conn_read๋กœ ๋ฐ”๊พธ๊ฒŒ ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๋ถ€๋ถ„ ๋˜ํ•œ ๋ฒ„๊ทธ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. (https://github.com/jam2in/arcus-works/issues/529#issuecomment-2062812416)

jhpark816 commented 6 months ago

@namsic ๋ฆฌ๋ทฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ing-eoking commented 6 months ago

UDP ์†Œ์ผ“ ๋ณด๋‚ผ ๋•Œ ํ…Œ์ŠคํŠธํ–ˆ๋˜ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์œผ๋‚˜ ์‚ฌ์‹ค์ƒ ๋„ˆ๋ฌด ๋‹จ์ˆœํ•˜๊ฒŒ set i 0 0 1 ๋ช…๋ น์–ด ๋ณด๋‚ด๋Š” ๊ฒŒ ๋‹ค ์ด๋ฉฐ, ์‹ค์ œ๋กœ๋Š” memcached ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผœ์„œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„๋„ ์ข€๋” ๋ณด์™„ํ•ด์„œ ๋‚˜์ค‘์— ๋‹ค์‹œ ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

#!/usr/bin/perl

use IO::Socket::INET;
my $socket;
my $cmd = "set i 0 0 1\r\n1\r\n";

$socket = new IO::Socket::INET (
PeerAddr   => '127.0.0.1:11211',
Proto      => 'udp'
) or die "ERROR : $!\n";

$reqid = 45;
$hdr = pack("nnnn", $reqid, 0, 1, 0);
my $pkt = $hdr . $cmd;

$socket->send($pkt);

my $got = 0;
my $pkts = 1;
my $resp = "";

while($got < $pkts) {
    my $pkt;
    $sock->recv($pkt, 1500, 0);
    my ($resid, $total, $curr, $zero) = unpack("nnnn", substr($pkt, 0, 8));
    die "A mismatch between response ID and request ID ($reqid != $resid)" unless $resid == $reqid;
    die "Non-zero tail ($zero)" unless $resv == 0;
    $pkts = $total;
    $resp .= substr($pkt, 8);
    $got++;
}

$socket->close();
jhpark816 commented 6 months ago

@ing-eoking ๋ณธ PR๋„ ์ง„ํ–‰ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ing-eoking commented 6 months ago

@jhpark816

์šฐ์„  ์ƒ๋‹จ์— conn_cleanup์˜ ๋กœ์ง ์ด๋™์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

jhpark816 commented 6 months ago

@ing-eoking ๋กœ์ง ์ด๋™์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋™๋˜๋Š” ๋กœ์ง ์ž์ฒด์— ๋Œ€ํ•ด ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ๋ชจ๋“  ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌ or ๋‹ต๋ณ€ ๋ฐ”๋ž๋‹ˆ๋‹ค.

ing-eoking commented 5 months ago

@jhpark816.

์ฝ”๋ฉ˜ํŠธ์— ๋“ค์–ด์žˆ๋Š” ๋ถ€๋ถ„์€ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ing-eoking commented 5 months ago

@jhpark816

๋‹ต๋ณ€์„ ์ตœ์ƒ๋‹จ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

jhpark816 commented 5 months ago

@ing-eoking ์ตœ์ƒ๋‹จ์— ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ์ฃ .

ing-eoking commented 5 months ago

@ing-eoking ์ตœ์ƒ๋‹จ์— ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋„ ์ถ”๊ฐ€ํ•ด ์ฃผ์‹œ์ฃ .

์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.