@Override
	public Slice Get(ReadOptions options, Slice key, Status st) {
		Slice result = new Slice();
		Status s = null;
		mutex_.lock();
		SequenceNumber snapshot;
		if (options.snapshot != null) {
			snapshot = ((SnapshotImpl) (options.snapshot)).number_;

		} else {
			snapshot = versions_.LastSequence();
		}

		MemTable mem = mem_;
		MemTable imm = imm_;
		Version current = versions_.current();
		mem.Ref();
		if (imm != null) {
			imm.Ref();
		}
		current.Ref();

		boolean have_stat_update = false;
		Version.GetStats stats = new Version.GetStats();

		// Unlock while reading from files and memtables
		{
			mutex_.unlock();
			// First look in the memtable, then in the immutable memtable
			// (if
			// any).
			LookupKey lkey = new LookupKey(key, snapshot);
			if (mem.Get(lkey, result, s) != null) {
				// different as original codes

			} else if (imm != null && imm.Get(lkey, result, s) != null) {
				// Done
			} else {
				result.setData_(current.Get(options, lkey, stats,
						new Status[] { new Status() }));
				have_stat_update = true;
			}
			mutex_.lock();
		}

		if (have_stat_update && current.UpdateStats(stats)) {
			MaybeScheduleCompaction();
		}
		mem.Unref();
		if (imm != null)
			imm.Unref();
		current.Unref();

		mutex_.unlock();
		if (result.size() == 0) {
			st.Status_(Status.NotFound(
					new Slice("Value of key '" + key.toString()
							+ "' is not found."), null));
		}
		return result;

	}