From f1b821f3f250d32e498fdb42cd40b36ed73c63a2 Mon Sep 17 00:00:00 2001 From: cheesecrust Date: Fri, 5 Jul 2024 10:41:41 +0900 Subject: [PATCH 1/6] FEATURE: touch command add touch command with test file and docs --- docs/ascii-protocol/ch04-command-key-value.md | 69 ++++++++++------ .../ch10-command-item-attribute.md | 26 +++--- memcached.c | 51 ++++++++++++ t/tlist/engine_default_b.txt | 1 + t/tlist/engine_default_s.txt | 1 + t/touch.t | 81 +++++++++++++++++++ 6 files changed, 190 insertions(+), 39 deletions(-) create mode 100644 t/touch.t diff --git a/docs/ascii-protocol/ch04-command-key-value.md b/docs/ascii-protocol/ch04-command-key-value.md index 07d35a8a4..093150e6e 100644 --- a/docs/ascii-protocol/ch04-command-key-value.md +++ b/docs/ascii-protocol/ch04-command-key-value.md @@ -17,15 +17,15 @@ cas [noreply]\r\n\r\n Response string과 그 의미는 아래와 같다. -| Response String | 설명 | -|----------------------|------------------------ | -| "STORED" | 성공 -| "NOT_STORED" | 연산 조건에 부합하지 않아 저장에 실패 함. ex) 이미 존재하는 key에 대해 add 연산, 존재하지 않는 key에 대해 replace, append, prepend 연산. -| "NOT_FOUND" | cas 연산의 key miss. -| "EXISTS" | cas 연산의 응답으로, 해당 아이템이 클라이언트의 마지막 fetch 이후 수정된 적이 있음을 뜻함. -| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님. -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format -| "SERVER ERROR" | 서버 측의 오류로 저장하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory +| Response String | 설명 | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| "STORED" | 성공 | +| "NOT_STORED" | 연산 조건에 부합하지 않아 저장에 실패 함. ex) 이미 존재하는 key에 대해 add 연산, 존재하지 않는 key에 대해 replace, append, prepend 연산. | +| "NOT_FOUND" | cas 연산의 key miss. | +| "EXISTS" | cas 연산의 응답으로, 해당 아이템이 클라이언트의 마지막 fetch 이후 수정된 적이 있음을 뜻함. | +| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님. | +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format | +| "SERVER ERROR" | 서버 측의 오류로 저장하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory | ## retrieval 명령 @@ -47,6 +47,7 @@ mget \r\n mgets \r\n <"space separated keys">\r\n ``` + - \<"space separated keys"\> - key list로, 스페이스(' ')로 구분한다. - \과 \ - key list 문자열의 길이와 key 개수를 나타낸다. @@ -65,11 +66,10 @@ END\r\n 실패시 string은 아래와 같다. - -| Response String | 설명 | -|----------------------|------------------------ | -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format -| "SERVER ERROR" | 서버 측의 오류로 조회하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory writing get response +| Response String | 설명 | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format | +| "SERVER ERROR" | 서버 측의 오류로 조회하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory writing get response | mget 명령에서 메모리 부족으로 일부 key에 대해서만 정상 조회한 후 실패한 경우, 전체 연산을 서버 에러 처리한다. @@ -83,11 +83,11 @@ delete [noreply]\r\n Response string과 그 의미는 아래와 같다. -| Response String | 설명 | -|----------------------|------------------------ | -| "DELETED" | 성공 -| "NOT_FOUND" | key miss -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format +| Response String | 설명 | +| --------------- | ------------------------------------------------------------------------------------------------------------------------ | +| "DELETED" | 성공 | +| "NOT_FOUND" | key miss | +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format | ## Increment/Decrement 명령 @@ -104,9 +104,28 @@ decr [ ] [noreply]\r\n 실패시 Response string과 의미는 아래와 같다. -| Response String | 설명 | -|----------------------|------------------------ | -| "NOT_FOUND" | key miss -| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님 -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) invalid numeric delta argument, cannot increment or decrement non-numeric value -| "SERVER ERROR" | 서버 측의 오류로 연산하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory +| Response String | 설명 | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| "NOT_FOUND" | key miss | +| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님 | +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) invalid numeric delta argument, cannot increment or decrement non-numeric value | +| "SERVER ERROR" | 서버 측의 오류로 연산하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory | + +## touch (Item의 expiretime 변경) + +key에 해당하는 item을 fetch 하지 않고 expiretime을 재설정하는 명령은 아래와 같다. 이 명령은 모든 item 타입에 대해 적용이 가능하다. + +``` +touch [noreply]\r\n +``` + +- \ - 대상 item의 key string +- \ - 재설정할 expiretime 값 + +이 명령의 response string과 그 의미는 아래와 같다. + +| Response String | 설명 | +| ------------------------ | ------------------------------- | +| "TOUCHED" | 성공 | +| "NOT_FOUND" | key miss | +| "CLIENT_ERROR bad value" | exptime 값이 유효하지 않은 경우 | diff --git a/docs/ascii-protocol/ch10-command-item-attribute.md b/docs/ascii-protocol/ch10-command-item-attribute.md index 343e82ae0..b782db090 100644 --- a/docs/ascii-protocol/ch10-command-item-attribute.md +++ b/docs/ascii-protocol/ch10-command-item-attribute.md @@ -5,7 +5,6 @@ Item attributes를 조회하는 getattr 명령과 변경하는 setattr 명령을 ARCUS에서 어떤 item attributes를 제공하는 지를 알고자 한다면, [Item Attibute 설명](ch03-item-attributes.md)을 참고 바란다. - ## getattr (Item Attribute 조회) Item attributes를 조회하는 getattr 명령은 아래와 같다. @@ -30,12 +29,11 @@ END\r\n 실패 시의 response string과 그 의미는 아래와 같다. -| Response String | 설명 | -|-----------------------------------------|------------------------ | -| "NOT_FOUND" | key miss -| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. -| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 - +| Response String | 설명 | +| -------------------------------------- | --------------------------------------------------------------------------------------- | +| "NOT_FOUND" | key miss | +| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. | +| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 | ## setattr (Item Attribute 변경) @@ -52,10 +50,10 @@ setattr = [= ...]\r\n 이 명령의 response string과 그 의미는 아래와 같다. -| Response String | 설명 | -|-----------------------------------------|------------------------ | -| "OK" | 성공 -| "NOT_FOUND" | key miss -| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. -| "ATTR_ERROR bad value" | 해당 attribute에 대해 새로 변경하고자 하는 value가 allowed value가 아님. -| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 +| Response String | 설명 | +| -------------------------------------- | --------------------------------------------------------------------------------------- | +| "OK" | 성공 | +| "NOT_FOUND" | key miss | +| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. | +| "ATTR_ERROR bad value" | 해당 attribute에 대해 새로 변경하고자 하는 value가 allowed value가 아님. | +| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 | diff --git a/memcached.c b/memcached.c index 05043412d..55540410e 100644 --- a/memcached.c +++ b/memcached.c @@ -13085,6 +13085,53 @@ static void process_setattr_command(conn *c, token_t *tokens, const size_t ntoke } } +static void process_touch_command(conn *c, token_t *tokens, const size_t ntokens) +{ + assert(c != NULL); + assert(c->ewouldblock == false); + char *key = tokens[KEY_TOKEN].value; + size_t nkey = tokens[KEY_TOKEN].length; + + if (nkey > KEY_MAX_LENGTH) { + out_string(c, "CLIENT_ERROR bad command line format"); + return; + } + + ENGINE_ERROR_CODE ret; + item_attr attr_data; + ENGINE_ITEM_ATTR attr_id = ATTR_EXPIRETIME; + int64_t exptime; + + set_noreply_maybe(c, tokens, ntokens); + + if (! safe_strtoll(tokens[KEY_TOKEN+1].value, &exptime)) { + ret = ENGINE_EBADVALUE; + } else { + attr_data.exptime = realtime(exptime); + ret = mc_engine.v1->setattr(mc_engine.v0, c, key, nkey, + &attr_id, 1, &attr_data, 0); + CONN_CHECK_AND_SET_EWOULDBLOCK(ret, c); + if (settings.detail_enabled) { + stats_prefix_record_setattr(key, nkey); + } + } + + switch (ret) { + case ENGINE_SUCCESS: + STATS_HITS(c, setattr, key, nkey); + out_string(c, "TOUCHED"); + break; + case ENGINE_KEY_ENOENT: + STATS_MISSES(c, setattr, key, nkey); + out_string(c, "NOT_FOUND"); + break; + default: + STATS_CMD_NOKEY(c, setattr); + if (ret == ENGINE_EBADVALUE) out_string(c, "CLIENT_ERROR bad value"); + else handle_unexpected_errorcode_ascii(c, __func__, ret); + } +} + static void process_command_ascii(conn *c, char *command, int cmdlen) { /* One more token is reserved in tokens strucure @@ -13206,6 +13253,10 @@ static void process_command_ascii(conn *c, char *command, int cmdlen) { process_config_command(c, tokens, ntokens); } + else if ((ntokens >= 4 && ntokens <= 5) && (strcmp(tokens[COMMAND_TOKEN].value, "touch") == 0)) + { + process_touch_command(c, tokens, ntokens); + } #ifdef ENABLE_ZK_INTEGRATION else if ((ntokens >= 3) && (strcmp(tokens[COMMAND_TOKEN].value, "zkensemble") == 0)) { diff --git a/t/tlist/engine_default_b.txt b/t/tlist/engine_default_b.txt index 7e228ecee..ca25edcdf 100644 --- a/t/tlist/engine_default_b.txt +++ b/t/tlist/engine_default_b.txt @@ -102,3 +102,4 @@ ./t/nested_prefix.t ./t/keyscan.t ./t/prefixscan.t +./t/touch.t diff --git a/t/tlist/engine_default_s.txt b/t/tlist/engine_default_s.txt index 31bdd5ee8..fffbc2fe5 100644 --- a/t/tlist/engine_default_s.txt +++ b/t/tlist/engine_default_s.txt @@ -95,3 +95,4 @@ ./t/nested_prefix.t ./t/keyscan.t ./t/prefixscan.t +./t/touch.t diff --git a/t/touch.t b/t/touch.t new file mode 100644 index 000000000..a5cfaa5c7 --- /dev/null +++ b/t/touch.t @@ -0,0 +1,81 @@ +#!/usr/bin/perl + +use strict; +use Test::More tests =>19; +use FindBin qw($Bin); +use lib "$Bin/lib"; +use MemcachedTest; + +my $engine = shift; +my $server = get_memcached($engine); +my $sock = $server->sock; + +my $cmd; +my $val; +my $rst; +my $expire; + +# Initialize +$cmd = "set key 0 0 5"; $val = "datum"; $rst = "STORED"; +mem_cmd_is($sock, $cmd, $val, $rst); +$cmd = "lop create lkey 0 0 1 error"; $rst = "CREATED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "sop create skey 0 0 1 error"; $rst = "CREATED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "mop create mkey 0 0 1 error"; $rst = "CREATED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "bop create bkey 0 0 1 error"; $rst = "CREATED"; +mem_cmd_is($sock, $cmd, "", $rst); + +# Success Cases +# key value +$cmd = "touch key 1"; $rst = "TOUCHED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "getattr key expiretime"; +$rst = "ATTR expiretime=1\n" + . "END"; +mem_cmd_is($sock, $cmd, "", $rst); +# list +$cmd = "touch lkey 1"; $rst = "TOUCHED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "getattr lkey expiretime"; +$rst = "ATTR expiretime=1\n" + . "END"; +mem_cmd_is($sock, $cmd, "", $rst); +# set +$cmd = "touch skey 1"; $rst = "TOUCHED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "getattr skey expiretime"; +$rst = "ATTR expiretime=1\n" + . "END"; +mem_cmd_is($sock, $cmd, "", $rst); +# map +$cmd = "touch mkey 1"; $rst = "TOUCHED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "getattr mkey expiretime"; +$rst = "ATTR expiretime=1\n" + . "END"; +mem_cmd_is($sock, $cmd, "", $rst); +#btree +$cmd = "touch bkey 1"; $rst = "TOUCHED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "getattr bkey expiretime"; +$rst = "ATTR expiretime=1\n" + . "END"; +mem_cmd_is($sock, $cmd, "", $rst); + +# Fail Cases +# bad value +$cmd = "set key 0 0 5"; $val = "datum"; $rst = "STORED"; +mem_cmd_is($sock, $cmd, $val, $rst); +$cmd = "touch key str"; $rst = "CLIENT_ERROR bad value"; +mem_cmd_is($sock, $cmd, "", $rst); +# not exist key +$expire = time() - 1; +$cmd = "touch key $expire"; $rst = "TOUCHED"; +mem_cmd_is($sock, $cmd, "", $rst); +$cmd = "touch key 1"; $rst = "NOT_FOUND"; +mem_cmd_is($sock, $cmd, "", $rst); + +# after test +release_memcached($engine, $server); From f03a8cbfb5f442f6e8bb149dd65854887365c731 Mon Sep 17 00:00:00 2001 From: yeoncheol-kim Date: Thu, 4 Jul 2024 16:33:08 +0900 Subject: [PATCH 2/6] INTERNAL: Move a 'replaced' initialization in btree insert --- engines/default/coll_btree.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engines/default/coll_btree.c b/engines/default/coll_btree.c index 5587b94b7..e61853892 100644 --- a/engines/default/coll_btree.c +++ b/engines/default/coll_btree.c @@ -2209,8 +2209,6 @@ static ENGINE_ERROR_CODE do_btree_elem_link(btree_meta_info *info, btree_elem_it int ovfl_type = OVFL_TYPE_NONE; ENGINE_ERROR_CODE res; - if (replaced) *replaced = false; - assert(info->root->ndepth < BTREE_MAX_DEPTH); res = do_btree_find_insposi(info->root, elem->data, elem->nbkey, path); if (res == ENGINE_SUCCESS) { @@ -3724,6 +3722,8 @@ ENGINE_ERROR_CODE btree_elem_insert(const char *key, const uint32_t nkey, PERSISTENCE_ACTION_BEGIN(cookie, UPD_BT_ELEM_INSERT); *created = false; + *replaced = false; + if (trimmed_elems != NULL) { /* initialize as no trimmed element */ *trimmed_elems = NULL; From b8aa78b13c2d10504a62bf94959e4c35724f95bc Mon Sep 17 00:00:00 2001 From: yeoncheol-kim Date: Thu, 4 Jul 2024 15:34:22 +0900 Subject: [PATCH 3/6] DOC: Add a upsert description in the map document --- docs/ascii-protocol/ch07-command-map-collection.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/ascii-protocol/ch07-command-map-collection.md b/docs/ascii-protocol/ch07-command-map-collection.md index 0d9c26266..3962396fb 100644 --- a/docs/ascii-protocol/ch07-command-map-collection.md +++ b/docs/ascii-protocol/ch07-command-map-collection.md @@ -7,7 +7,7 @@ Map collection에 관한 명령은 아래와 같다. Map element에 관한 명령은 아래와 같다. -- [Map element 삽입: mop insert](#mop-insert) +- [Map element 삽입: mop insert/upsert](#mop-insertupsert) - [Map element 변경: mop update](#mop-update) - [Map element 삭제: mop delete](#mop-delete) - [Map element 조회: mop get](#mop-get) @@ -36,13 +36,17 @@ Response string과 그 의미는 아래와 같다. | "CLIENT_ERROR bad command line format" | protocol syntax 틀림 | "SERVER_ERROR out of memory" | 메모리 부족 -## mop insert +## mop insert/upsert -Map collection에 하나의 field, element를 삽입한다. -Map collection을 생성하면서 \로 구성된 하나의 element를 삽입할 수도 있다. +Map collection에 \로 구성된 하나의 element를 추가하는 명령으로 +(1) 하나의 element를 삽입하는 mop insert 명령과 +(2) 현재 삽입하는 field를 가진 element가 없으면 현재의 element를 삽입하고 +그 field를 가진 element가 있으면 현재의 element로 대체시키는 mop upsert 명령이 있다. +이들 명령 수행에서 Map collection을 생성하면서 하나의 element를 삽입할 수도 있다. ``` mop insert [create ] [noreply|pipe]\r\n\r\n +mop upsert [create ] [noreply|pipe]\r\n\r\n * : [] [unreadable] ``` @@ -62,6 +66,7 @@ Response string과 그 의미는 아래와 같다. |-----------------------------------------|------------------------ | | "STORED" | 성공 (field, element 삽입) | "CREATED_STORED" | 성공 (collection 생성하고 field, element 삽입) +| "REPLACED" | 성공 (element를 대체) | "NOT_FOUND" | key miss | "TYPE_MISMATCH" | 해당 item이 map collection이 아님 | "OVERFLOWED" | overflow 발생 From 603a763ffdf4c5d6be3e65cf13b5294001093cb0 Mon Sep 17 00:00:00 2001 From: uhm0311 Date: Fri, 5 Jul 2024 16:33:31 +0900 Subject: [PATCH 4/6] INTERNAL: Fix deprecated items, `centos:7` to `rockylinux:8` and `ENV key value` to `ENV key=value`, in Dockerfile. --- Dockerfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9c06f66cd..2f7b23bb3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM centos:7 AS builder +FROM rockylinux:8 AS builder RUN yum update -y RUN yum install -y make libtool which git # Copy all files from the repository not included in .dockerignore to /src in the image. @@ -9,9 +9,9 @@ RUN ./config/autorun.sh RUN ./configure --prefix=/arcus --enable-zk-integration RUN make && make install -FROM centos:7 AS base +FROM rockylinux:8 AS base COPY --from=builder /arcus /arcus -ENV PATH ${PATH}:/arcus/bin +ENV PATH=${PATH}:/arcus/bin EXPOSE 11211/tcp @@ -27,8 +27,8 @@ FROM base RUN yum update -y RUN yum install -y bind-utils nc RUN yum clean all -y -ENV MEMCACHED_DIR /arcus-memcached -ENV PATH ${PATH}:${MEMCACHED_DIR} -ENV ARCUS_USER root +ENV MEMCACHED_DIR=/arcus-memcached +ENV PATH=${PATH}:${MEMCACHED_DIR} +ENV ARCUS_USER=root WORKDIR ${MEMCACHED_DIR} RUN ln -s /arcus/lib ${MEMCACHED_DIR}/.libs From 45d59e3bccdb18ada77eecdd0bba540a7071819a Mon Sep 17 00:00:00 2001 From: Namjae Kim Date: Thu, 11 Jul 2024 11:32:15 +0900 Subject: [PATCH 5/6] version 1.14.0 --- ChangeLog | 30 ++++++++++++++++++++++++++++++ config/version.pl | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index fd587377b..c3622e3f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +# 2024-07-11 [version 1.14.0] +## 🐣 New Features +* Remove an unused command `bget`. #749 +* Add `shutdown` command. #752 +* Add `mop upsert` command. #772 +## 🔧 Enhancements +* Enhance arcus_zk_watcher log messages. +* Set the update flag only when `ZOO_CONNECTED_STATE`. #735 +* Reduce `add_iov()` work for TCP connections. #737 +* Refactor the method of building UDP headers. +* Limit a value length from exceeding INT_MAX in binary protocol. +* Enhance log message when new respones before pipe error reset. +* Fix a clang static analyzer issue. +## 🐛 Bug Fixes +* Modify mismatched error types when `get_item_info()` failed. +* Fix the wrong `write_and_free` error handling in binary protocol. +* Fix problems about not released items and an assertion in UDP. +* Wait till the previous cmdlog flush thread ends. +* Correct wrong actions in `process_mop_prepare_nread()`. +## 📝 Documentation +* Remove old `bop smget` documentation. +* Correct small memory allocator threshold. +* Create Issue/PR templates. +* Update the description of `cmdlog`, `lqdetect`, `dump` commands. +* Add `mop upsert` document. +## ✅ Testing +* Add a distributed packet test about long key in UDP. +## ⬆️ Dependency Upgrades +* Update Docker base image from `centos:7` to `rockylinux:8`. + # 2024-01-17 [version 1.13.5] ## 🐣 New Features * Add `ready` command Add ready command to verify that the cache server can receive requests. In Zookeeper clustering, the cache node becomes ready state after creating its cache_list znode. #707 diff --git a/config/version.pl b/config/version.pl index 7a6658aa6..3b4becfbb 100755 --- a/config/version.pl +++ b/config/version.pl @@ -11,7 +11,7 @@ #my $version = '1.4.2-30-gf966dba'; #my $version = '1.4.3-rc1'; #my $version = '1.4.3'; -my $default_version = '1.13.5-unknown'; +my $default_version = '1.14.0-unknown'; unless ($version =~ m/^\d+\.\d+\.\d+/) { write_file('m4/version.m4', "m4_define([VERSION_NUMBER], [$default_version])\n"); From 8bc3dbe43c104e4d745b5c964fef70d631af6de3 Mon Sep 17 00:00:00 2001 From: cheesecrust Date: Mon, 15 Jul 2024 11:07:05 +0900 Subject: [PATCH 6/6] reformat docs --- docs/ascii-protocol/ch04-command-key-value.md | 50 +++++++++---------- .../ch10-command-item-attribute.md | 24 ++++----- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/ascii-protocol/ch04-command-key-value.md b/docs/ascii-protocol/ch04-command-key-value.md index 093150e6e..e3683cd31 100644 --- a/docs/ascii-protocol/ch04-command-key-value.md +++ b/docs/ascii-protocol/ch04-command-key-value.md @@ -17,15 +17,15 @@ cas [noreply]\r\n\r\n Response string과 그 의미는 아래와 같다. -| Response String | 설명 | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -| "STORED" | 성공 | -| "NOT_STORED" | 연산 조건에 부합하지 않아 저장에 실패 함. ex) 이미 존재하는 key에 대해 add 연산, 존재하지 않는 key에 대해 replace, append, prepend 연산. | -| "NOT_FOUND" | cas 연산의 key miss. | -| "EXISTS" | cas 연산의 응답으로, 해당 아이템이 클라이언트의 마지막 fetch 이후 수정된 적이 있음을 뜻함. | -| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님. | -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format | -| "SERVER ERROR" | 서버 측의 오류로 저장하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory | +| Response String | 설명 | +|----------------------|------------------------ | +| "STORED" | 성공 +| "NOT_STORED" | 연산 조건에 부합하지 않아 저장에 실패 함. ex) 이미 존재하는 key에 대해 add 연산, 존재하지 않는 key에 대해 replace, append, prepend 연산. +| "NOT_FOUND" | cas 연산의 key miss. +| "EXISTS" | cas 연산의 응답으로, 해당 아이템이 클라이언트의 마지막 fetch 이후 수정된 적이 있음을 뜻함. +| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님. +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format +| "SERVER ERROR" | 서버 측의 오류로 저장하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory ## retrieval 명령 @@ -47,7 +47,6 @@ mget \r\n mgets \r\n <"space separated keys">\r\n ``` - - \<"space separated keys"\> - key list로, 스페이스(' ')로 구분한다. - \과 \ - key list 문자열의 길이와 key 개수를 나타낸다. @@ -66,10 +65,11 @@ END\r\n 실패시 string은 아래와 같다. -| Response String | 설명 | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format | -| "SERVER ERROR" | 서버 측의 오류로 조회하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory writing get response | + +| Response String | 설명 | +|----------------------|------------------------ | +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format +| "SERVER ERROR" | 서버 측의 오류로 조회하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory writing get response mget 명령에서 메모리 부족으로 일부 key에 대해서만 정상 조회한 후 실패한 경우, 전체 연산을 서버 에러 처리한다. @@ -83,11 +83,11 @@ delete [noreply]\r\n Response string과 그 의미는 아래와 같다. -| Response String | 설명 | -| --------------- | ------------------------------------------------------------------------------------------------------------------------ | -| "DELETED" | 성공 | -| "NOT_FOUND" | key miss | -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format | +| Response String | 설명 | +|----------------------|------------------------ | +| "DELETED" | 성공 +| "NOT_FOUND" | key miss +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) bad command line format ## Increment/Decrement 명령 @@ -104,12 +104,12 @@ decr [ ] [noreply]\r\n 실패시 Response string과 의미는 아래와 같다. -| Response String | 설명 | -| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| "NOT_FOUND" | key miss | -| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님 | -| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) invalid numeric delta argument, cannot increment or decrement non-numeric value | -| "SERVER ERROR" | 서버 측의 오류로 연산하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory | +| Response String | 설명 | +|----------------------|------------------------ | +| "NOT_FOUND" | key miss +| "TYPE_MISMATCH" | 해당 아이템이 key-value 타입이 아님 +| "CLIENT_ERROR" | 클라이언트에서 잘못된 질의를 했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) invalid numeric delta argument, cannot increment or decrement non-numeric value +| "SERVER ERROR" | 서버 측의 오류로 연산하지 못했음을 의미. 이어 나오는 문자열을 통해 오류의 원인을 파악 가능. 예) out of memory ## touch (Item의 expiretime 변경) diff --git a/docs/ascii-protocol/ch10-command-item-attribute.md b/docs/ascii-protocol/ch10-command-item-attribute.md index b782db090..a9b434772 100644 --- a/docs/ascii-protocol/ch10-command-item-attribute.md +++ b/docs/ascii-protocol/ch10-command-item-attribute.md @@ -29,11 +29,11 @@ END\r\n 실패 시의 response string과 그 의미는 아래와 같다. -| Response String | 설명 | -| -------------------------------------- | --------------------------------------------------------------------------------------- | -| "NOT_FOUND" | key miss | -| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. | -| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 | +| Response String | 설명 | +|-----------------------------------------|------------------------ | +| "NOT_FOUND" | key miss +| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. +| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 ## setattr (Item Attribute 변경) @@ -50,10 +50,10 @@ setattr = [= ...]\r\n 이 명령의 response string과 그 의미는 아래와 같다. -| Response String | 설명 | -| -------------------------------------- | --------------------------------------------------------------------------------------- | -| "OK" | 성공 | -| "NOT_FOUND" | key miss | -| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. | -| "ATTR_ERROR bad value" | 해당 attribute에 대해 새로 변경하고자 하는 value가 allowed value가 아님. | -| "CLIENT_ERROR bad command line format" | protocol syntax 틀림 | +| Response String | 설명 | +|-----------------------------------------|------------------------ | +| "OK" | 성공 +| "NOT_FOUND" | key miss +| "ATTR_ERROR not found" | 인자로 지정한 attribute가 존재하지 않거나 해당 item 유형에서 지원되지 않는 attribute임. +| "ATTR_ERROR bad value" | 해당 attribute에 대해 새로 변경하고자 하는 value가 allowed value가 아님. +| "CLIENT_ERROR bad command line format" | protocol syntax 틀림