com.netflix.ice.basic.MapDb.java Source code

Java tutorial

Introduction

Here is the source code for com.netflix.ice.basic.MapDb.java

Source

/*
 *
 *  Copyright 2013 Netflix, Inc.
 *
 *     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 com.netflix.ice.basic;

import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import com.netflix.ice.common.AwsUtils;
import com.netflix.ice.processor.ProcessorConfig;
import com.netflix.ice.tag.Account;
import com.netflix.ice.tag.Region;
import org.apache.commons.lang.StringUtils;
import org.mapdb.DB;
import org.mapdb.DBMaker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Map;

public class MapDb {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private DB db;
    private Map<String, String> items;
    private long numItemsToCommit = 0;
    private ProcessorConfig config;
    private String dbName;

    MapDb(String name) {
        this.config = ProcessorConfig.getInstance();

        this.dbName = "db_" + name;
        File file = new File(config.localDir, dbName);
        if (!file.exists()) {
            AmazonS3Client s3Client = AwsUtils.getAmazonS3Client();
            for (S3ObjectSummary s3ObjectSummary : s3Client
                    .listObjects(config.workS3BucketName, config.workS3BucketPrefix + this.dbName)
                    .getObjectSummaries()) {
                File dbFile = new File(config.localDir,
                        s3ObjectSummary.getKey().substring(config.workS3BucketPrefix.length()));
                AwsUtils.downloadFileIfNotExist(config.workS3BucketName, config.workS3BucketPrefix, dbFile);
            }
        }
        this.db = DBMaker.newFileDB(new File(config.localDir, this.dbName)).make();
        try {
            this.items = db.createHashMap(name, false, null, null);
        } catch (IllegalArgumentException e) {
            this.items = db.getHashMap(name);
            logger.info("found " + this.items.size() + " items from mapdb for " + name);
        }
    }

    String getResource(Account account, Region region, String resourceId) {
        return this.items.get(resourceId + "|" + account + "|" + region);
    }

    void SetResource(Account account, Region region, String resourceId, String resource, long millisStart) {
        if (StringUtils.isEmpty(resource))
            return;

        String key = resourceId + "|" + account + "|" + region;
        String resourceInDb = this.items.get(key);

        if (resourceInDb == null) {
            this.items.put(key, resource);

            numItemsToCommit++;
            if (numItemsToCommit >= 1000) {
                this.commit();
                numItemsToCommit = 0;
            }
        } else if (!resourceInDb.equals(resource)) {
            logger.error("different resources " + resourceInDb + " " + resource + " for " + resourceId);
            this.items.put(key, resource);
            resourceInDb = resource;

            numItemsToCommit++;
            if (numItemsToCommit >= 1000) {
                this.commit();
                numItemsToCommit = 0;
            }
        }
    }

    void commit() {
        this.db.commit();
        upload();
        logger.info("committed " + this.items.size() + ".");
    }

    void upload() {
        AmazonS3Client s3Client = AwsUtils.getAmazonS3Client();

        File dir = new File(config.localDir);
        File[] files = dir.listFiles(new FilenameFilter() {
            public boolean accept(File file, String fileName) {
                return fileName.startsWith(dbName);
            }
        });
        for (File file : files)
            s3Client.putObject(config.workS3BucketName, config.workS3BucketPrefix + file.getName(), file);

        for (File file : files)
            s3Client.putObject(config.workS3BucketName, config.workS3BucketPrefix + "copy" + file.getName(), file);
    }

}