jetbrains.exodus.log.replication.S3FileFactory.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xodus-multinode Show documentation
Show all versions of xodus-multinode Show documentation
Xodus is pure Java transactional schema-less embedded database
/**
* Copyright 2010 - 2020 JetBrains s.r.o.
*
* 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 jetbrains.exodus.log.replication
import jetbrains.exodus.io.FileDataReader
import jetbrains.exodus.log.Log
import jetbrains.exodus.log.LogUtil
import mu.KLogging
import software.amazon.awssdk.awscore.AwsRequestOverrideConfiguration
import software.amazon.awssdk.services.s3.S3AsyncClient
import java.nio.file.Path
class S3FileFactory(
override val s3: S3AsyncClient,
val dir: Path,
override val bucket: String,
val reader: FileDataReader,
override val requestOverrideConfig: AwsRequestOverrideConfiguration? = null
) : S3FactoryBoilerplate, FileFactory {
companion object : KLogging()
override fun fetchFile(log: Log, address: Long, startingLength: Long, expectedLength: Long, finalFile: Boolean): WriteResult {
if (checkPreconditions(log, expectedLength, startingLength)) return WriteResult.empty
log.ensureWriter().blockSetMutable.add(address, FileDataReader.FileBlock(address, reader))
val filename = LogUtil.getLogFilename(address)
logger.debug { "Fetch file at $filename" }
val file = dir.resolve(filename)
val handler = if (finalFile) {
// this is intentional, aligns last page within file
val lastPageStart = log.getHighPageAddress(expectedLength)
FileAsyncHandler(
file,
startingLength,
lastPageStart,
log.ensureWriter().allocLastPage(address + lastPageStart)
)
} else {
FileAsyncHandler(file, startingLength)
}
return getRemoteFile(expectedLength, startingLength, filename, handler).get().also {
log.ensureWriter().apply {
incHighAddress(it.written)
lastPageLength = it.lastPageLength
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy