protected void performWork() throws InterruptedException, ExecutionFailureException {
        try {
            if (articleBucket == null)
                articleBucket = new S3Bucket(S3Bucket.getConfig().getValue(Article.VAR_S3_BUCKET));
            if (siteBucket == null)
                siteBucket = new S3Bucket(S3Bucket.getConfig().getValue(Site.VAR_S3_BUCKET));
            if (logsBucket == null)
                logsBucket = new S3Bucket(S3Bucket.getConfig().getValue(LogFileSummary.VAR_LOG_S3_BUCKET));
            if (logsStatBucket == null)
                logsStatBucket = new S3Bucket(S3Bucket.getConfig().getValue(LogFileSummary.VAR_S3_BUCKET));
        } catch (Exception e) {
            String message = "FAIL. " + LogsAnalyzer.class.getSimpleName() + ". Initialization failure";
            log.error(message, e);
            throw new ExecutionFailureException(message, e);
        }

        try {
            final List<LogFileSummary> stats = new ArrayList<>();
            logsBucket.listObjectSummaries(new S3Bucket.ListFunc<S3ObjectSummary>() {
                public void process(S3ObjectSummary summary) throws IOException {
                    List<LogCacheLine> logEntries = new ObjectMapper().readValue(logsBucket.getS3().getObject(logsBucket.getName(), summary.getKey()).getObjectContent(), new TypeReference<List<LogCacheLine>>() {
                    });
                    LogFileSummary stat = analyzeLog(logEntries);
                    stats.add(stat);
                    String key = summary.getKey().replace(".json", "-stat.json");
                    try {
                        logsStatBucket.saveObject(key, stat);
                        log.info("SUCCESS. " + LogsAnalyzer.class.getSimpleName() + ". LOG STAT ADDED TO S3 " + key);
                    } catch (IOException e) {
                        log.info("FAIL. " + LogsAnalyzer.class.getSimpleName() + ". LOG STAT FAILED. Can't put new stat to S3");
                    }
                }
            });

            LogFileSummary summary = calcStat(stats);
            String key = LogsAnalyzer.class.getSimpleName() + "-" + System.currentTimeMillis() + ".json";
            logsStatBucket.saveObject(key, summary);
            log.info("SUCCESS. " + LogsAnalyzer.class.getSimpleName() + ". LOG STAT FINISHED");
        } catch (Exception e) {
            String message = "FAIL. " + LogsAnalyzer.class.getSimpleName() + ". LOG STAT FAILED. Can't put new stat to S3";
            log.error(message, e);
            throw new ExecutionFailureException(message, e);
        }

    }