bsr은 복제 데이타 생성을 식별하기 위해 생성 식별자(GI, Generation Identifiers)를 사용합니다. 이것은 bsr 내부 메카니즘에서 아래와 같은 용도로 사용됩니다.

생성 식별자

bsr은 다음의 경우에서 새로운 데이터 생성(Data Generation)이 시작되었음을 표시합니다.

따라서, 리소스가 Connected 연결 상태에 있고 양 노드의 디스크 상태가 UpToDate 이면 양 노드의 현재 GI는 동일하다 라고 할 수 있습니다. 반대의 경우도 마찬가지입니다.
모든 새로운 데이터 생성은 8 바이트의 UUID(universally unique identifier) 로 식별합니다. UUID의 최하위 비트는 노드의 역할을 표현하며 Primary는 1, Secondary는 0으로 설정됩니다. 

GI 튜플

bsr은 로컬 리소스 메타 데이타 내에 현재와 과거의 데이터 생성(data generation) 정보를 기본적으로 4개(Tuple)로 관리합니다.

이 4가지 모두를 묶어서 "generation identifier tuple" 또는 짧게 "GI 튜플" 이라고 합니다.

GI 변경 과정

새로운 데이터 생성 시작

bsr은 위 두 가지 경우에 대해 로컬 GI를 다음과 같은 방법으로 수정합니다.

  1. 새로운 데이터 생성을 위해 신규 UUID를 생성합니다. 이 UUID는 Primary 노드를 위한 새로운 Current UUID가 됩니다. 

  2. 이전의 UUID는 이제 비트맵 변화 상황을 추적하는 generation을 의미하기 때문에, Primary 노드에 대한 새로운 Bitmap UUID가 됩니다.

  3. Secondary 노드에서는 GI 튜플의 변화가 없습니다.

UUID는 볼륨에 쓰기 I/O 가 발생 되었을 때 신규로 생성됩니다. 따라서 GI가 생성되는 보다 더 정확한 조건은 연결이 끊어지는 등의 기존 조건에 더해 볼륨의 쓰기 I/O 발생이 요구됩니다.

재동기화 시작

재동기화가 시작될 때 GI 튜플의 변화는 없습니다.

재동기화 완료

재동기화가 완료되면 동기화 소스는 비트맵 uuid 를 rotate 시키고 동기화 타겟은 동기화 소스의 GI 튜플 전체 셋을 수신하여 동일하게 반영합니다.

GI 상태 식별

노드간에 연결이 맺어지면 두 노드는 현재 사용할 수 있는 GI 를 교환하고, 거기에 맞춰서 적절한 동작을 진행하는데 여기엔 몇가지 동작이 존재합니다.