void SetupOtherInputs(Compaction c) {
		int level = c.level();
		InternalKey smallest = new InternalKey();
		InternalKey largest = new InternalKey();
		GetRange(c.inputs_.get(0), smallest, largest);
		// get overlaps from upper level
		current_.GetOverlappingInputs(level + 1, smallest, largest,
				c.inputs_.get(1));

		// Get entire range covered by compaction
		InternalKey all_start = new InternalKey();
		InternalKey all_limit = new InternalKey();
		// range may be larger than [smallest, largest]
		GetRange2(c.inputs_.get(0), c.inputs_.get(1), all_start, all_limit);

		// See if we can grow the number of inputs in "level" without
		// changing the number of "level+1" files we pick up.
		if (!c.inputs_.get(1).isEmpty()) {
			List<FileMetaData> expanded0 = new ArrayList<FileMetaData>();
			// get files according to expended range
			current_.GetOverlappingInputs(level, all_start, all_limit,
					expanded0);
			long inputs0_size = Version.TotalFileSize(c.inputs_.get(0));
			long inputs1_size = Version.TotalFileSize(c.inputs_.get(1));
			long expanded0_size = Version.TotalFileSize(expanded0);

			if (expanded0.size() > c.inputs_.get(0).size()
					&& inputs1_size + expanded0_size < Version.kExpandedCompactionByteSizeLimit) {
				InternalKey new_start = new InternalKey();
				InternalKey new_limit = new InternalKey();
				GetRange(expanded0, new_start, new_limit);
				List<FileMetaData> expanded1 = new ArrayList<FileMetaData>();
				current_.GetOverlappingInputs(level + 1, new_start, new_limit,
						expanded1);
				// So, we CAN grow # @ level without changing # @ level + 1
				if (expanded1.size() == c.inputs_.get(1).size()) {
					LOG.info("Expanding@" + level + " "
							+ c.inputs_.get(0).size() + " + "
							+ c.inputs_.get(1).size() + " (" + inputs0_size
							+ " + " + inputs1_size + "bytes) to "
							+ expanded0.size() + " + " + expanded1.size()
							+ " ( " + expanded0_size + "+ " + inputs1_size
							+ " bytes)\n");
					smallest = new_start;
					largest = new_limit;
					c.inputs_.set(0, expanded0);
					c.inputs_.set(1, expanded1);
					GetRange2(c.inputs_.get(0), c.inputs_.get(1), all_start,
							all_limit);
				}
			}
		}

		// Compute the set of grandparent files that overlap this compaction
		// (parent == level+1; grandparent == level+2)
		if (level + 2 < config.kNumLevels) {
			current_.GetOverlappingInputs(level + 2, all_start, all_limit,
					c.grandparents_);
		}

		LOG.debug("Compacting " + level + " '" + smallest.DebugString()
				+ "' .. '" + largest.DebugString() + "'");

		// Update the place where we will do the next compaction for this level.
		// We update this immediately instead of waiting for the VersionEdit
		// to be applied so that if the compaction fails, we will try a
		// different key range next time.
		compact_pointer_[level] = largest.Encode().toString();
		c.edit_.SetCompactPointer(level, largest);
	}