added necessary synchronization for logging statistics (causes deadlock)

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@6083 6c8d7289-2bf4-0310-a012-ef5d649a1542
This commit is contained in:
orbiter 2009-06-16 10:37:13 +00:00
parent e377a1e9a1
commit b5bc399cea

View File

@ -195,28 +195,30 @@ public class yacysearch {
Log.logInfo("LOCAL_SEARCH", "ACCECC CONTROL: WHITELISTED CLIENT FROM " + client + " gets no search restrictions"); Log.logInfo("LOCAL_SEARCH", "ACCECC CONTROL: WHITELISTED CLIENT FROM " + client + " gets no search restrictions");
} else if (global || fetchSnippets) { } else if (global || fetchSnippets) {
// in case that we do a global search or we want to fetch snippets, we check for DoS cases // in case that we do a global search or we want to fetch snippets, we check for DoS cases
int accInOneSecond = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 1000)).size(); synchronized (trackerHandles) {
int accInThreeSeconds = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 3000)).size(); int accInOneSecond = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 1000)).size();
int accInOneMinute = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 60000)).size(); int accInThreeSeconds = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 3000)).size();
int accInTenMinutes = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 600000)).size(); int accInOneMinute = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 60000)).size();
if (accInTenMinutes > 600) { int accInTenMinutes = trackerHandles.tailSet(Long.valueOf(System.currentTimeMillis() - 600000)).size();
global = false; if (accInTenMinutes > 600) {
fetchSnippets = false; global = false;
block = true; fetchSnippets = false;
Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInTenMinutes + " searches in ten minutes, fully blocked (no results generated)"); block = true;
} else if (accInOneMinute > 200) { Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInTenMinutes + " searches in ten minutes, fully blocked (no results generated)");
global = false; } else if (accInOneMinute > 200) {
fetchSnippets = false; global = false;
block = true; fetchSnippets = false;
Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInOneMinute + " searches in one minute, fully blocked (no results generated)"); block = true;
} else if (accInThreeSeconds > 1) { Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInOneMinute + " searches in one minute, fully blocked (no results generated)");
global = false; } else if (accInThreeSeconds > 1) {
fetchSnippets = false; global = false;
Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInThreeSeconds + " searches in three seconds, blocked global search and snippets"); fetchSnippets = false;
} else if (accInOneSecond > 2) { Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInThreeSeconds + " searches in three seconds, blocked global search and snippets");
global = false; } else if (accInOneSecond > 2) {
fetchSnippets = false; global = false;
Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInOneSecond + " searches in one second, blocked global search and snippets"); fetchSnippets = false;
Log.logWarning("LOCAL_SEARCH", "ACCECC CONTROL: CLIENT FROM " + client + ": " + accInOneSecond + " searches in one second, blocked global search and snippets");
}
} }
} }
@ -509,9 +511,11 @@ public class yacysearch {
// update the search tracker // update the search tracker
try { try {
trackerHandles.add(theQuery.handle); synchronized (trackerHandles) {
if (trackerHandles.size() > 1000) trackerHandles.remove(trackerHandles.first()); trackerHandles.add(theQuery.handle);
sb.localSearchTracker.put(client, trackerHandles); if (trackerHandles.size() > 1000) trackerHandles.remove(trackerHandles.first());
sb.localSearchTracker.put(client, trackerHandles);
}
if (sb.localSearchTracker.size() > 1000) sb.localSearchTracker.remove(sb.localSearchTracker.keys().nextElement()); if (sb.localSearchTracker.size() > 1000) sb.localSearchTracker.remove(sb.localSearchTracker.keys().nextElement());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();