/* * Copyright 2015-2016 OpenCB * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.opencb.opencga.catalog.monitor.daemons; import org.opencb.commons.datastore.core.Query; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryResult; import org.opencb.opencga.catalog.managers.CatalogManager; import org.opencb.opencga.catalog.db.api.FileDBAdaptor; import org.opencb.opencga.catalog.exceptions.CatalogException; import org.opencb.opencga.catalog.models.File; import org.opencb.opencga.catalog.managers.CatalogFileUtils; import org.opencb.opencga.core.common.TimeUtils; import java.io.IOException; /** * Created by imedina on 16/06/16. */ public class FileDaemon extends MonitorParentDaemon { private int deleteDelay; private long deleteDelayMillis; private CatalogFileUtils catalogFileUtils; public FileDaemon(int period, int deleteDelay, String sessionId, CatalogManager catalogManager) { super(period, sessionId, catalogManager); this.deleteDelay = deleteDelay; this.deleteDelayMillis = (long) (deleteDelay * 24 * 60 * 60 * 1000); this.catalogFileUtils = new CatalogFileUtils(catalogManager); } @Override public void run() { while (!exit) { try { Thread.sleep(interval); } catch (InterruptedException e) { if (!exit) { e.printStackTrace(); } } logger.info("----- FILE DAEMON -----", TimeUtils.getTimeMillis()); try { checkDeletedFiles(); checkPendingRemoveFiles(); } catch (Exception e) { e.printStackTrace(); } } } private void checkDeletedFiles() throws CatalogException { QueryResult<File> files = catalogManager.searchFile( -1, new Query(FileDBAdaptor.QueryParams.STATUS_NAME.key(), File.FileStatus.TRASHED), new QueryOptions(), sessionId); long currentTimeMillis = System.currentTimeMillis(); for (File file: files.getResult()) { try { //TODO: skip if the file is a non-empty folder long deleteTimeMillis = TimeUtils.toDate(file.getStatus().getDate()).toInstant().toEpochMilli(); // long deleteDate = new ObjectMap(file.getAttributes()).getLong(file.getName().getCreationDate(), 0); if ((currentTimeMillis - deleteTimeMillis) > deleteDelayMillis) { // QueryResult<Study> studyQueryResult = // catalogManager.getStudy(catalogManager.getStudyIdByFileId(file.getId()), sessionId); // Study study = studyQueryResult.getResult().get(0); // logger.info("Deleting file {} from study {id: {}, alias: {}}", file, study.getId(), study.getAlias()); catalogFileUtils.delete(file, sessionId); } else { logger.info("Don't delete file {id: {}, path: '{}', attributes: {}}}", file.getId(), file.getPath(), file.getAttributes()); logger.info("{}s", (currentTimeMillis - deleteTimeMillis) / 1000); } } catch (Exception e) { e.printStackTrace(); } } } private void checkPendingRemoveFiles() throws CatalogException { QueryResult<File> files = catalogManager.searchFile( -1, new Query(FileDBAdaptor.QueryParams.STATUS_NAME.key(), File.FileStatus.DELETED), new QueryOptions(), sessionId); long currentTimeMillis = System.currentTimeMillis(); for (File file: files.getResult()) { try { long deleteTimeMillis = TimeUtils.toDate(file.getStatus().getDate()).toInstant().toEpochMilli(); if ((currentTimeMillis - deleteTimeMillis) > deleteDelayMillis) { if (file.getType().equals(File.Type.FILE)) { catalogManager.getFileManager().delete(Long.toString(file.getId()), null, null, sessionId); } else { System.out.println("empty block"); } } } catch (IOException e) { e.printStackTrace(); } } } }