blob: fd987a252c703c77b923423a38fb30fd4f5e01aa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.cassandra.sidecar.common.data;
import java.math.BigInteger;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.cassandra.sidecar.common.utils.Preconditions;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.BUCKET_ID;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_CHECKSUM;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_COMPRESSED_SIZE;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_END_TOKEN;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_ID;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_START_TOKEN;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_STORAGE_BUCKET;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_STORAGE_KEY;
import static org.apache.cassandra.sidecar.common.data.RestoreJobConstants.SLICE_UNCOMPRESSED_SIZE;
/**
* Request payload for creating a slice.
* A slice is a blob object that contains SSTables to be imported into Cassandra.
* The data covers a sub-range in the ring.
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class CreateSliceRequestPayload
{
private final String sliceId;
private final int bucketId;
private final String bucket;
private final String key;
private final String checksum;
private final BigInteger startToken;
private final BigInteger endToken;
// -- Optional fields - using Objects
private final Long uncompressedSize;
private final Long compressedSize;
// ----
@JsonCreator
public CreateSliceRequestPayload(@JsonProperty(SLICE_ID) String sliceId,
@JsonProperty(BUCKET_ID) int bucketId,
@JsonProperty(SLICE_STORAGE_BUCKET) String bucket,
@JsonProperty(SLICE_STORAGE_KEY) String key,
@JsonProperty(SLICE_CHECKSUM) String checksum,
@JsonProperty(SLICE_START_TOKEN) BigInteger startToken,
@JsonProperty(SLICE_END_TOKEN) BigInteger endToken,
@JsonProperty(SLICE_UNCOMPRESSED_SIZE) Long uncompressedSize,
@JsonProperty(SLICE_COMPRESSED_SIZE) Long compressedSize)
{
Preconditions.checkArgument(sliceId != null
&& checksum != null
&& bucket != null
&& key != null
&& startToken != null
&& endToken != null,
"Invalid create slice request payload");
Preconditions.checkArgument(bucketId < Short.MAX_VALUE && bucketId >= 0,
"Invalid bucketId. Valid range: [0, " + Short.MAX_VALUE + "), " +
"but got " + bucketId);
this.sliceId = sliceId;
this.bucketId = bucketId;
this.bucket = bucket;
this.key = key;
this.checksum = checksum;
this.startToken = startToken;
this.endToken = endToken;
this.uncompressedSize = uncompressedSize;
this.compressedSize = compressedSize;
}
/**
* @return slice id to identify a slice uniquely.
*/
@JsonProperty(SLICE_ID)
public String sliceId()
{
return sliceId;
}
/**
* @return bucket id to identify a bucket uniquely.
*/
@JsonProperty(BUCKET_ID)
public int bucketId()
{
return bucketId;
}
public short bucketIdAsShort()
{
return (short) bucketId;
}
/**
* @return upload bucket used for slice upload
*/
@JsonProperty(SLICE_STORAGE_BUCKET)
public String bucket()
{
return bucket;
}
/**
* @return upload key used for slice upload
*/
@JsonProperty(SLICE_STORAGE_KEY)
public String key()
{
return key;
}
/**
* @return start token of slice
*/
@JsonProperty(SLICE_START_TOKEN)
public BigInteger startToken()
{
return startToken;
}
/**
* @return end token of slice
*/
@JsonProperty(SLICE_END_TOKEN)
public BigInteger endToken()
{
return endToken;
}
/**
* @return checksum of a slice
*/
@JsonProperty(SLICE_CHECKSUM)
public String checksum()
{
return checksum;
}
/**
* @return the size of all files in the slice after unzipping, or null if not defined
*/
@JsonProperty(SLICE_UNCOMPRESSED_SIZE)
public Long uncompressedSize()
{
return uncompressedSize;
}
/**
* @return the size of all files in the slice after unzipping, or 0 if not defined
*/
public long uncompressedSizeOrZero()
{
return uncompressedSize == null ? 0 : uncompressedSize;
}
/**
* @return the size of the slice, or null if not defined
*/
@JsonProperty(SLICE_COMPRESSED_SIZE)
public Long compressedSize()
{
return compressedSize;
}
/**
* @return the size of the slice, or 0 if not defined
*/
public long compressedSizeOrZero()
{
return compressedSize == null ? 0 : compressedSize;
}
/**
* {@inheritDoc}
*/
public String toString()
{
return "CreateSliceRequest{" + SLICE_ID + "='" + sliceId + "', " +
BUCKET_ID + "='" + bucketId + "', " +
SLICE_STORAGE_BUCKET + "='" + bucket + "', " +
SLICE_STORAGE_KEY + "='" + key + "', " +
SLICE_CHECKSUM + "='" + checksum + "', " +
SLICE_START_TOKEN + "='" + startToken + "', " +
SLICE_END_TOKEN + "='" + endToken + "', " +
SLICE_COMPRESSED_SIZE + "='" + compressedSize + "', " +
SLICE_UNCOMPRESSED_SIZE + "='" + uncompressedSize + "'}";
}
}