o2on svn commit
o2on-****@lists*****
2008年 5月 29日 (木) 12:38:14 JST
Revision: 96 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=o2on&view=rev&rev=96 Author: electrolysis Date: 2008-05-29 12:38:14 +0900 (Thu, 29 May 2008) Log Message: ----------- FIX: DB再構築で"database is locked"エラーが頻発することがある 詳細: 一回のトランザクションで処理する件数を最大で1000に制限して小分けし、個々のトランザクションに要する時間を短縮する Modified Paths: -------------- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-28 10:01:18 UTC (rev 95) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.cpp 2008-05-29 03:38:14 UTC (rev 96) @@ -17,6 +17,7 @@ #include <time.h> #define UPDATE_THREAD_INTERVAL_S 15 +#define MAX_UPDATE_QUEUE_SIZE 1000 #if defined(_DEBUG) #define TRACE_SQL_EXEC_TIME 1 @@ -1261,6 +1262,31 @@ +void +O2DatDB:: +divide_update(O2DatRecList &in) +{ + if (in.size() > MAX_UPDATE_QUEUE_SIZE) { + O2DatRecListIt begin = in.begin(); + O2DatRecListIt end = in.begin(); + while (end != in.end()) { + begin = end; + if (std::distance(end, in.end()) < MAX_UPDATE_QUEUE_SIZE) + end = in.end(); + else + std::advance(end, MAX_UPDATE_QUEUE_SIZE); + + O2DatRecList tmp(begin, end); + update(tmp); + } + } + else + update(in); +} + + + + bool O2DatDB:: remove(const hashT &hash) @@ -1364,7 +1390,7 @@ UpdateQueueLock.Lock(); if (!UpdateQueue.empty()) { - update(UpdateQueue); + divide_update(UpdateQueue); UpdateQueue.clear(); } UpdateQueueLock.Unlock(); @@ -1398,7 +1424,7 @@ UpdateQueueLock.Unlock(); if (!reclist.empty()) - update(reclist); + divide_update(reclist); t = time(NULL); CLEAR_WORKSET; //TRACEA("+++++ UPDATE +++++\n"); Modified: branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h =================================================================== --- branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h 2008-05-28 10:01:18 UTC (rev 95) +++ branches/BRANCH_0043/o2on/src.o2on/O2DatDB.h 2008-05-29 03:38:14 UTC (rev 96) @@ -97,6 +97,7 @@ // bool update(O2DatRec &in, bool is_origurl); void update(O2DatRecList &in); // bool update_lastpublish(const hashT &hash); + void divide_update(O2DatRecList &in); bool remove(const hashT &hash);