Search in sources :

Example 1 with CacheEntry

use of org.dcache.pool.repository.CacheEntry in project dcache by dCache.

the class QoSMessageHandler method messageArrived.

/**
 * Returns whether replica exists, the status of its system sticky flag and whether its state
 * allows for reading and removal.
 */
public Reply messageArrived(ReplicaStatusMessage message) {
    MessageReply<Message> reply = new MessageReply<>();
    executor.execute(() -> {
        PnfsId pnfsId = message.getPnfsId();
        try {
            CacheEntry entry = repository.getEntry(pnfsId);
            message.setExists(true);
            switch(entry.getState()) {
                case FROM_CLIENT:
                case FROM_POOL:
                case FROM_STORE:
                    message.setWaiting(true);
                    break;
                case CACHED:
                    message.setReadable(true);
                    message.setRemovable(true);
                    break;
                case BROKEN:
                    message.setBroken(true);
                    message.setRemovable(true);
                    break;
                case PRECIOUS:
                    message.setReadable(true);
                    message.setPrecious(true);
                    break;
                default:
                    break;
            }
            Collection<StickyRecord> records = entry.getStickyRecords();
            for (StickyRecord record : records) {
                if (record.owner().equals(SYSTEM_OWNER) && record.isNonExpiring()) {
                    message.setSystemSticky(true);
                    break;
                }
            }
            reply.reply(message);
        } catch (FileNotInCacheException e) {
            reply.reply(message);
        } catch (Exception e) {
            reply.fail(message, e);
        }
    });
    return reply;
}
Also used : StickyRecord(org.dcache.pool.repository.StickyRecord) ChangePreciousBitMessage(org.dcache.vehicles.qos.ChangePreciousBitMessage) Message(diskCacheV111.vehicles.Message) ChangeStickyBitMessage(org.dcache.vehicles.qos.ChangeStickyBitMessage) ReplicaStatusMessage(org.dcache.vehicles.qos.ReplicaStatusMessage) MessageReply(org.dcache.cells.MessageReply) PnfsId(diskCacheV111.util.PnfsId) CacheEntry(org.dcache.pool.repository.CacheEntry) FileNotInCacheException(diskCacheV111.util.FileNotInCacheException) FileNotInCacheException(diskCacheV111.util.FileNotInCacheException)

Example 2 with CacheEntry

use of org.dcache.pool.repository.CacheEntry in project dcache by dCache.

the class Job method schedule.

/**
 * Schedules jobs, depending on the current state and available resources.
 * <p>
 * Closely coupled to the <code>setState</code> method.
 *
 * @see setState
 */
@GuardedBy("_lock")
private void schedule() {
    if (_state == State.CANCELLING && _running.isEmpty()) {
        setState(State.CANCELLED);
    } else if (_state != State.INITIALIZING && _state != State.NEW && !_definition.isPermanent && _queued.isEmpty() && _running.isEmpty()) {
        setState(State.FINISHED);
    } else if (_state == State.STOPPING && _running.isEmpty()) {
        setState(State.FINISHED);
    } else if (_state == State.RUNNING && (!_definition.sourceList.isValid() || !_definition.poolList.isValid())) {
        setState(State.SLEEPING);
    } else if (_state == State.RUNNING) {
        Iterator<PnfsId> i = _queued.iterator();
        while ((_running.size() < _concurrency) && i.hasNext()) {
            Expression stopWhen = _definition.stopWhen;
            if (stopWhen != null && evaluateLifetimePredicate(stopWhen)) {
                stop();
                break;
            }
            Expression pauseWhen = _definition.pauseWhen;
            if (pauseWhen != null && evaluateLifetimePredicate(pauseWhen)) {
                pause();
                break;
            }
            PnfsId pnfsId = i.next();
            if (!_context.lock(pnfsId)) {
                addError(new Error(0, pnfsId, "File is locked"));
                continue;
            }
            try {
                i.remove();
                Repository repository = _context.getRepository();
                CacheEntry entry = repository.getEntry(pnfsId);
                Task task = new Task(_taskParameters, this, _context.getPoolName(), entry.getPnfsId(), getTargetState(entry), getTargetStickyRecords(entry), getPins(entry), entry.getFileAttributes(), entry.getLastAccessTime());
                _running.put(pnfsId, task);
                _statistics.addAttempt();
                task.run();
            } catch (FileNotInCacheException e) {
                _sizes.remove(pnfsId);
            } catch (CacheException e) {
                LOGGER.error("Migration job failed to read entry: {}", e.getMessage());
                setState(State.FAILED);
                break;
            } catch (InterruptedException e) {
                LOGGER.error("Migration job was interrupted: {}", e.getMessage());
                setState(State.FAILED);
                break;
            } finally {
                if (!_running.containsKey(pnfsId)) {
                    _context.unlock(pnfsId);
                }
            }
        }
        if (_running.isEmpty()) {
            if (!_definition.isPermanent && _queued.isEmpty()) {
                setState(State.FINISHED);
            } else {
                setState(State.SLEEPING);
            }
        }
    }
}
Also used : Repository(org.dcache.pool.repository.Repository) FireAndForgetTask(org.dcache.util.FireAndForgetTask) Expression(org.dcache.util.expression.Expression) CacheException(diskCacheV111.util.CacheException) FileNotInCacheException(diskCacheV111.util.FileNotInCacheException) PnfsId(diskCacheV111.util.PnfsId) CacheEntry(org.dcache.pool.repository.CacheEntry) FileNotInCacheException(diskCacheV111.util.FileNotInCacheException) GuardedBy(javax.annotation.concurrent.GuardedBy)

Example 3 with CacheEntry

use of org.dcache.pool.repository.CacheEntry in project dcache by dCache.

the class Job method entryChanged.

private void entryChanged(EntryChangeEvent event) {
    PnfsId pnfsId = event.getPnfsId();
    CacheEntry entry = event.getNewEntry();
    if (!accept(entry)) {
        _lock.lock();
        try {
            if (!_running.containsKey(pnfsId)) {
                String type = event instanceof StickyChangeEvent ? "sticky" : "atime";
                remove(pnfsId, type + " changed, so file no longer matches criteria");
            }
        } finally {
            _lock.unlock();
        }
    } else if (_definition.isPermanent && !accept(event.getOldEntry())) {
        _lock.lock();
        try {
            add(entry);
        } finally {
            _lock.unlock();
        }
    }
}
Also used : PnfsId(diskCacheV111.util.PnfsId) StickyChangeEvent(org.dcache.pool.repository.StickyChangeEvent) CacheEntry(org.dcache.pool.repository.CacheEntry)

Example 4 with CacheEntry

use of org.dcache.pool.repository.CacheEntry in project dcache by dCache.

the class ResilienceMessageHandler method messageArrived.

/**
 * <p>Returns whether replica exists, the status of its system sticky flag
 * and whether its state allows for reading and removal.</p>
 */
public Reply messageArrived(ReplicaStatusMessage message) {
    MessageReply<Message> reply = new MessageReply<>();
    executor.execute(() -> {
        PnfsId pnfsId = message.getPnfsId();
        if (pnfsId == null) {
            reply.fail(message, new IllegalArgumentException("no pnfsid"));
            return;
        }
        try {
            CacheEntry entry = repository.getEntry(pnfsId);
            message.setExists(true);
            switch(entry.getState()) {
                case FROM_CLIENT:
                case FROM_POOL:
                case FROM_STORE:
                    message.setWaiting(true);
                    break;
                case CACHED:
                    message.setReadable(true);
                    message.setRemovable(true);
                    break;
                case BROKEN:
                    message.setBroken(true);
                    message.setRemovable(true);
                    break;
                case PRECIOUS:
                    message.setReadable(true);
                    break;
                default:
                    break;
            }
            Collection<StickyRecord> records = entry.getStickyRecords();
            for (StickyRecord record : records) {
                if (record.owner().equals(SYSTEM_OWNER) && record.isNonExpiring()) {
                    message.setSystemSticky(true);
                    break;
                }
            }
            reply.reply(message);
        } catch (FileNotInCacheException e) {
            reply.reply(message);
        } catch (Exception e) {
            reply.fail(message, e);
        }
    });
    return reply;
}
Also used : StickyRecord(org.dcache.pool.repository.StickyRecord) RemoveReplicaMessage(org.dcache.vehicles.resilience.RemoveReplicaMessage) ReplicaStatusMessage(org.dcache.vehicles.resilience.ReplicaStatusMessage) Message(diskCacheV111.vehicles.Message) ForceSystemStickyBitMessage(org.dcache.vehicles.resilience.ForceSystemStickyBitMessage) MessageReply(org.dcache.cells.MessageReply) PnfsId(diskCacheV111.util.PnfsId) CacheEntry(org.dcache.pool.repository.CacheEntry) FileNotInCacheException(diskCacheV111.util.FileNotInCacheException) FileNotInCacheException(diskCacheV111.util.FileNotInCacheException)

Example 5 with CacheEntry

use of org.dcache.pool.repository.CacheEntry in project dcache by dCache.

the class NoCachedFilesSpaceSweeper method stateChanged.

@Override
public void stateChanged(StateChangeEvent event) {
    try {
        if (event.getNewState() == ReplicaState.CACHED) {
            PnfsId id = event.getPnfsId();
            CacheEntry entry = event.getNewEntry();
            if (!entry.isSticky()) {
                _repository.setState(id, ReplicaState.REMOVED, "Replica is now cache-only on pool with no-cache policy");
                LOGGER.debug(entry.getPnfsId() + " removed: {}", event.getWhy());
            }
        }
    } catch (InterruptedException | CacheException e) {
        LOGGER.warn("Failed to remove entry from repository ({}): {}", event.getWhy(), e.getMessage());
    }
}
Also used : CacheException(diskCacheV111.util.CacheException) PnfsId(diskCacheV111.util.PnfsId) CacheEntry(org.dcache.pool.repository.CacheEntry)

Aggregations

CacheEntry (org.dcache.pool.repository.CacheEntry)13 PnfsId (diskCacheV111.util.PnfsId)8 CacheException (diskCacheV111.util.CacheException)7 FileNotInCacheException (diskCacheV111.util.FileNotInCacheException)7 Repository (org.dcache.pool.repository.Repository)3 StickyRecord (org.dcache.pool.repository.StickyRecord)3 Message (diskCacheV111.vehicles.Message)2 MessageReply (org.dcache.cells.MessageReply)2 IllegalTransitionException (org.dcache.pool.repository.IllegalTransitionException)2 CacheRepositoryEntryInfo (diskCacheV111.repository.CacheRepositoryEntryInfo)1 ArrayList (java.util.ArrayList)1 GuardedBy (javax.annotation.concurrent.GuardedBy)1 StickyChangeEvent (org.dcache.pool.repository.StickyChangeEvent)1 FireAndForgetTask (org.dcache.util.FireAndForgetTask)1 Expression (org.dcache.util.expression.Expression)1 ChangePreciousBitMessage (org.dcache.vehicles.qos.ChangePreciousBitMessage)1 ChangeStickyBitMessage (org.dcache.vehicles.qos.ChangeStickyBitMessage)1 ReplicaStatusMessage (org.dcache.vehicles.qos.ReplicaStatusMessage)1 ForceSystemStickyBitMessage (org.dcache.vehicles.resilience.ForceSystemStickyBitMessage)1 RemoveReplicaMessage (org.dcache.vehicles.resilience.RemoveReplicaMessage)1