package org.corfudb.protocols.logprotocol; import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.corfudb.protocols.wireprotocol.ILogData; import org.corfudb.runtime.CorfuRuntime; import org.corfudb.util.serializer.Serializers; import java.util.ArrayList; import java.util.List; import java.util.UUID; /** * This class captures a list of updates. * Its primary use case is to alow a single log entry to * hold a sequence of updates made by a transaction, which are applied atomically. */ @ToString @Slf4j public class MultiSMREntry extends LogEntry implements ISMRConsumable { @Getter List<SMREntry> updates = new ArrayList<>(); public MultiSMREntry() { this.type = LogEntryType.MULTISMR; } public MultiSMREntry(List<SMREntry> updates) { this.type = LogEntryType.MULTISMR; this.updates = updates; } public void addTo(SMREntry entry) { getUpdates().add(entry); } public void mergeInto(MultiSMREntry other) { getUpdates().addAll(other.getUpdates()); } /** * This function provides the remaining buffer. * * @param b The remaining buffer. */ @Override void deserializeBuffer(ByteBuf b, CorfuRuntime rt) { super.deserializeBuffer(b, rt); short numUpdates = b.readShort(); updates = new ArrayList<>(); for (short i = 0; i < numUpdates; i++) { updates.add( (SMREntry) Serializers.CORFU.deserialize(b, rt)); } } @Override public void serialize(ByteBuf b) { super.serialize(b); b.writeShort(updates.size()); updates.stream() .forEach(x -> Serializers.CORFU.serialize(x, b)); } @Override public void setEntry(ILogData entry) { super.setEntry(entry); this.getUpdates().forEach(x -> x.setEntry(entry)); } @Override public List<SMREntry> getSMRUpdates(UUID id) { return updates; } }