MockMetadata(LedgerMetadata toCopy) { ensembleSize = toCopy.getEnsembleSize(); writeQuorumSize = toCopy.getWriteQuorumSize(); ackQuorumSize = toCopy.getAckQuorumSize(); lastEntryId = toCopy.getLastEntryId(); length = toCopy.getLength(); digestType = toCopy.getDigestType(); ctime = toCopy.getCtime(); isClosed = toCopy.isClosed(); customMetadata = ImmutableMap.copyOf(toCopy.getCustomMetadata()); }
public static LedgerMetadataBuilder from(LedgerMetadata other) { LedgerMetadataBuilder builder = new LedgerMetadataBuilder(); builder.metadataFormatVersion = other.getMetadataFormatVersion(); builder.ensembleSize = other.getEnsembleSize(); builder.writeQuorumSize = other.getWriteQuorumSize(); builder.ackQuorumSize = other.getAckQuorumSize(); builder.state = other.getState(); if (builder.state == State.CLOSED) { builder.lastEntryId = Optional.of(other.getLastEntryId()); builder.length = Optional.of(other.getLength()); } builder.ensembles.putAll(other.getAllEnsembles()); if (other.hasPassword()) { builder.password = Optional.of(other.getPassword()); builder.digestType = Optional.of(other.getDigestType()); } builder.ctime = other.getCtime(); /** Hack to get around fact that ctime was never versioned correctly */ builder.storeCtime = LedgerMetadataUtils.shouldStoreCtime(other); builder.customMetadata = ImmutableMap.copyOf(other.getCustomMetadata()); return builder; }
private static boolean areEntriesOfSegmentStoredInTheBookie(LedgerMetadata ledgerMetadata, BookieSocketAddress bookieAddress, int segmentNo) { boolean isLedgerClosed = ledgerMetadata.isClosed(); int ensembleSize = ledgerMetadata.getEnsembleSize(); int writeQuorumSize = ledgerMetadata.getWriteQuorumSize(); new LinkedList<>(ledgerMetadata.getAllEnsembles().entrySet()); if (lastSegment && isLedgerClosed && (ledgerMetadata.getLastEntryId() < segments.get(segmentNo).getKey())) { return false; ledgerMetadata.getWriteQuorumSize(), ledgerMetadata.getAckQuorumSize(), ledgerMetadata.getEnsembleSize()); List<BookieSocketAddress> currentSegmentEnsemble = segments.get(segmentNo).getValue(); int thisBookieIndexInCurrentEnsemble = currentSegmentEnsemble.indexOf(bookieAddress); long firstEntryId = segments.get(segmentNo).getKey(); long lastEntryId = lastSegment ? ledgerMetadata.getLastEntryId() : segments.get(segmentNo + 1).getKey() - 1; long firstStoredEntryId = LedgerHandle.INVALID_ENTRY_ID; long firstEntryIter = firstEntryId;
if (metadata.isClosed()) { lastAddConfirmed = lastAddPushed = metadata.getLastEntryId(); length = metadata.getLength(); } else { lastAddConfirmed = lastAddPushed = INVALID_ENTRY_ID; && getLedgerMetadata().getEnsembleSize() == getLedgerMetadata().getWriteQuorumSize()) { stickyBookieIndex = clientCtx.getPlacementPolicy().getStickyReadBookieIndex(metadata, Optional.empty()); } else { metadata.getWriteQuorumSize(), metadata.getAckQuorumSize(), metadata.getEnsembleSize()); this.bookieFailureHistory = CacheBuilder.newBuilder() .expireAfterWrite(clientCtx.getConf().bookieFailureHistoryExpirationMSec, TimeUnit.MILLISECONDS)
List<BookieSocketAddress> newEnsemble = new ArrayList<>(oldEnsemble); int ensembleSize = metadata.getEnsembleSize(); int writeQ = metadata.getWriteQuorumSize(); int ackQ = metadata.getAckQuorumSize(); Map<String, byte[]> customMetadata = metadata.getCustomMetadata();
writer.append(String.valueOf(metadata.getWriteQuorumSize())).append(LINE_SPLITTER); writer.append(String.valueOf(metadata.getEnsembleSize())).append(LINE_SPLITTER); writer.append(String.valueOf(metadata.getLength())).append(LINE_SPLITTER); metadata.getAllEnsembles().entrySet()) { writer.append(String.valueOf(entry.getKey())); for (BookieSocketAddress addr : entry.getValue()) { if (metadata.getState() == State.IN_RECOVERY) { writer.append(String.valueOf(V1_IN_RECOVERY_ENTRY_ID)).append(FIELD_SPLITTER).append(V1_CLOSED_TAG); } else if (metadata.getState() == State.CLOSED) { writer.append(String.valueOf(metadata.getLastEntryId())) .append(FIELD_SPLITTER).append(V1_CLOSED_TAG); } else { checkArgument(metadata.getState() == State.OPEN, String.format("Unknown state %s for V1 serialization", metadata.getState()));
boolean setLedgerMetadata(Versioned<LedgerMetadata> expected, Versioned<LedgerMetadata> newMetadata) { synchronized (this) { // ensure that we only update the metadata if it is the object we expect it to be if (versionedMetadata == expected) { versionedMetadata = newMetadata; LedgerMetadata metadata = versionedMetadata.getValue(); if (metadata.isClosed()) { lastAddConfirmed = lastAddPushed = metadata.getLastEntryId(); length = metadata.getLength(); } return true; } else { return false; } } }
static Set<BookieSocketAddress> getBookiesInThisLedger(LedgerMetadata metadata) { Set<BookieSocketAddress> bookies = new HashSet<BookieSocketAddress>(); for (List<BookieSocketAddress> ensemble : metadata.getAllEnsembles().values()) { bookies.addAll(ensemble); } return bookies; }
synchronized (this) { LedgerMetadata metadata = getLedgerMetadata(); isClosed = metadata.isClosed(); lastEntryId = metadata.getLastEntryId();
PendingReadOp(LedgerHandle lh, ClientContext clientCtx, long startEntryId, long endEntryId, boolean isRecoveryRead) { this.seq = new ArrayList<>((int) ((endEntryId + 1) - startEntryId)); this.future = new CompletableFuture<>(); this.lh = lh; this.clientCtx = clientCtx; this.startEntryId = startEntryId; this.endEntryId = endEntryId; this.isRecoveryRead = isRecoveryRead; this.allowFailFast = false; numPendingEntries = endEntryId - startEntryId + 1; requiredBookiesMissingEntryForRecovery = getLedgerMetadata().getWriteQuorumSize() - getLedgerMetadata().getAckQuorumSize() + 1; heardFromHosts = new HashSet<>(); heardFromHostsBitSet = new BitSet(getLedgerMetadata().getEnsembleSize()); }
LedgerFragment(LedgerHandle lh, long firstEntryId, long lastKnownEntryId, Set<Integer> bookieIndexes) { this.ledgerId = lh.getId(); this.firstEntryId = firstEntryId; this.lastKnownEntryId = lastKnownEntryId; this.bookieIndexes = bookieIndexes; this.ensemble = lh.getLedgerMetadata().getEnsembleAt(firstEntryId); this.schedule = lh.getDistributionSchedule(); SortedMap<Long, ? extends List<BookieSocketAddress>> ensembles = lh .getLedgerMetadata().getAllEnsembles(); this.isLedgerClosed = lh.getLedgerMetadata().isClosed() || !ensemble.equals(ensembles.get(ensembles.lastKey())); }
if (enableDigestAutodetection && metadata.hasPassword()) { digestType = fromApiDigestType(metadata.getDigestType()); } else { digestType = suggestedDigestType; if (administrativeOpen && metadata.hasPassword()) { passwd = metadata.getPassword(); digestType = fromApiDigestType(metadata.getDigestType()); } else { passwd = this.passwd; if (metadata.hasPassword()) { if (!Arrays.equals(passwd, metadata.getPassword())) { LOG.error("Provided passwd does not match that in metadata"); openComplete(BKException.Code.UnauthorizedAccessException, null); if (suggestedDigestType != fromApiDigestType(metadata.getDigestType()) && !enableDigestAutodetection) { LOG.error("Provided digest does not match that in metadata"); openComplete(BKException.Code.DigestMatchException, null); if (metadata.isClosed()) {
if (md.isClosed()) { return false; SortedMap<Long, ? extends List<BookieSocketAddress>> ensembles = admin.getLedgerMetadata(lh).getAllEnsembles(); List<BookieSocketAddress> finalEnsemble = ensembles.get(ensembles.lastKey()); Collection<BookieSocketAddress> available = admin.getAvailableBookies();
if (skipOpenLedgers && lm.getState() == LedgerMetadata.State.OPEN) { LOG.info("Skip recovering open ledger {}.", lId); try { final boolean fenceRequired = !lm.isClosed() && containBookiesInLastEnsemble(lm, bookiesSrc); Long curEntryId = null; for (Map.Entry<Long, ? extends List<BookieSocketAddress>> entry : lh.getLedgerMetadata().getAllEnsembles().entrySet()) { if (curEntryId != null) { ledgerFragmentsRange.put(curEntryId, entry.getKey() - 1); List<BookieSocketAddress> ensemble = lh.getLedgerMetadata().getAllEnsembles().get(startEntryId);
return ThreadLocalRandom.current().nextInt() % metadata.getEnsembleSize(); } else { return (currentStickyBookieIndex.get() + 1) % metadata.getEnsembleSize();
List<BookieSocketAddress> ensemble = lh.getLedgerMetadata().getEnsembleAt(eid); for (int i = 0; i < writeSet.size(); i++) { int idx = writeSet.get(i);
SequenceReadRequest(List<BookieSocketAddress> ensemble, long lId, long eId) { super(ensemble, lId, eId); this.sentReplicas = new BitSet(lh.getLedgerMetadata().getWriteQuorumSize()); this.erroredReplicas = new BitSet(lh.getLedgerMetadata().getWriteQuorumSize()); }
ReadLastConfirmedAndEntryOp(LedgerHandle lh, ClientContext clientCtx, List<BookieSocketAddress> ensemble, LastConfirmedAndEntryCallback cb, long prevEntryId, long timeOutInMillis) { this.lh = lh; this.clientCtx = clientCtx; this.cb = cb; this.prevEntryId = prevEntryId; this.lastAddConfirmed = lh.getLastAddConfirmed(); this.timeOutInMillis = timeOutInMillis; this.numResponsesPending = 0; this.currentEnsemble = ensemble; // since long poll is effectively reading lac with waits, lac can be potentially // be advanced in different write quorums, so we need to make sure to cover enough // bookies before claiming lac is not advanced. this.numEmptyResponsesAllowed = getLedgerMetadata().getEnsembleSize() - getLedgerMetadata().getAckQuorumSize() + 1; this.requestTimeNano = MathUtils.nowInNano(); maxMissedReadsAllowed = getLedgerMetadata().getEnsembleSize() - getLedgerMetadata().getAckQuorumSize(); heardFromHostsBitSet = new BitSet(getLedgerMetadata().getEnsembleSize()); emptyResponsesFromHostsBitSet = new BitSet(getLedgerMetadata().getEnsembleSize()); }
List<BookieSocketAddress> curEnsemble = null; for (Map.Entry<Long, ? extends List<BookieSocketAddress>> e : lh .getLedgerMetadata().getAllEnsembles().entrySet()) { if (curEntryId != null) { Set<Integer> bookieIndexes = new HashSet<Integer>(); final long entryToRead = curEntryId; final EntryExistsCallback eecb = new EntryExistsCallback(lh.getLedgerMetadata().getWriteQuorumSize(), new GenericCallback<Boolean>() { public void operationComplete(int rc, Boolean result) {
@Override public long getLength() { return metadata.getLength(); }