Transmission: [peningkatan] Lebih pintar saat memindahkan file

Dibuat pada 14 Jul 2019  ·  8Komentar  ·  Sumber: transmission/transmission

Untuk Windows, tr_sys_path_rename dapat menggunakan flag MOVEFILE_COPY_ALLOWED daripada loop "read&copy" bawaan dari util.c:tr_moveFile

Kemudian versi Linux dapat menggunakan copy_file_range lebih modern daripada mengulang masing-masing.

mungkin seperti ini:

size_t tr_sys_file_copy(tr_sys_file_t infile, tr_sys_file_t outfile, size_t len, tr_error** error )
{
        TR_ASSERT(outfile != NULL);
        TR_ASSERT(infile != NULL);
        bool ret = false;
        unsigned int flags = 0;
        size_t res;

        res = copy_file_range(infile, NULL, outfile, NULL, &len, flags);
        if (res) {
                return res;
        }      
        else {
                set_system_error(error, errno);  
                return res;
        }
}

Dan mungkin sebuah:

tr_sys_file_copy_fallback(tr_sys_file_t infile, tr_sys_file_t outfile, size_t len,  tr_error** error ) {
    TR_ASSERT(outfile != NULL);
    TR_ASSERT(infile != NULL);

    uint64_t bytesLeft = len;
    size_t const buflen = 1024 * 128; /* 128 KiB buffer */
    tr_sys_path_info info;
    while (bytesLeft > 0)
    {
        uint64_t const bytesThisPass = MIN(bytesLeft, buflen);
        uint64_t numRead;
        uint64_t bytesWritten;

        if (!tr_sys_file_read(infile, buf, bytesThisPass, &numRead, error))
        {
            break;
        }

        if (!tr_sys_file_write(outfile, buf, numRead, &bytesWritten, error))
        {
            break;
        }

        TR_ASSERT(numRead == bytesWritten);
        TR_ASSERT(bytesWritten <= bytesLeft);
        bytesLeft -= bytesWritten;
    }
    return bytesLeft;
}
core enhancement pr welcome

Komentar yang paling membantu

+1 untuk membuat pemindahan data tidak sinkron. Memindahkan torrent besar di antara sistem file akan mengunci seluruh aplikasi .

Semua 8 komentar

Kemudian versi Linux dapat menggunakan copy_file_range yang lebih modern daripada mengulang masing-masing.

Ini tidak dapat dilakukan hanya dengan satu panggilan (atau dalam loop sederhana):

       If  file_in  is  a  sparse  file, then copy_file_range() may expand any
       holes existing in the requested range.  Users may benefit from  calling
       copy_file_range()  in  a  loop,  and  using  the lseek(2) SEEK_DATA and
       SEEK_HOLE operations to find the locations of data segments.

(man copy_file_range)

Idealnya kita harus memastikan dengan benar mengunci dan menggunakan sendfile() di utas terpisah.

Itu hampir sama dengan kode "pindahkan file" saat ini ketika
rename gagal. Itu juga tidak menyimpan bagian yang jarang, jadi saya tidak
anggap itu masalah saat menggantinya.

Pada Minggu, 14 Juli 2019 pukul 22:41 andreygursky [email protected] menulis:
>

Kemudian versi Linux dapat menggunakan copy_file_range yang lebih modern daripada mengulang masing-masing.

Ini tidak dapat dilakukan hanya dengan satu panggilan (atau dalam loop sederhana):

   If  file_in  is  a  sparse  file, then copy_file_range() may expand any
   holes existing in the requested range.  Users may benefit from  calling
   copy_file_range()  in  a  loop,  and  using  the lseek(2) SEEK_DATA and
   SEEK_HOLE operations to find the locations of data segments.

(man copy_file_range)

Idealnya kita harus memastikan dengan benar mengunci dan menggunakan sendfile() di utas terpisah.


Anda menerima ini karena Anda yang menulis utas.
Balas email ini secara langsung, lihat di GitHub, atau matikan utasnya.

Itu juga tidak menyimpan bagian yang jarang, jadi saya tidak
anggap itu masalah saat menggantinya.

Dan tidak ada prealokasi untuk file normal.

Ya. Itu juga. Perilaku buruk "pindahkan file" saat ini cukup untuk menyebabkan beban yang tidak masuk akal di beberapa pengaturan. Jika memungkinkan, tampaknya solusi mundur di glibc copy_file_range juga merupakan implementasi yang lebih baik.

Saya sudah bermain-main dengan ini. Sulit untuk memperbaiki cara lintas platform: sepertinya tidak ada antarmuka POSIX untuk salinan di dalam kernel. Tapi saya pikir itu adalah casing khusus yang layak untuk setiap sistem operasi karena karena sistem file menjadi lebih efisien dalam menyalin, kami ingin mengakses fitur-fitur itu secara otomatis.

Saya memiliki implementasi dasar dan berjalan di MacOSX dan FreeBSD tetapi saya perlu menyiapkan beberapa sistem lagi untuk mengujinya.

Saya pikir pekerjaan ini ortogonal untuk membuat file bergerak tidak sinkron. Yang satu tidak boleh menghalangi yang lain. Untuk proyek sukarelawan, scope creep adalah musuh produktivitas.

Perubahan ada di sini: https://github.com/transmission/transmission/compare/master...RobCrowston :kernelcopy-wip

Secara singkat saya membuat abstraksi baru bernama tr_sys_path_copy(). (Saya menggunakan salinan alih-alih pemindahan karena ketika kami menjadikan ini sebagai operasi asinkron, mungkin perlu untuk menyimpan file asli selama beberapa periode waktu yang tidak ditentukan setelah salinan selesai untuk menutup pegangan file di utas lain.)

Sejauh ini, saya telah mengkompilasi dan menjalankan tes baru (transmission-test-copy) pada MacOS 10.15.1, Windows Server 2016, Linux 5.0 (Ubuntu 19.05), Linux 5.3 (Arch 2019-12-03), FreeBSD 12.1 (menggunakan fallback userspace), dan FreeBSD 13. Dalam setiap kasus saya memverifikasi dengan debugger bahwa kami membuat panggilan sistem yang sesuai. Sayangnya saya tidak bisa mendapatkan kode untuk membangun OpenBSD 6.5, NetBSD 8.1, atau Solaris 10 karena beberapa masalah libevent yang tidak terkait, tapi saya tidak yakin ini adalah platform yang didukung untuk transmisi lib lagi. Bagaimanapun, perubahan ini seharusnya tidak memengaruhi platform tersebut.

Masih harus dilakukan:

  • Uji pada kernel Windows yang lebih lama. Perlu mengonfigurasi lingkungan pengembang mesin virtual untuk itu.
  • Uji salinan lintas volume (karena itulah yang kami pedulikan). Tidak yakin bagaimana melakukannya sebagai tes otomatis.
  • Uji file tr_sys_path_copy() untuk file yang cukup besar (> 100 GB). Mungkin tidak dapat dilakukan sebagai tes otomatis.
  • Uji in situ alih-alih hanya menguji tr_sys_path_copy() secara terpisah.
  • Ganti salah satu server torrent bit saya dengan kode ini untuk sementara waktu, lihat bagaimana perilakunya di dunia nyata.

Umpan balik selamat datang.

+1 untuk membuat pemindahan data tidak sinkron. Memindahkan torrent besar di antara sistem file akan mengunci seluruh aplikasi .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

fad1 picture fad1  ·  6Komentar

gthreepw00d picture gthreepw00d  ·  8Komentar

Avamander picture Avamander  ·  6Komentar

legacychimera247 picture legacychimera247  ·  8Komentar

alimony picture alimony  ·  6Komentar