com.bah.lucene.hdfs.BlurLockFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.bah.lucene.hdfs.BlurLockFactory.java

Source

package com.bah.lucene.hdfs;

/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.apache.lucene.store.Lock;
import org.apache.lucene.store.LockFactory;

import java.io.IOException;
import java.util.Arrays;

public class BlurLockFactory extends LockFactory {

    private static final Log LOG = LogFactory.getLog(BlurLockFactory.class);

    private final Configuration _configuration;
    private final FileSystem _fileSystem;
    private final String _baseLockKey;
    private byte[] _lockKey;
    private final Path _dir;

    public BlurLockFactory(Configuration configuration, Path dir, String host, String pid) throws IOException {
        _configuration = configuration;
        _dir = dir;
        _fileSystem = _dir.getFileSystem(_configuration);
        _baseLockKey = host + "/" + pid;
    }

    @Override
    public Lock makeLock(String lockName) {
        final Path lockPath = new Path(_dir, lockName);
        return new Lock() {
            private boolean _set;

            @Override
            public boolean obtain() throws IOException {
                if (_set) {
                    throw new IOException("Lock for [" + _baseLockKey + "] can only be set once.");
                }
                try {
                    _lockKey = (_baseLockKey + "/" + System.currentTimeMillis()).getBytes();
                    FSDataOutputStream outputStream = _fileSystem.create(lockPath, true);
                    outputStream.write(_lockKey);
                    outputStream.close();
                } finally {
                    _set = true;
                }
                return true;
            }

            @Override
            public void release() throws IOException {
                _fileSystem.delete(lockPath, false);
            }

            @Override
            public boolean isLocked() throws IOException {
                if (!_set) {
                    LOG.info("The lock has NOT been set.");
                    return false;
                }
                if (!_fileSystem.exists(lockPath)) {
                    LOG.info("The lock file has been removed.");
                    return false;
                }
                FileStatus fileStatus = _fileSystem.getFileStatus(lockPath);
                long len = fileStatus.getLen();
                if (len != _lockKey.length) {
                    LOG.info("The lock file length has changed.");
                    return false;
                }
                byte[] buf = new byte[_lockKey.length];
                FSDataInputStream inputStream = _fileSystem.open(lockPath);
                inputStream.readFully(buf);
                inputStream.close();
                if (Arrays.equals(_lockKey, buf)) {
                    return true;
                }
                LOG.info("The lock information has been changed.");
                return false;
            }
        };
    }

    @Override
    public void clearLock(String lockName) throws IOException {
        _fileSystem.delete(new Path(_dir, lockName), false);
    }
}