Bspark/bulk bop insert#235
Conversation
14558e9 to
f0c64c5
Compare
|
@minkikim89 |
|
@computerphilosopher |
|
stats_prefix 외의 위치라면 process_command()에서 로깅 함수를 호출하는 것이 제일 적절하다고 생각합니다. 명령어를 파싱하는 함수에서 바로 로깅하는 것이기 때문에 흐름상 자연스럽고, 로깅에 필요한 명령어, client ip, key를 모두 인자로 받기 때문입니다. stats_prefix 에서 로깅할 경우 파싱이 끝난 상태여서 잘못된 명령어가 기록될 가능성은 걱정하지 않아도 되는데 process_command() 로 위치를 바꿀 경우 별도의 예외 처리를 해야할 것 같습니다. |
f0c64c5 to
f1e331b
Compare
|
@computerphilosopher
위 요구 사항을 만족시키면서 적절한 위치와 방안이 있다면, |
f1e331b to
42d796a
Compare
#memcached.c
def process_command():
if cmd_in_second.state == on_logging:
STATS_LOCK()
cmd_in_second.write(command, key, client_ip)
STATS_UNLOCK()
if command == "get" or command == "bget":
process_get_command(command)
...
elif command == "cmd_in_second" and cmd_in_second.state == not_started:
process_second_command(command)
else:
print("ERROOR unkown command")
return
def process_second_command(command):
if bad_command_line_format(command):
return False
if already_started:
return False
cmd_in_second.start()
return True
#cmd_in_second.c
def start(command):
if unknown_command(command):
return False
buffer.init()
timer.init()
return True
def write(command, key, client_ip):
if bad_command_line_format(command):
return False
if not command_to_log(command):
return False
log = (command, key, client_ip)
buffer.add(log)
if buffer.full() and timer.diff(buffer) <= 1
buffer.flush()
return True |
|
@computerphilosopher @minkikim89
|
minkikim89
left a comment
There was a problem hiding this comment.
@computerphilosopher
확인해보고 의견주세요.
697df8c to
89f34dd
Compare
|
리뷰 사항 반영해서 다시 푸쉬하였습니다. |
7871667 to
8b997d7
Compare
8b997d7 to
638e828
Compare
|
STATS_LOCK 대신 별도 락을 가지는 버전을 푸쉬했습니다. |
6746bb9 to
0dd5d15
Compare
0dd5d15 to
964e935
Compare
fb90964 to
024ab6e
Compare
024ab6e to
0a97164
Compare
| } | ||
|
|
||
| /* TODO mc_logger */ | ||
| void cmd_in_second_init(EXTENSION_LOGGER_DESCRIPTOR *global_logger) |
There was a problem hiding this comment.
다른 코드와 되도록 비슷한 형식으로 짜주어야 코드 보는 사람이 편합니다. 다른 쪽에서 다 파라미터 이름을 logger로 하고 있기 때문에 여기서는 logger 라는 파라미터 이름을 써주세요.
여기서 한번에 다 말하자면, 다른 변수명들이나 코드 스타일도 마찬가지에요. 다른쪽을 참고하여 최대한 동일하게 가져가려는 노력이 필요해요. 예를들어 현재 cmd_in_second 구조체 변수를 this라는 이름으로 사용하고 있는데 c언어에서 잘 사용하지 않은 형식의 변수명입니다. 다른 코드들을 참고하여 전체적으로 일반적으로 쓰이는 변수명을 택했으면 좋겠어요.
|
|
||
| pthread_mutex_init(&this.lock, NULL); | ||
|
|
||
| flush_thread* const flusher = &this.flusher; |
There was a problem hiding this comment.
thread 관련 변수를 사용하는 경우가 모든 함수에서 그렇게 많지 않은데 매번 포인터를 정의해서 처리하고 있어요. 이런식으로 하지말고 this.flusher.attr 이런식으로 바로 쓰는게 오해의 여지가 적을 것 같아요.
또 const 키워드를 의식적으로 계속 사용하고 있는데, 필요없는 상황에서 사용한 경우가 대다수에요. 다른 코드들에서 const 키워드가 어떤식으로 사용되는지를 확인하고 사용해주세요. 만약에 다른쪽을 보고서도 어떤 상황에서 쓰이는지 모르겠으면 물어봐요.
|
|
||
| static void* flush_buffer() | ||
| { | ||
| const int fd = open("cmd_in_second.log", O_CREAT | O_WRONLY | O_TRUNC, 0644); |
There was a problem hiding this comment.
파일 오픈도 start 시에 하도록 하는게 좋겠네요.
| process_config_command(c, tokens, ntokens); | ||
| } | ||
| #ifdef CMD_IN_SECOND | ||
| else if ((ntokens == 4 || ntokens == 5) && (strcmp(tokens[COMMAND_TOKEN].value, "cmd_in_second") == 0)) |
There was a problem hiding this comment.
cmd_in_second stop 기능도 있어야겠어요.
| timer_add(); | ||
| } | ||
|
|
||
| buffer_add(&log); |
There was a problem hiding this comment.
지금하는 방식으로 buffer에 log 삽입하면 데이터 복제가 추가적으로 일어나요.
위에서 log 선언해서 로컬 변수로 log 구조체를 만들었는데 해당 구조체를 buffer에 삽입할 때 다시 한번 복제하고 있어요. 이렇게 log 구조체를 미리 만들고 그것을 복사하여 버퍼에 넣는 것보다는, 이미 buffer에 공간이 있기 때문에 그 공간만을 가져와서 해당 공간에다가 바로 데이터를 복제하는 편이 맞아요.
0807b3d to
3cf9ef7
Compare
3cf9ef7 to
c9997e1
Compare
|
@computerphilosopher |
|
관련 이슈가 아직 안 만들어졌습니다. 이 저장소에 새로 하나 만들까요? |
|
@computerphilosopher |
@minkikim89
bop insert를 로깅하는 것이 가장 중요한 일 같아서 일단 커밋을 두 개로 나누었습니다. 첫 번째 커밋은 bop insert 시에만 로깅이 실행되도록 하였고 두 번째 커밋은 모든 콜렉션, 키밸류 관련 명령에서 실행되도록 고쳤습니다.
리뷰가 끝나면 rebase 하도록 하겠습니다.
변경 개요
cmd_in_second.c
사내 세미나에서 발표한 기능입니다.
stats.c