INTERNAL: read while PIPE_ERROR received in the pipe operation#839
INTERNAL: read while PIPE_ERROR received in the pipe operation#839jhpark816 merged 1 commit intonaver:developfrom
Conversation
|
@uhm0311 먼저 리뷰하면 됩니다. |
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionBulkInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/OperationImpl.java
Outdated
Show resolved
Hide resolved
faec8fa to
20cf3d9
Compare
src/main/java/net/spy/memcached/protocol/ascii/OperationImpl.java
Outdated
Show resolved
Hide resolved
|
@oliviarla @uhm0311 |
5493230 to
466ff60
Compare
|
@uhm0311 @jhpark816 |
00d28cd to
63fac49
Compare
src/main/java/net/spy/memcached/protocol/ascii/OperationImpl.java
Outdated
Show resolved
Hide resolved
a752f86 to
7bf52e7
Compare
|
@jhpark816 리뷰 부탁드립니다. |
|
@oliviarla 리뷰 진행 중입니다. |
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedUpdateOperationImpl.java
Outdated
Show resolved
Hide resolved
|
@jhpark816 @uhm0311
|
리다이렉트한다는 것이 어떤 의미인가요?
result가 있는 지에 따라 판단해야 할 지 ? 정도의 느낌이 듭니다. |
uhm0311
left a comment
There was a problem hiding this comment.
변경 내역을 다 따라가지 못해서 질문 남깁니다.
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/BaseOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
|
@uhm0311 리뷰 완료되셨을까요? |
|
진행 중입니다. |
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/BaseOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Outdated
Show resolved
Hide resolved
src/main/java/net/spy/memcached/protocol/ascii/OperationImpl.java
Outdated
Show resolved
Hide resolved
| protected void handleError(OperationErrorType eType, String line) throws IOException { | ||
| getLogger().error("Error: %s by %s", line, this); | ||
| exception = createException(eType, line); | ||
| if (count == 0 && index == 0) { |
There was a problem hiding this comment.
CollectionPipedInsertOperationImpl 클래스에서
명시적으로 index를 0으로 초기화해 두는 것처럼
명시적으로 count도 0으로 초기화해 두면 좋겠습니다.
그리고, count == 0 조건만 있어야 하고, index == 0 조건은 빠져야 합니다.
아래 경우에 index == 0이기 때문입니다.
RESPONSE 1
CLIENT_ERROR ...
PIPE_ERROR
그리고, switchover와 redirect하는 경우를 고려한다면,
count == 0 조건만 있으면 충분한 지 간단히 설명해 주세요.
There was a problem hiding this comment.
switchover / redirect하는 경우 count 값이 초기화되도록 수정했습니다. (count 값은 현재 사용하고 있지 않기 때문에 최신 RESPONSE <count> 정보를 저장해두는 용도로만 사용해도 됩니다.)
이를 통해 첫 번째 응답으로 ERROR가 올 경우 바로 예외를 던지고, RESPONSE 이후에 ERROR가 올 경우 PIPE_ERROR를 읽도록 합니다.
|
리뷰 모두 반영했습니다. |
src/main/java/net/spy/memcached/protocol/ascii/CollectionPipedInsertOperationImpl.java
Show resolved
Hide resolved
| import net.spy.memcached.ops.OperationType; | ||
| import net.spy.memcached.ops.StatusCode; | ||
|
|
||
| import static net.spy.memcached.ops.OperationErrorType.CLIENT; |
There was a problem hiding this comment.
질문입니다.
import static에서 static은 어떤 의미가 되나요?- 기존 코드에서도 CLIENT가 사용되고 있습니다. 이미 관련된 import가 존재하지 않는 지 ?
There was a problem hiding this comment.
static import를 하게 되면 해당 변수나 상수를 사용할 때 정의된 클래스 이름을 명시하지 않고 사용할 수 있습니다.
예를 들어 일반 import 시에는 OperationErrorType.CLIENT로 사용해야 하지만, static import 시에는 CLIENT로 사용할 수 있는데, 기존에는 switch문을 사용해서 static import할 필요가 없었습니다.
다만 CLIENT만 사용하는 것보단 OperationErrorType.CLIENT 사용하는 것이 더 이해가 쉬울 것 같아 static import를 제거했습니다.
| if (hasSwitchedOver(line)) { | ||
| this.insert.setNextOpIndex(index); | ||
| prepareSwitchover(line); | ||
| count = 0; |
There was a problem hiding this comment.
switchover 경우를 예로 들면,
이미 일부가 수행된 상태에서 나머지를 switchover한 후에 수행하면,
그 이후의 결과는 원소 결과로 처리해야 할 것 같습니다.
NOT_MY_KEY 경우도 함께 검토 바랍니다.
There was a problem hiding this comment.
switchover, redirect 로 인해 새로운 별도 요청을 보낸 후 응답을 받았을 때, RESPONSE가 올 수도 있고 하나의 ERROR 라인이 올 수도 있습니다.
이 때 RESPONSE가 왔을 때에만 예외를 던지지 않도록 하여 PIPE_ERROR까지 읽도록 합니다.
|
@jhpark816 |
🔗 Related Issue
⌨️ What I did
PIPE_ERROR를 끝까지 읽도록 변경한다.PIPE_ERROR를 읽지 않았다.PIPE_ERROR를 읽도록 변경만 해두고, 수행되지 않은 연산에 대한 gotStatus() 호출은 INTERNAL: make piped insert operations process synchronously #795 에 추가하도록 한다.