All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jetbrains.exodus.log.replication.S3FileFactory.kt Maven / Gradle / Ivy

There is a newer version: 2.0.1
Show newest version
/**
 * 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