/** * Copyright 2016 Yahoo Inc. * * Licensed 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. */ package org.apache.bookkeeper.mledger; import static com.google.common.base.Preconditions.checkArgument; import java.util.Arrays; import java.util.concurrent.TimeUnit; import org.apache.bookkeeper.client.BookKeeper.DigestType; import com.google.common.annotations.Beta; import com.google.common.base.Charsets; /** * Configuration class for a ManagedLedger */ @Beta public class ManagedLedgerConfig { private int maxUnackedRangesToPersist = 1000; private int maxEntriesPerLedger = 50000; private int maxSizePerLedgerMb = 100; private int minimumRolloverTimeMs = 0; private long maximumRolloverTimeMs = TimeUnit.HOURS.toMillis(4); private int ensembleSize = 3; private int writeQuorumSize = 2; private int ackQuorumSize = 2; private int metadataEnsembleSize = 3; private int metadataWriteQuorumSize = 2; private int metadataAckQuorumSize = 2; private int metadataMaxEntriesPerLedger = 50000; private int ledgerRolloverTimeout = 4 * 3600; private double throttleMarkDelete = 0; private long retentionTimeMs = 0; private long retentionSizeInMB = 0; private DigestType digestType = DigestType.MAC; private byte[] password = "".getBytes(Charsets.UTF_8); /** * @return the maxEntriesPerLedger */ public int getMaxEntriesPerLedger() { return maxEntriesPerLedger; } /** * @param maxEntriesPerLedger * the maxEntriesPerLedger to set */ public ManagedLedgerConfig setMaxEntriesPerLedger(int maxEntriesPerLedger) { this.maxEntriesPerLedger = maxEntriesPerLedger; return this; } /** * @return the maxSizePerLedgerMb */ public int getMaxSizePerLedgerMb() { return maxSizePerLedgerMb; } /** * @param maxSizePerLedgerMb * the maxSizePerLedgerMb to set */ public ManagedLedgerConfig setMaxSizePerLedgerMb(int maxSizePerLedgerMb) { this.maxSizePerLedgerMb = maxSizePerLedgerMb; return this; } /** * @return the minimum rollover time */ public int getMinimumRolloverTimeMs() { return minimumRolloverTimeMs; } /** * Set the minimum rollover time for ledgers in this managed ledger. * * If this time is > 0, a ledger will not be rolled over more frequently than the specified time, even if it has * reached the maximum number of entries or maximum size. This parameter can be used to reduce the amount of * rollovers on managed ledger with high write throughput. * * @param minimumRolloverTime * the minimum rollover time * @param unit * the time unit */ public void setMinimumRolloverTime(int minimumRolloverTime, TimeUnit unit) { this.minimumRolloverTimeMs = (int) unit.toMillis(minimumRolloverTime); checkArgument(maximumRolloverTimeMs >= minimumRolloverTimeMs, "Minimum rollover time needs to be less than maximum rollover time"); } /** * @return the maximum rollover time */ public long getMaximumRolloverTimeMs() { return maximumRolloverTimeMs; } /** * Set the maximum rollover time for ledgers in this managed ledger. * * If the ledger is not rolled over until this time, even if it has not reached the number of entry or size limit, * this setting will trigger rollover. This parameter can be used for topics with low request rate to force * rollover, so recovery failure does not have to go far back. * * @param maximumRolloverTime * the maximum rollover time * @param unit * the time unit */ public void setMaximumRolloverTime(int maximumRolloverTime, TimeUnit unit) { this.maximumRolloverTimeMs = unit.toMillis(maximumRolloverTime); checkArgument(maximumRolloverTimeMs >= minimumRolloverTimeMs, "Maximum rollover time needs to be greater than minimum rollover time"); } /** * @return the ensembleSize */ public int getEnsembleSize() { return ensembleSize; } /** * @param ensembleSize * the ensembleSize to set */ public ManagedLedgerConfig setEnsembleSize(int ensembleSize) { this.ensembleSize = ensembleSize; return this; } /** * @return the ackQuorumSize */ public int getAckQuorumSize() { return ackQuorumSize; } /** * @return the writeQuorumSize */ public int getWriteQuorumSize() { return writeQuorumSize; } /** * @param writeQuorumSize * the writeQuorumSize to set */ public ManagedLedgerConfig setWriteQuorumSize(int writeQuorumSize) { this.writeQuorumSize = writeQuorumSize; return this; } /** * @param ackQuorumSize * the ackQuorumSize to set */ public ManagedLedgerConfig setAckQuorumSize(int ackQuorumSize) { this.ackQuorumSize = ackQuorumSize; return this; } /** * @return the digestType */ public DigestType getDigestType() { return digestType; } /** * @param digestType * the digestType to set */ public ManagedLedgerConfig setDigestType(DigestType digestType) { this.digestType = digestType; return this; } /** * @return the password */ public byte[] getPassword() { return Arrays.copyOf(password, password.length); } /** * @param password * the password to set */ public ManagedLedgerConfig setPassword(String password) { this.password = password.getBytes(Charsets.UTF_8); return this; } /** * @return the metadataEnsemblesize */ public int getMetadataEnsemblesize() { return metadataEnsembleSize; } /** * @param metadataEnsembleSize * the metadataEnsembleSize to set */ public ManagedLedgerConfig setMetadataEnsembleSize(int metadataEnsembleSize) { this.metadataEnsembleSize = metadataEnsembleSize; return this; } /** * @return the metadataAckQuorumSize */ public int getMetadataAckQuorumSize() { return metadataAckQuorumSize; } /** * @return the metadataWriteQuorumSize */ public int getMetadataWriteQuorumSize() { return metadataWriteQuorumSize; } /** * @param metadataAckQuorumSize * the metadataAckQuorumSize to set */ public ManagedLedgerConfig setMetadataAckQuorumSize(int metadataAckQuorumSize) { this.metadataAckQuorumSize = metadataAckQuorumSize; return this; } /** * @param metadataWriteQuorumSize * the metadataWriteQuorumSize to set */ public ManagedLedgerConfig setMetadataWriteQuorumSize(int metadataWriteQuorumSize) { this.metadataWriteQuorumSize = metadataWriteQuorumSize; return this; } /** * @return the metadataMaxEntriesPerLedger */ public int getMetadataMaxEntriesPerLedger() { return metadataMaxEntriesPerLedger; } /** * @param metadataMaxEntriesPerLedger * the metadataMaxEntriesPerLedger to set */ public ManagedLedgerConfig setMetadataMaxEntriesPerLedger(int metadataMaxEntriesPerLedger) { this.metadataMaxEntriesPerLedger = metadataMaxEntriesPerLedger; return this; } /** * @return the ledgerRolloverTimeout */ public int getLedgerRolloverTimeout() { return ledgerRolloverTimeout; } /** * @param ledgerRolloverTimeout * the ledgerRolloverTimeout to set */ public ManagedLedgerConfig setLedgerRolloverTimeout(int ledgerRolloverTimeout) { this.ledgerRolloverTimeout = ledgerRolloverTimeout; return this; } /** * @return the throttling rate limit for mark-delete calls */ public double getThrottleMarkDelete() { return throttleMarkDelete; } /** * Set the rate limiter on how many mark-delete calls per second are allowed. If the value is set to 0, the rate * limiter is disabled. Default is 0. * * @param throttleMarkDelete * the max number of mark-delete calls allowed per second */ public ManagedLedgerConfig setThrottleMarkDelete(double throttleMarkDelete) { checkArgument(throttleMarkDelete >= 0.0); this.throttleMarkDelete = throttleMarkDelete; return this; } /** * @param retentionTime * duration for which messages should be retained * @param unit * time unit for retention time */ public ManagedLedgerConfig setRetentionTime(int retentionTime, TimeUnit unit) { this.retentionTimeMs = unit.toMillis(retentionTime); return this; } /** * @return duration for which messages are retained * */ public long getRetentionTimeMillis() { return retentionTimeMs; } /** * @param retentionSizeInMB * quota for message retention */ public ManagedLedgerConfig setRetentionSizeInMB(long retentionSizeInMB) { this.retentionSizeInMB = retentionSizeInMB; return this; } /** * @return quota for message retention * */ public long getRetentionSizeInMB() { return retentionSizeInMB; } /** * @return max unacked message ranges that will be persisted and recovered. * */ public int getMaxUnackedRangesToPersist() { return maxUnackedRangesToPersist; } /** * @param maxUnackedRangesToPersist * max unacked message ranges that will be persisted and receverd. */ public ManagedLedgerConfig setMaxUnackedRangesToPersist(int maxUnackedRangesToPersist) { this.maxUnackedRangesToPersist = maxUnackedRangesToPersist; return this; } }