Saya tahu bahwa setiap file yang diunggah sebagai lampiran di Corda mendapatkan hash unik yang dihasilkan dan file-file ini akan dikonversi ke format zip/jar karena ini adalah jenis yang didukung Corda untuk menyimpannya sebagai lampiran. Saya telah menemukan skenario di mana saya telah mengunggah file yang sama dua kali pada node yang sama dengan jeda waktu dan ini menghasilkan dua hash lampiran yang dapat dimengerti karena saya mengompresi file ini sebagai Zip terlebih dahulu dan kemudian mengunggah. Tetapi ketika saya mencoba mengunggah file yang sama dua kali secara bersamaan maka ada DuplicateAttachmentException ini. Saya mencoba men-debug dan apa yang saya temukan adalah bahwa, saat kami melakukan zip file, mereka memiliki waktu yang sama karena menurut Corda, zip ini sama. Jika saya menunda proses zip untuk beberapa file sekitar 1 detik, pengecualian ini tidak terjadi. Apakah ada solusi untuk ini?

private fun uploader(inputStream: InputStream, fileName: String, uploader: String): AttachmentId {

        val zipName = "$fileName.zip"

        FileOutputStream(zipName).use { fileOutputStream ->
            ZipOutputStream(fileOutputStream).use { zipOutputStream ->
                val zipEntry = ZipEntry(fileName)
                zipOutputStream.putNextEntry(zipEntry)
                inputStream.copyTo(zipOutputStream, 1024)
            }
        }
        return FileInputStream(zipName).use { fileInputStream ->
            val hash = proxy.uploadAttachmentWithMetadata(
                    jar = fileInputStream,
                    uploader = uploader,
                    filename = fileName
            )
            Files.deleteIfExists(Paths.get(zipName))
            hash
        }

    }

Ini adalah kode yang saya gunakan untuk menghasilkan masalah.

0
Sandeep Yadav 19 November 2020, 10:48

1 menjawab

Jawaban Terbaik

Saya tidak berpikir ini adalah pengecualian yang dapat Anda hindari. Jika hashnya sama maka Corda kemungkinan akan membuangnya.

Saya akan sangat ingin tahu apa kasus penggunaan di mana Anda perlu mengunggah lampiran yang sama lebih dari sekali, saya kira Anda akan lebih mudah menghindari masalah itu dalam desain Anda daripada membuat solusi untuk corda.

Saya kira Anda juga dapat sedikit memodifikasi file saat masuk untuk memastikan mereka sedikit berbeda saat diunggah.

Anda dapat menemukan kode aktual itu sendiri di dalam corda yang memeriksa lampiran duplikat di sini: https://github.com/corda/corda/blob/82a114a329fee1a249f9c0786d5c2f8593759863/node/src/main/kotlin/net/corda/node/ ketekunan/NodeAttachmentService.kt#L435

0
davidawad 4 Januari 2021, 21:04