@Transactional
  protected PinTask createTask(
      PinManagerPinMessage message, MessageReply<PinManagerPinMessage> reply) {
    PnfsId pnfsId = message.getFileAttributes().getPnfsId();

    if (message.getRequestId() != null) {
      Pin pin = _dao.getPin(pnfsId, message.getRequestId());
      if (pin != null) {
        /* In this case the request is a resubmission. If the
         * previous pin completed then use it. Otherwise abort the
         * previous pin and create a new one.
         */
        if (pin.getState() == PINNED) {
          message.setPin(pin);
          reply.reply(message);
          return null;
        }

        pin.setState(UNPINNING);
        pin.setRequestId(null);
        _dao.storePin(pin);
      }
    }

    Pin pin = new Pin(message.getSubject(), pnfsId);
    pin.setRequestId(message.getRequestId());
    pin.setSticky("PinManager-" + UUID.randomUUID().toString());
    pin.setExpirationTime(getExpirationTimeForPoolSelection());

    return new PinTask(message, reply, _dao.storePin(pin));
  }
 @Transactional
 protected void clearPin(PinTask task) {
   if (task.getPool() != null) {
     /* If the pin record expired or the pin was explicitly
      * unpinned, then the unpin processor may already have
      * submitted a request to the pool to clear the sticky
      * flag. Although out of order delivery of messages is
      * unlikely, if it would happen then we have a race
      * between the set sticky and clear sticky messages. To
      * cover this case we delete the old record and create a
      * fresh one in UNPINNING.
      */
     _dao.deletePin(task.getPin());
     Pin pin = new Pin(task.getSubject(), task.getPnfsId());
     pin.setState(UNPINNING);
     _dao.storePin(pin);
   } else {
     /* We didn't create a sticky flag yet, so there is no
      * reason to keep the record. It will expire by itself,
      * but we delete the record now to avoid that we get
      * tickets from admins wondering why they have records
      * staying in PINNING.
      */
     _dao.deletePin(task.getPin());
   }
 }
 @Transactional(isolation = REPEATABLE_READ)
 protected void setToPinned(PinTask task) throws CacheException {
   Pin pin = loadPinBelongingTo(task);
   pin.setExpirationTime(task.getExpirationTime());
   pin.setState(PINNED);
   task.setPin(_dao.storePin(pin));
 }
 @Transactional(isolation = REPEATABLE_READ)
 protected void setPool(PinTask task, String pool) throws CacheException {
   Pin pin = loadPinBelongingTo(task);
   pin.setExpirationTime(getExpirationTimeForSettingFlag());
   pin.setPool(pool);
   task.setPin(_dao.storePin(pin));
 }
 @Transactional(isolation = REPEATABLE_READ)
 protected void refreshTimeout(PinTask task, Date date) throws CacheException {
   Pin pin = loadPinBelongingTo(task);
   pin.setExpirationTime(date);
   task.setPin(_dao.storePin(pin));
 }