Commit 6dbe8601 authored by Jonathan Haas's avatar Jonathan Haas

Synchronisierung auf schreibende Container beim Nachfordern unnötig, der...

Synchronisierung auf schreibende Container beim Nachfordern unnötig, der iterator synchronisiert sich eh (lesend) und schreibender Zugriff findet aus diesem Thread nicht statt.
parent 42cd12cf
......@@ -468,10 +468,6 @@ public class RequestGapTask extends SingleClientSenderTask {
try {
suspendTaskIfNecessary(); //Hält den Task an, falls das Archivsystem im kritischen Bereich.
if(!din.arSParamIsNachfordern()) {
_debug.fine("Nachfordern ist nicht parametriert für " + din.getDataIdentification() + ".");
return; // Nachfordern nicht parametriert
......@@ -496,64 +492,56 @@ public class RequestGapTask extends SingleClientSenderTask {
return;
}
// Synchronisierung über DataIdentNode (Busy-Area):
try(DinLock lock = din.lockContainers()) {
if(lock == null) {
_debug.warning("Nachfordern fehlgeschlagen fuer Datenidentifikation: " + din);
return;
}
dataDesc = new DataDescription(archMgr.getAtg(atg), archMgr.getAsp(asp));
object = archMgr.getObj(obj);
dataDesc = new DataDescription(archMgr.getAtg(atg), archMgr.getAsp(asp));
object = archMgr.getObj(obj);
final IdDataIdentification dataIdentification = new IdDataIdentification(obj, atg, asp, sv);
QueryDataSequence dataSequence = new QueryDataSequence(archMgr, archMgr.getDataIdentTree().existsCreate(dataIdentification), ArchiveDataKindCombination
.all(), ats, ArchiveOrder.BY_INDEX, DeletedTreatment.Full);
final IdDataIdentification dataIdentification = new IdDataIdentification(obj, atg, asp, sv);
QueryDataSequence dataSequence = new QueryDataSequence(archMgr, archMgr.getDataIdentTree().existsCreate(dataIdentification), ArchiveDataKindCombination
.all(), ats, ArchiveOrder.BY_INDEX, DeletedTreatment.Full);
boolean skipLine = false;
try(DataIterator iterator = dataSequence.iterator()) {
boolean skipLine = false;
try(DataIterator iterator = dataSequence.iterator()) {
long lowDidx = -1, lowDTime = -1, lowATime = -1;
long lowDidx = -1, lowDTime = -1, lowATime = -1;
gapFile = new GapFile(obj, atg, asp, sv);
gapFile.createTmpGapFile();
boolean startCondition = false;
while(!iterator.isEmpty()) {
gapFile = new GapFile(obj, atg, asp, sv);
gapFile.createTmpGapFile();
boolean startCondition = false;
while(!iterator.isEmpty()) {
if(shouldTerminate()) break;
if(shouldTerminate()) break;
long hiDidx = iterator.peekDataIndex();
long hiDidx = iterator.peekDataIndex();
// Prüfen, ob wir im angegebenen Bereich sind. Dies ist der Fall, wenn die Lücke
// vollständig im Bereich liegt. Ggf. Lückendatei vor und nach dem Bereich kopieren.
if(!startCondition) {
if(startCondition(ats, lowDidx, lowDTime, lowATime)) {
gapFile.copyGapsUpToHere(lowDidx);
startCondition = true;
}
// Prüfen, ob wir im angegebenen Bereich sind. Dies ist der Fall, wenn die Lücke
// vollständig im Bereich liegt. Ggf. Lückendatei vor und nach dem Bereich kopieren.
if(!startCondition) {
if(startCondition(ats, lowDidx, lowDTime, lowATime)) {
gapFile.copyGapsUpToHere(lowDidx);
startCondition = true;
}
if(startCondition) {
if(isGap(lowDidx, hiDidx)) {
totalGapsFound.incrementAndGet();
newGaps.reset();
// rausfinden, wo wir fragen müssen, wo erfolglos gefragt wurde und wo von den erfolglosen
// wir nicht mehr fragen (weil die auch weiterhin in der Lückendatei vermerkt sein sollen):
String[] failedArchives = gapFile.getEntry(lowDidx, hiDidx);
String[] unaskedArchives = extractUnaskedArS(requestArchives, failedArchives);
skipLine = failedArchives.length > 0; // wenn es einen Eintrag gab, diesen beim Kopieren überspringen
requestGap(requestArchives, 0, lowDidx, hiDidx, unaskedArchives, gapFile, newGaps);
gapFile.appendToTmpGapFile(newGaps.reduce());
}
}
if(startCondition) {
if(isGap(lowDidx, hiDidx)) {
totalGapsFound.incrementAndGet();
newGaps.reset();
// rausfinden, wo wir fragen müssen, wo erfolglos gefragt wurde und wo von den erfolglosen
// wir nicht mehr fragen (weil die auch weiterhin in der Lückendatei vermerkt sein sollen):
String[] failedArchives = gapFile.getEntry(lowDidx, hiDidx);
String[] unaskedArchives = extractUnaskedArS(requestArchives, failedArchives);
skipLine = failedArchives.length > 0; // wenn es einen Eintrag gab, diesen beim Kopieren überspringen
requestGap(requestArchives, 0, lowDidx, hiDidx, unaskedArchives, gapFile, newGaps);
gapFile.appendToTmpGapFile(newGaps.reduce());
}
lowDidx = hiDidx;
lowDTime = iterator.peekDataTime();
lowATime = iterator.peekArchiveTime();
iterator.remove();
}
lowDidx = hiDidx;
lowDTime = iterator.peekDataTime();
lowATime = iterator.peekArchiveTime();
iterator.remove();
}
gapFile.copyRestGaps(skipLine);
}
gapFile.copyRestGaps(skipLine);
}
catch(InterruptedException e) {
_debug.fine("Nachfordern wurde unterbrochen: '" + Util.did2Str(obj, atg, asp, sv) + "': " + e.getMessage());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment