温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java中BitCaskLock的使用方法

发布时间:2021-07-20 17:46:25 来源:亿速云 阅读:156 作者:chen 栏目:大数据

本篇内容介绍了“java中BitCaskLock的使用方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

本文主要研究一下BitCaskLock

BitCaskLock

bitcask-java/src/main/java/com/trifork/bitcask/BitCaskLock.java

public class BitCaskLock {

	public static enum Stale {
		OK, NOT_STALE
	}

	public static enum Type {
		WRITE, MERGE;

		private  String type_name() {
			if (this == MERGE) return "merge";
			if (this == WRITE) return "write";
			throw new RuntimeException();
		}
	}

	private RandomAccessFile file;
	private boolean is_write_lock;
	private File filename;

	private BitCaskLock(RandomAccessFile file, File filename, boolean isWriteLock) {
		this.file = file;
		this.filename = filename;
		this.is_write_lock = isWriteLock;
	}

	public static BitCaskLock acquire(Type type, File dirname) throws IOException {
		File lock_filename = lock_filename(type, dirname);
		foo: do {
			try {
				BitCaskLock lock = lock_acquire(lock_filename, true);

				String lock_contents = Integer.toString(OS.getpid()) + " \n";
				lock.write_data(ByteString.copyFromUtf8(lock_contents));

				return lock;

			} catch (FileAlreadyExistsException e) {
				delete_stale_lock(lock_filename);
				continue foo;
			}
		} while (false);

		return null;
	}

	public void release() throws IOException {
		if (file != null) {

			if (is_write_lock) {
				file.close();
				filename.delete();
			}
		}

		file = null;
	}
	//......

}	
  • BitCaskLock的acquire方法,先通过lock_acquire获取BitCaskLock,如果出现FileAlreadyExistsException则执行delete_stale_lock;其release方法针对is_write_lock执行file.close()及filename.delete()

lock_acquire

bitcask-java/src/main/java/com/trifork/bitcask/BitCaskLock.java

	private static BitCaskLock lock_acquire(File lockFilename, boolean is_write_lock)
			throws IOException {

		if (is_write_lock) {
			if (lockFilename.createNewFile() == false) {
				// file already exists, so we fail!

				throw new FileAlreadyExistsException(lockFilename);
			}
		}

		RandomAccessFile f = new RandomAccessFile(lockFilename,
				is_write_lock ? "rws" : "r");

		return new BitCaskLock(f, lockFilename, is_write_lock);
	}
  • lock_acquire方法针对is_write_lock,执行lockFilename.createNewFile(),若为false则抛出FileAlreadyExistsException

delete_stale_lock

bitcask-java/src/main/java/com/trifork/bitcask/BitCaskLock.java

	public static Stale delete_stale_lock(Type type, File dirname) throws IOException {
		return delete_stale_lock(lock_filename(type, dirname));
	}
	
	private static Stale delete_stale_lock(File lockFilename) throws IOException {

		BitCaskLock l = null;

		try {
			l = lock_acquire(lockFilename, false);

		} catch (FileNotFoundException e) {
			return Stale.OK;
		} catch (IOException e) {
			return Stale.NOT_STALE;
		}

		try {

			int pid = l.read_lock_data_pid();

			if (OS.pid_exists(pid)) {
				return Stale.NOT_STALE;
			} else {
				lockFilename.delete();
				return Stale.OK;
			}

		} catch (IOException e) {
			return Stale.NOT_STALE;
		} finally {
			l.release();
		}

	}
  • delete_stale_lock方法先执行lock_acquire,若出现FileNotFoundException,则返回Stale.OK,若出现IOException则返回Stale.NOT_STALE;否则通过l.read_lock_data_pid()获取pid,若OS.pid_exists(pid)则返回Stale.NOT_STALE,否则执行lockFilename.delete(),返回Stale.OK;最后执行l.release()

小结

BitCaskLock的acquire方法,先通过lock_acquire获取BitCaskLock,如果出现FileAlreadyExistsException则执行delete_stale_lock;其release方法针对is_write_lock执行file.close()及filename.delete()

“java中BitCaskLock的使用方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI