Transmission: [κ°œμ„ ] νŒŒμΌμ„ 이동할 λ•Œ 더 λ˜‘λ˜‘ν•΄μ§‘λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 07μ›” 14일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: transmission/transmission

Windows의 경우, tr_sys_path_rename ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•  수 MOVEFILE_COPY_ALLOWED κ·Έκ²ƒμ˜λ³΄λ‹€λŠ” μžμ‹ μ˜ λ‚΄μž₯에 "읽기 및 볡사"μ—μ„œ 루프λ₯Ό util.c:tr_moveFile

그런 λ‹€μŒ Linux 버전은 각각을 λ°˜λ³΅ν•˜λŠ” λŒ€μ‹  더 ν˜„λŒ€μ μΈ copy_file_range λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λ§ˆλ„ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

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;
        }
}

그리고 μ•„λ§ˆλ„:

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

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

데이터λ₯Ό λΉ„λ™κΈ°μ‹μœΌλ‘œ μ΄λ™ν•˜λ €λ©΄ +1μž…λ‹ˆλ‹€. 파일 μ‹œμŠ€ν…œ 간에 λŒ€μš©λŸ‰ ν† λ ŒνŠΈλ₯Ό 이동 ν•˜λ©΄ 전체 μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μž κΉλ‹ˆλ‹€ .

λͺ¨λ“  8 λŒ“κΈ€

그런 λ‹€μŒ Linux 버전은 각각을 λ°˜λ³΅ν•˜λŠ” λŒ€μ‹  μ΅œμ‹  copy_file_rangeλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 ν•œ 번의 호좜둜(λ˜λŠ” κ°„λ‹¨ν•œ λ£¨ν”„μ—μ„œ) μˆ˜ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

       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.

(λ‚¨μž copy_file_range)

μ΄μƒμ μœΌλ‘œλŠ” μ μ ˆν•œ μž κΈˆμ„ 보μž₯ν•˜κ³  λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ sendfile()을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ΄λŠ” ν˜„μž¬ "파일 이동" μ½”λ“œμ™€ 거의 λ™μΌν•©λ‹ˆλ‹€.
rename μ‹€νŒ¨. ν¬μ†Œ μ„Ήμ…˜λ„ μœ μ§€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ
그것을 ꡐ체할 λ•Œ 문제λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.

2019λ…„ 7μ›” 14일 μΌμš”μΌ μ˜€ν›„ 10μ‹œ 41λΆ„ andreygursky [email protected]이 λ‹€μŒκ³Ό 같이 μΌμŠ΅λ‹ˆλ‹€.
>

그런 λ‹€μŒ Linux 버전은 각각을 λ°˜λ³΅ν•˜λŠ” λŒ€μ‹  μ΅œμ‹  copy_file_rangeλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이것은 ν•œ 번의 호좜둜(λ˜λŠ” κ°„λ‹¨ν•œ λ£¨ν”„μ—μ„œ) μˆ˜ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

   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.

(λ‚¨μž copy_file_range)

μ΄μƒμ μœΌλ‘œλŠ” μ μ ˆν•œ μž κΈˆμ„ 보μž₯ν•˜κ³  λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ sendfile()을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

β€”
μŠ€λ ˆλ“œλ₯Ό μž‘μ„±ν–ˆκΈ° λ•Œλ¬Έμ— 이 λ©”μ‹œμ§€λ₯Ό λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ±°λ‚˜ GitHubμ—μ„œ λ³΄κ±°λ‚˜ μŠ€λ ˆλ“œλ₯Ό μŒμ†Œκ±°ν•˜μ„Έμš”.

ν¬μ†Œ μ„Ήμ…˜λ„ μœ μ§€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ
그것을 ꡐ체할 λ•Œ 문제λ₯Ό κ³ λ €ν•˜μ‹­μ‹œμ˜€.

그리고 일반 νŒŒμΌμ— λŒ€ν•œ 사전 할당이 λˆ„λ½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

응. 그것도. "파일 이동"의 ν˜„μž¬ 잘λͺ»λœ λ™μž‘μ€ 일뢀 μ„€μ •μ—μ„œ ν„°λ¬΄λ‹ˆμ—†λŠ” λ‘œλ“œλ₯Ό μ•ΌκΈ°ν•˜κΈ°μ— μΆ©λΆ„ν•©λ‹ˆλ‹€. κ°€λŠ₯ν•˜λ‹€λ©΄ glibc copy_file_range의 폴백 μ†”λ£¨μ…˜λ„ 더 λ‚˜μ€ κ΅¬ν˜„μΈ 것 κ°™μŠ΅λ‹ˆλ‹€.

이거 가지고 λ†€μ•˜μ–΄. 크둜슀 ν”Œλž«νΌ λ°©μ‹μœΌλ‘œ μ˜¬λ°”λ₯Έ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것은 μ–΄λ ΅μŠ΅λ‹ˆλ‹€. 컀널 λ‚΄ 볡사λ₯Ό μœ„ν•œ POSIX μΈν„°νŽ˜μ΄μŠ€κ°€ μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 파일 μ‹œμŠ€ν…œμ΄ λ³΅μ‚¬λ³Έμ˜ νš¨μœ¨μ„±μ„ 높여감에 따라 ν•΄λ‹Ή κΈ°λŠ₯에 μžλ™μœΌλ‘œ μ•‘μ„ΈμŠ€ν•˜κΈ°λ₯Ό μ›ν•˜κΈ° λ•Œλ¬Έμ— 각 운영 μ²΄μ œμ— λŒ€ν•΄ νŠΉλ³„ν•œ λŒ€μ†Œλ¬Έμžλ₯Ό ꡬ뢄할 κ°€μΉ˜κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

MacOSX 및 FreeBSDμ—μ„œ κΈ°λ³Έ κ΅¬ν˜„μ„ μ‹€ν–‰ν•˜κ³  μžˆμ§€λ§Œ ν…ŒμŠ€νŠΈν•  μ‹œμŠ€ν…œμ„ λͺ‡ 개 더 μ„€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.

이 μž‘μ—…μ€ νŒŒμΌμ„ λΉ„λ™κΈ°μ‹μœΌλ‘œ μ΄λ™ν•˜λŠ” 것과 μ§κ΅ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. ν•œμͺ½μ΄ λ‹€λ₯Έ μͺ½μ„ λ°©ν•΄ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€. μžμ› 봉사 ν”„λ‘œμ νŠΈμ˜ 경우 λ²”μœ„ 이동은 μƒμ‚°μ„±μ˜ μ μž…λ‹ˆλ‹€.

λ³€κ²½ 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/transmission/transmission/compare/master...RobCrowston :kernelcopy-wip

κ°„λ‹¨νžˆ λ§ν•΄μ„œ tr_sys_path_copy()λΌλŠ” μƒˆλ‘œμš΄ 좔상화λ₯Ό λ§Œλ“­λ‹ˆλ‹€. (이λ₯Ό 비동기 μž‘μ—…μœΌλ‘œ λ§Œλ“€ λ•Œ λ‹€λ₯Έ μŠ€λ ˆλ“œμ˜ 파일 핸듀을 λ‹«κΈ° μœ„ν•΄ 볡사가 μ™„λ£Œλœ ν›„ λΆˆν™•μ‹€ν•œ κΈ°κ°„ λ™μ•ˆ 원본 νŒŒμΌμ„ μœ μ§€ν•΄μ•Ό ν•  μˆ˜λ„ 있기 λ•Œλ¬Έμ— 이동 λŒ€μ‹  볡사본을 μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.)

였늘 μ§€κΈˆκΉŒμ§€ MacOS 10.15.1, Windows Server 2016, Linux 5.0(Ubuntu 19.05), Linux 5.3(Arch 2019-12-03), FreeBSD 12.1μ—μ„œ μƒˆλ‘œμš΄ ν…ŒμŠ€νŠΈ(transmission-test-copy)λ₯Ό μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. (userspace fallback μ‚¬μš©), FreeBSD 13. 각각의 κ²½μš°μ— μ μ ˆν•œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ ν•˜κ³  μžˆμŒμ„ λ””λ²„κ±°λ‘œ ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. λΆˆν–‰ν•˜κ²Œλ„ κ΄€λ ¨ μ—†λŠ” λͺ‡ 가지 libevent 문제 λ•Œλ¬Έμ— OpenBSD 6.5, NetBSD 8.1 λ˜λŠ” Solaris 10μ—μ„œ λΉŒλ“œν•  μ½”λ“œλ₯Ό 얻을 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€. μ–΄λ–€ κ²½μš°μ—λ„ 이 λ³€κ²½ 사항은 ν•΄λ‹Ή ν”Œλž«νΌμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.

아직 ν•  일:

  • 이전 Windows μ»€λ„μ—μ„œ ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€. 이λ₯Ό μœ„ν•΄ 가상 λ¨Έμ‹  개발 ν™˜κ²½μ„ ꡬ성해야 ν•©λ‹ˆλ‹€.
  • λ³Όλ₯¨ κ°„ 볡사λ₯Ό ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€(μš°λ¦¬κ°€ μ€‘μš”ν•˜κ²Œ μƒκ°ν•˜λŠ” λΆ€λΆ„μ΄λ―€λ‘œ). μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ‘œ μˆ˜ν–‰ν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.
  • μƒλ‹Ήνžˆ 큰 파일(> 100GB)에 λŒ€ν•œ ν…ŒμŠ€νŠΈ 파일 tr_sys_path_copy(). μ•„λ§ˆλ„ μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ‘œ μˆ˜ν–‰λ  수 μ—†μŠ΅λ‹ˆλ‹€.
  • tr_sys_path_copy()λ₯Ό λ‹¨λ…μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜λŠ” λŒ€μ‹  ν˜„μž₯μ—μ„œ ν…ŒμŠ€νŠΈν•˜μ‹­μ‹œμ˜€.
  • μž μ‹œ λ™μ•ˆ λ‚΄ λΉ„νŠΈ ν† λ ŒνŠΈ μ„œλ²„ 쀑 ν•˜λ‚˜λ₯Ό 이 μ½”λ“œλ‘œ κ΅μ²΄ν•˜κ³  μ‹€μ œ μ„Έκ³„μ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜μ‹­μ‹œμ˜€.

ν”Όλ“œλ°± ν™˜μ˜ν•©λ‹ˆλ‹€.

데이터λ₯Ό λΉ„λ™κΈ°μ‹μœΌλ‘œ μ΄λ™ν•˜λ €λ©΄ +1μž…λ‹ˆλ‹€. 파일 μ‹œμŠ€ν…œ 간에 λŒ€μš©λŸ‰ ν† λ ŒνŠΈλ₯Ό 이동 ν•˜λ©΄ 전체 μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μž κΉλ‹ˆλ‹€ .

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰