[o2on-svn] [96] FIX: DB再構築で " database is locked" エラーが頻発することがある

Zurück zum Archiv-Index

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);
 




o2on-svn メーリングリストの案内
Zurück zum Archiv-Index