/* Protect against infinite looping */
if (this.transientStore == null || this.property == null ||
this.transientStore.getNumOfEntries() < 1)
break;
I_MapEntry oldest = this.transientStore.removeOldest();
if (oldest == null) {
if (log.isLoggable(Level.FINE)) log.fine("The RAM queue is full, new entry '" + mapEntry.getUniqueId() + "' seems to be the first and only one, so we accept it");
break;
}
if (log.isLoggable(Level.FINER)) log.finer("Swapping '" + oldest.getLogId() + "' to HD ...");
try {
if (!oldest.isPersistent()) { // if entry is marked as persistent it is already in persistentStore (see code above)
// swap away the oldest cache entry to harddisk ...
if (log.isLoggable(Level.FINE)) log.fine("Swapping '" + oldest.getLogId() + " size=" + oldest.getSizeInBytes() + "'. Exceeding size state after removing from transient before entering persistent: " + toXml(""));
if (this.persistentStore == null)
throw new XmlBlasterException(glob, ErrorCode.RESOURCE_DB_UNAVAILABLE, ME,
"assureTransientSpace: no persistent queue configured, needed for swapping, entry " + mapEntry.getLogId() + " is not handled");
if (!this.isConnected)
throw new XmlBlasterException(glob, ErrorCode.RESOURCE_DB_UNAVAILABLE, ME,
"assureTransientSpace: The DB is currently disconnected, entry " + mapEntry.getLogId() + " is not handled");
if (spaceLeft(oldest, this.persistentStore)) {
try {
this.persistentStore.put(oldest);
}
catch (XmlBlasterException ex) {
log.severe("assureTransientSpace: an error occured when writing to the persistent queue, transient entry " + oldest.getLogId() +
" is not swapped, new entry '" + mapEntry.getLogId() + "' is rejected. Is the DB up and running ? " + ex.getMessage() + " state: " + toXml(""));
throw ex;
}
}
else
throw new XmlBlasterException(glob, ErrorCode.RESOURCE_OVERFLOW_QUEUE_BYTES, ME,
"assureTransientSpace: maximum size in bytes for the persistent queue exceeded when swapping, entry " + mapEntry.getLogId() + " not handled . State: " + toXml(""));
}
oldest.isSwapped(true);
}
catch(XmlBlasterException ex2) {
this.transientStore.put(oldest); // undo on error
throw ex2; // swapping failed, we won't accept the new entry
}