Database

Back / Up / Next


DatabaseはRunの情報を管理するプロセスである。 Run Number、Start Timeなどの静的な情報だけでなく、最新のRaw Data(1Block)やテープ残量の動的な情報も有している。 Databaseは複数のDataserverへRaw Dataを配信することができ、複数のマシンでオンライン解析が可能である。


Databaseの実体
Databaseのプロセスは以下の4つの非同期に発生するイベントを処理しなければならない。
  1. Controllerから命令の受け付け (TCP)
  2. Controllerやその他からの情報要求の応答 (TCP)
  3. Transferから最新のRaw Dataを受信 (UDP)
  4. Recorderからテープ残量を受信 (UDP)
これらを満たすため、上記の1、3、4についてはスレッドを生成して処理している。 2だけメインループで処理している。
/* Control commnads */
void controlThread(void){
  if((contaccsock = accept(contsock,(struct sockaddr *)&contcaddr,&len)) < 0){
    perror("Error in accept contaccsock.\n");
    exit(1);
  }
  close(contsock);
  while(1){
    recv(contaccsock,recvbuf,1024,MSG_WAITALL);
    controllCommand(recvbuf[0]);
    bzero(recvbuf,1024);
    bzero(sendbuf,1024);
  }
  close(contaccsock);
}

/* Disk Used */
void diskThread(void){
  unsigned char diskbuf[8];
  while(1){
    recvfrom(disksock,diskbuf,8,0,(struct sockaddr *)&caddr,&listlen);
    memcpy((char *)&dynamic_data.fulldisk,diskbuf,4);
    memcpy((char *)&dynamic_data.useddisk,diskbuf+4,4);
  }
}

/* List Data */
void listThread(void){
  /* List Data Socket */
  while(1){
    recvfrom(listsock,dynamic_data.listdata,datasize,0,(struct sockaddr *)&caddr,&listlen);
    multisend((char *)&dynamic_data.listdata);
  }
}

.
.
.

int main(int argc,char *argv[]){
  pthread_t controlthread,diskthread,listthread;
  .
  .
  .

  /* Create Thread */
  pthread_create(&controlthread,NULL,(void *)&controlThread,NULL);
  pthread_create(&diskthread,NULL,(void *)&diskThread,NULL);
  pthread_create(&listthread,NULL,(void *)&listThread,NULL);

  .
  .
  .
}


September 12, 2000
Hidetada Baba <baba@daq.rikkyo.ac.jp>