tokyocabinet을 사용중인데

잘 되다가 가끔 threading error이라는 메세지를 리턴한다.

읽을려는 파일이 read only라서 thread가 충돌할 일이 없다.


파일을 직접 열어서 확인하니

파일을 읽기 전용으로 열었는지에 대한 확인이 없고

절대 패스에 대해 lock을 거는 것 같다.

tcpathlock() 이부분에서 threading error를 리턴하는데

아래와 같이 간단히 해당 부분 회피 코드를 만들었다.


 tchdbopen 의 세번째 파라미터 omoderk O_RDONLY일때

tcpathlock()함수 호출전 omode 가 1이 아닐 경우만 tcpathlock()를 호출하도록 


file일 명 : tchdb.c

함수명 : tchdbopen


349 /* Open a database file and connect a hash database object. */

 350 bool tchdbopen(TCHDB *hdb, const char *path, int omode){

 351   assert(hdb && path);

 352   if(!HDBLOCKMETHOD(hdb, true)) return false;

 353   if(hdb->fd >= 0){

 354     tchdbsetecode(hdb, TCEINVALID, __FILE__, __LINE__, __func__);

 355     HDBUNLOCKMETHOD(hdb);

 356     return false;

 357   }

 358   char *rpath = tcrealpath(path);

 359   if(!rpath){

 360     int ecode = TCEOPEN;

 361     switch(errno){

 362       case EACCES: ecode = TCENOPERM; break;

 363       case ENOENT: ecode = TCENOFILE; break;

 364       case ENOTDIR: ecode = TCENOFILE; break;

 365     }

 366     tchdbsetecode(hdb, ecode, __FILE__, __LINE__, __func__);

 367     HDBUNLOCKMETHOD(hdb);

 368     return false;

 369   }

        if( omode != 1 )    /// =>  95   BDBOREADER = 1 << 0,                   /* open as a reader */


 370   if(!tcpathlock(rpath)){

 371     tchdbsetecode(hdb, TCETHREAD, __FILE__, __LINE__, __func__);

 372     TCFREE(rpath);

 373     HDBUNLOCKMETHOD(hdb);

 374     return false;

 375   }

 376   bool rv = tchdbopenimpl(hdb, path, omode);

 377   if(rv){

 378     hdb->rpath = rpath;

 379   } else {

 380     tcpathunlock(rpath);
 381     TCFREE(rpath);
 382   }
 383   HDBUNLOCKMETHOD(hdb);
 384   return rv;
 385 }


참고로 1.4.47을 사용했는데 1.4.48에서도 위 코드에는 변화가 없었다.