Tools

repo tools 는 command line 을 사용하여 repo 의 동작을 지시합니다.

1. ndnputfile

데이터를 repo 에 insert 하는데 사용됩니다.

$ ndnputfile <command> repo-prefix  ndn-name  filename

지금까지 지원되는 명령 목록은 다음과 같습니다:

$ ndnputfile -h
     -u: unversioned: 버전 구성 요소를 추가하지 말 것
     -s: single: 버전 또는 세그먼트 구성 요소를 추가하지 말 것, -u 내용 참조
     -D: DigestSha256 signing method 사용
     -i: Data 서명을 위한 ID 지정
     -I: Command 서명에 사용되는 ID 지정
     -x: FreshnessPeriod (milliseconds)
     -l: 각 Command 의 InterestLifetime (milliseconds)
     -w: 전체 프로세스에 대한 timeout (milliseconds; default unlimited)
     -v: be verbose

다음은 이러한 명령을 하나씩 소개합니다.

1.1 ndnputfile command List

ndn-name 다음에 수동으로 버전 번호를 추가하려면 -u 를 사용하여 지정할 수 있습니다. 그렇지 않으면 ndnputfile 은 자동으로 현재 시간에 따라 버전 번호를 추가합니다. 예를들어

$ ndnputfile -u /example/repo/1  /example/data/1/%FD%00%00%01G%F0%C8%AD-  test.txt
$ ndnputfile /example/repo/1  /example/data/1/ test.txt

두 경우 모두 real ndn-name 은 /example/data/1/%FD%00%00%01G%F0%C8%AD- 입니다.

정확히 하나의 데이터를 사용하여 파일을 저장하려면 -s 를 사용하여 지정할 수 있습니다. 그렇지 않으면 파일 내용이 여러 개의 세그먼트 데이터로 분리됩니다.

$ ndnputfile -s /example/repo/1  /example/data/1/  test.txt

이 방법으로 모든 콘텐츠는 하나의 데이터 패킷에 저장되며 세그먼트 번호는 추가되지 않습니다. 위 예에서 실제 NDN 이름은 /example/data/1/%FD%00%00%01G%F0%C8%AD- 입니다.

파일이 충분히 크고 하나의 데이터 패킷에 저장할 수 없는 경우 -s 를 지정하면 안됩니다. 이런 식으로, ndnputfile 은 자동으로 데이터 내용을 분리하고 세그먼트 번호를 사용하여 다른 세그먼트를 식별합니다.

$ ndnputfile /example/repo/1 /example/data/1/ test.jpg

이 경우 데이터는 세그먼트화되고 세그먼트 번호는 0부터 시작합니다. 실제 NDN 이름은 /example/data/1/%FD%00%00%01G%F0%C8%AD-/%00%00 입니다.

주의: 세그먼트 데이터를 insert 하기 위해 데이터가 충분히 크지 않을 경우 -s 는 하나의 세그먼트만 생성합니다. 실제 NDN 이름에는 세그먼트 번호 /%00%00 이 포함됩니다.

-D 를 지정하여 데이터 패킷 및 명령 관련 서명 방법으로 DigestSha256 을 선택할 수 있습니다.

$ ndnputfile -D /example/repo/1  /example/data/1/  test.txt

-I 및 -i 를 각각 사용하여 command interest 또는 데이터 서명을 위한 ID 를 지정할 수 있습니다.

$ ndnputfile -I /ndn/test/alice /example/repo/1  /example/data/1  test.txt
$ ndnputfile -i /ndn/test/bob /example/repo/1  /example/data/1  test.txt

-x 를 사용하여 데이터 freshness 시간을 설정할 수 있습니다. 시간은 밀리 초 단위로 측정됩니다. 예 :

$ ndnputfile -x 4000 /ndn/test/alice /example/repo/1  /example/data/1  test.txt

interest life-time 을 지정하려면 -l 을 사용하여 interest time out 값을 설정할 수 있습니다. 예:

$ ndnputfile -l 1000 /ndn/test/alice /example/repo/1  /example/data/1  test.txt

-w 를 사용하여 전체 insert 프로세스의 시간 초과를 설정할 수 있습니다. 시간이 만료되면 프로세스가 중지됩니다.

-v 를 지정하여 로그 정보를 인쇄 할 수 있습니다.

2. ndngetfile

데이터를 repo 에서 get 하는데 사용됩니다.

$ ndngetfile <command> ndn-name

지금까지 지원되는 명령 목록은 다음과 같습니다:

$ ndngetfile -h
     -v: be verbose
     -s: only get single data packet
     -u: versioned: ndn-name 에는 버전 component.if -u 가 포함되어 있지 않습니다.이 명령은 prefix 의 가장 오른쪽에 있는 자식을 반환
     -l: InterestLifetime (milliseconds)
     -w: 전체 프로세스에 대한 timeout (milliseconds; default unlimited)
     -o: stdout 대신 local file name 작성

다음은 이러한 명령을 하나씩 소개합니다.

2.1 ndngetfile command List

-s 가 지정되면 하나의 데이터만 get 합니다. 이 명령은 데이터가 ndnputfile -s 에 의해 insert 될 때만 사용해야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다. 세그먼트 번호가 없는 단일 데이터만 이 명령으로 가져올 수 있습니다. 예:

$ ndngetfile -s /example/data/1

반환된 데이터는 예를들어 /example/data/1/%FD%00%00%01G%F0%C8%AD- 일 수 있습니다. /example/data/1/%FD%00%00%01G%F0%C8%AD-/%00%00 데이터는 가져 (fetch) 올 수 없습니다. -s 가 지정되지 않으면, ndngetfile 은 동일한 prefix 를 가진 모든 세그먼트 데이터를 가지고 (fetch) 오려고 시도합니다.

ndn-name 다음에 수동으로 버전 번호를 추가하려면 -u 를 지정하여 특정 버전의 데이터를 선택할 수 있습니다. 예 :

$ ndngetfile -u /example/data/1/%FD%00%00%01G%F0%C8%AD-

-u 를 지정하지 않으면 최신 버전 번호 (맨 오른쪽 자식) 가 있는 데이터가 반입됩니다.

-o 를 지정하여 로컬 파일에 쓰기를 선택할 수 있습니다. 그렇지 않으면, ndngetfile 은 stdout 을 사용합니다. 예 :

$ ndngetfile -o result.txt /example/data/1

내용은 result.txt 에 기록됩니다.

-w, -l, -v 명령은 ndnputfile 과 유사합니다.


Software Structure

1. Major Modules

  • Database Handle: read, insert, update, delete 를 포함한 데이터베이스 관련 작업 처리를 위한 기본 인터페이스; interest 의 selector 에 따라 NDN 패킷에서 작동; 이 모듈은 storage-handle directory 에 위치
  • Command Echo: 각 echo module 은 서로 다른 기능의 interest 및 command 를 별도로 처리할 수 있음; read-echo 를 통한 read, write-echo 를 통한 insert 및 insert progress check 그리고 delete-echo 를 통한 삭제
  • Helpers: repo command parameter, response 및 repo TLV 포멧 정의
  • Server: starting repo 프로세스는 reading configuration file, initiating database, registration prefix 를 포함하여 정의; repo 의 주요 기능 포함
  • Test: Unit Test

2. Module Relation Graph

--------------------------------
|                              |
|         Repo Server          |
|                              |
--------------------------------
              ||
              || contains
              \/
--------------------------------
|                              |
|  Interest and Command Echo   | 
|  Read, Insert and Delete     |
|                              |
--------------------------------
              ||
              || uses 
              \/ 
--------------------------------
|                              |
|       Database Handle        |
|                              |
--------------------------------

Database Design

1. Lists of Tables

  • NDN_REPO

2. Specifics of Tables

2.1 NDN_REPO

2.1.1 Columns

  • name: TLV 데이터 패킷의 블록 이름 (BLOB PRIMARY KEY)
  • data: 전체 TLV 포멧의 데이터 패킷 (BLOB)
  • parentName: name length 가 ‘name - 1’ 인 TLV 포멧의 prefix (BLOB)
    • 예) name 이 /a/b/c/ 이면 parentName 은 /a/b
    • root name 이 / 인 경우 parentName 은 null
  • nChildren: name 의 direct children 수 (INTEGER)
    • 예) raw name: /a/b, /a/b/c, /a/b/d, /a/b/c/d (/a/b 의 children: 2, /a/b/c 의 children: 1, /a/b/d 및 /a/b/c/d 의 children: 0)

2.1.2 Note

name 및 pname 을 사용하여 테이블은 prefix tree 를 작성합니다.


Repo Deletion Protocol

Repo deletion protocol 은 Repo Command 를 사용합니다. 특정 prefix 내의 단일 콘텐츠 객체 또는 콘텐츠 객체 삭제는 모두 repo 사양 (specification) 에서 지원됩니다. Selector 는 여러 콘텐츠 객체를 선택하는데 사용됩니다. 이러한 selector 는 기존의 interest 패킷 selectors 와 다릅니다. 기존 interest selector 는 하나의 repo 데이터 패킷을 선택합니다. delete command Selectors 는 이 selector 에 적용되는 모든 데이터 패킷을 반환합니다. 세그먼트 데이터의 삭제도 지원됩니다.

1. Basic operations

1.1 Deletion command interest semantics

Command verb: delete

Deletion command interest 는 repo command 포멧을 따릅니다. 예:

/ucla/cs/repo/delete/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>

2. Formats

2.1 Deletion Command RepoCommandParameter

deletion command 의 포멧 RepoCommandParameter 는 Repo Command 를 따릅니다. Name, Selector, StartBlockId, EndBlockId, ProcessId 는 RepoCommandParameter 를 생성하는 데 사용됩니다.

Name 은 repo가 삭제할 데이터의 name 또는 prefix 입니다.

Selector 는 데이터를 선택하는데 사용됩니다. ChildSelector 는 삭제 명령에서 지원되지 않습니다.

StartBlockId 및 EndBlockId 는 세그먼트 데이터를 삭제하는데 사용됩니다. StartBlockId 와 EndBlockId 사이의 세그먼트 ID 데이터는 repo 에 의해 삭제됩니다.

ProcessId 는 클라이언트가 삭제 프로세스를 나타내기 위해 생성한 난수입니다. Repo 는 ProcessId 를 삭제 프로세스와 일치시킵니다.

2.2 Deletion Command Selectors

Deletion command selectorrepo command selectors 다음에 옵니다.

2.3 Deletion status check

deletion progress 동안 requester 는 deletion status check command 를 전송하여 deletion progress 상태를 확인할 수 있습니다. status check commandsigned interest 입니다. deletion status check command 는 repo command 형식을 따릅니다. <command verb> 는 check 를 삭제하는 것과 같습니다. 예:

/ucla/cs/repo/delete/<RepoCommandParameter>/<timestamp>/<random-value>/<SignatureInfo>/<SignatureValue>

2.4 Deletion status check RepoCommandParameter

Name 및 ProcessId 는 특정 삭제 프로세스를 나타내는데 사용됩니다. Repo 는 Name 과 ProcessId 를 사용하여 특정 삭제 프로세스를 일치시킵니다. 일치하면 repo 가 삭제 진행 상황에 응답합니다. Name 또는 ProcessId 중 하나만 일치하면 실패합니다.

2.5 Deletion Check Command Selectors

Selectors 는 지원되지 않습니다. Repo 는 deletion status check command 를 처리 할 때 selectors 를 무시합니다.

2.6 Deletion status response

Deletion status 응답은 repo deletion commandrepo deletion check command 의 응답으로 사용됩니다.

Name, StatusCode, Selector, StartBlockId, EndBlockId, ProcessId, DeleteNum 은 삭제 상태 응답에 사용됩니다. Name, ProcessId, Selector 는 delete 명령과 동일합니다. StatusCode 는 삭제 상태를 나타냅니다. DeleteNum 은 삭제 된 데이터 패킷 수를 나타냅니다.

Repo Deletion Command 에서 StartBlockId 가 나타나면 EndBlockId 가 Repo 가 보유한 가장 큰 세그먼트 ID 일 수 있습니다. EndBlockId 가 나타나면 StartBlockId 가 0 으로 설정됩니다.

StatusCode Definition:

StatusCode Description
200 모든 데이터 삭제
300 삭제가 진행 중
401 삭제 또는 삭제 검사 무효화
402 Selectors 또는 BlockId 없음
403 Malformed Command
404 삭제 작업 이상

3. Protocol process

  1. command authorize 시작; 승인이 실패하지 않으면 3 단계로 이동
  2. authorization failure 응답을 보내고 단계를 중단하고 삭제 프로세스 종료 (StatusCode : 401)
  3. 동일한 RepoCommandParameter 의 삭제 프로세스가 삭제 프로세스를 기다리는지 여부 확인
  4. Selector 와 StartBlockId 및 EndBlockId 중 하나가 표시되면 응답을 보내고 단계를 중단하고 삭제 프로세스 종료 (StatusCode: 402)
  5. Selector 가 있는 경우; 8 단계로 이동
  6. StartBlockId 또는 EndBlockId 가 나타나는지 확인; StartBlockId 가 EndBlockId 보다 크면 부정적 응답을 반환하고 삭제 프로세스를 종료; (StatusCode : 403) 또는 9 단계 이동
  7. StartBlockId, EndBlockId 및 Selector 가 모두 누락 된 경우 10 단계로 이동
  8. name 과 selector 를 준수하는 모든 데이터를 삭제하고 11 단계로 이동
  9. StartBlockId 와 EndBlockId 사이의 세그먼트 ID의 모든 데이터 패킷을 삭제; StartBlockId 가 없으면 StartBlockId 는 0 으로 설정; EndBlockId 가 누락 된 경우 EndBlockId 는 repo 가 보유하는 가장 큰 세그먼트 ID 로 설정; 11 단계로 이동
  10. name 과 같은 prefix 가 있는 모든 데이터를 삭제; 11 단계로 이동
  11. interest 가 만료되지 않으면 긍정적인 상태 코드의 상태 응답 반환; interest 기간이 만료된 경우 동일한 RepoCommandParameter 에 대한 interest 를 기다리고 상태 응답을 반환; 삭제 프로세스 종료 (StatusCode : 200)

클라이언트는 deletion command 를 설정합니다. lifetime 이 만료되면 클라이언트는 명령을 다시 표현합니다. (re-express)

구현은 삭제 진행에 대한 상태 통지를 발표 할 수 있습니다. 상태 확인 프로세스는 다음과 같습니다.

  1. delete status command authorize 시작
  2. authorization failure 응답을 보내고 단계를 중단 (StatusCode: 401)
  3. command 에 데이터 이름을 사용하여 삭제 진행 상황을 점검하기 시작; progress 상황이 발견되지 않으면 4 단계로 이동하거나 5 단계로 이동
  4. 응답 코드 404 (상태 코드: 404)
  5. 삭제 상태 확인 (상태 코드 : 300)

3.1 Protocol diagram:

Requester                     Repo 
    |                           |                                 
    |                           |                                 
  +---+  Delete command       +---+                               
  |   | --------------------> |   |                               
  +---+                       +---+                               
    |                           |                                 
    |                           |                                 
    |                           |                                 
  +---+   Status interest     +---+                               
  |   | --------------------> |   |                               
  +---+                       |   |                               
    |                         |   |                               
  +---+    Status response    |   |                               
  |   | <==================== |   |                               
  +---+                       +---+                               
    |                           |                                 
    |                           |                                 
    |                           |                                 
  +---+   Confirm Deletion    +---+                               
  |   | <==================== |   |                               
  +---+   Reject command      +---+                               
    |     (with status code)    |    
    |                           |

Tcp Bulk Insert Repo Insertion Protocol

Tcp Bulk Insert Repo Insert 프로토콜은 repo Insert 프로토콜의 특별한 부분입니다.

Repo 와 producer 가 동일한 호스트에서 실행될 때 TCP bulk 를 사용하여 Repo storage 에 직접 데이터를 insert 할 수 있습니다.

1. Basic operations

1.1 Listen

Listen 은 초기 repo operation 입니다. Repo는 먼저 listen() 을 invoke 하여 TCP 소켓에서 listen 합니다. 호스트 및 포트 번호 정보는 parameter 로 전달됩니다. 전체 insert 는 비동기 프로세스이며 메인 스레드는 다른 자식 스레드에 작업을 listening 및 할당 (assigning) 합니다.

1.2 Handle

Handle 은 다음 2 가지 operations 이 포함됩니다: handleAccept, handleReceive. HandleAccept() 는 listen() 의 콜백 함수입니다. 소켓에서 연결을 수락하고 프로세스 후 다음 연결을 수락할 준비를 합니다. 연결이 끝나면 데이터 패키지를 분석하기 위해 HandleReceive 가 호출됩니다.

1.3 StartReceive

handleReceive 함수를 시작하고 비동기 수신을 준비하십시오.

ProcessId 는 클라이언트가 삭제 프로세스를 진행하기 위해 생성한 난수입니다. Repo 는 ProcessId 를 삭제 프로세스와 일치시킵니다.