Skip to content

syncMeta: _ID 기반 매칭으로 인한 태그 동기화 오작동 #4

@east-true

Description

@east-true

문제 요약

syncMeta()가 src/dst 태그를 _ID로 매칭하고 있어, 실제 환경에서 메타 동기화가 올바르게 동작하지 않는다.

문제 상세

1. _ID 매칭은 src/dst 간 일치를 보장할 수 없음

_ID는 TAG 테이블에 태그가 삽입될 때 DB가 자동 부여하는 내부 식별자다. Worker는 데이터 복제 시 태그 이름 문자열로 append하고 dst가 독립적으로 _ID를 부여하므로, src _ID와 dst _ID가 일치한다는 보장이 없다. 특히 autoCreate로 생성된 dst 테이블이나 태그가 다른 순서로 추가된 경우 완전히 어긋난다.

src: _ID=1 name=sensor-A, _ID=2 name=sensor-B
dst: _ID=1 name=sensor-B, _ID=2 name=sensor-A ← 순서가 다른 경우

_ID=1끼리 매칭하면 서로 다른 태그를 같은 태그로 인식해 잘못된 rename이 발생한다.

2. src에만 존재하는 태그(신규 추가)를 dst에 반영하지 않음

const dstRow = dstById.get(BigInt(srcRow._ID));
if (!dstRow) continue;  // dst에 없으면 그냥 건너뜀

src에 새로 추가된 태그는 dst에 INSERT되지 않는다. 이 태그의 데이터가 파티션에 복제되더라도 _TAG_META에 없으면 Worker에서 drop_not_found로 버려진다.

3. 태그당 DB 연결을 매번 새로 열고 닫음

for (const srcRow of srcMeta) {
  const updateClient = new MachbaseClient(this.target);
  updateClient.connect();
  updateClient.updateTagMeta(...);
  updateClient.close();
}

태그 수만큼 connect/close 오버헤드가 발생한다.

근본 원인

태그 rename 감지를 위해 _ID를 안정적인 식별자로 사용하고 있으나, 복제 구조상 src와 dst의 _ID가 일치한다는 전제가 성립하지 않는다.

해결 방향 (논의 필요)

Option A — rename 감지 포기, NAME 기반 매칭으로 전환

src/dst 태그를 NAME으로 매칭
dst에 없는 태그는 INSERT
메타 컬럼 값이 다른 태그는 UPDATE
rename 감지 불가 (src에서 이름이 바뀐 경우 별개의 신규 태그로 처리됨)

Option B — _ID 동기화 구조 도입

데이터 복제 시 dst에 src와 동일한 _ID로 insert
_ID를 안정적인 키로 사용 가능 → rename 감지 가능
Worker 및 append 구조 변경 필요
영향 범위
metaSync: true로 설정된 모든 TAG 복제 설정
src/dst _ID가 우연히 일치하는 경우 정상 동작처럼 보이나 신뢰할 수 없음

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions