On Thu, 21 May 2026 at 15:33, Jun Omae <[email protected]> wrote:
> On 2026/05/21 21:32, Evgeny Kotkov wrote:
> > Jun Omae <[email protected]> writes:
> >
> >> It occurs only with MSVC toolset v143 (--vsnet-version=2022) and Whole
> >> Program Optimization enabled. It doesn't with v142
> (--vsnet-version=2019).
> >>
> >> svn_fs_fs__delete_revprops_shard() is built by the optimization to
> >> delete the "revprops/0" directory even if `shard` argument is 0.
> >>
> >> Workaround is to disable the optimization.
> >
> > Interesting. Could be a compiler issue or an UB somewhere in the code.
> >
> > Would you mind providing more details on your environment to make it
> easier
> > to reproduce?
>
> It is able to reproduce using cmake with toolset v143.
>
> 1. Pass -vcvars_ver=14.44 to vcvars64.bat
> 2. Pass CMAKE_INTERPROCEDURAL_OPTIMIZATION=ON to cmake configure
> (The option makes Whole Program Optimization enabled in cmake build)
>
>
I can reproduce this issue in my environment and I believe it is indeed a
compiler bug. Here is the behavior across different MSVC versions:
- MSVC 19.*40*.33821.0: No problem
- MSVC 19.*44*.35227.0: Problem occurs
- MSVC 19.*50*.35730.0: No problem
In version 19.44.35227.0 with /GL (Whole Program Optimization) enabled,
the `if (shard == 0)` branch seems to be incorrrectly **optimized away**.
I think this is caused by combination of the do-while loop and the `while
(kind == svn_node_dir && to_cleanup > 0)` condition on the calling side
(details below).
The code below from subversion/libsvn_fs_fs/pack.c:synced_pack_shard()
becomes a simple call to svn_io_remove_dir2() that recursively deletes the
revprops/0 directory:
[[[
do
{
SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
to_cleanup,
ffd->max_files_per_dir,
pb->cancel_func,
pb->cancel_baton,
pool));
/* If the previous shard exists, clean it up as well.
Don't try to clean up shard 0 as it we can't tell quickly
whether it actually needs cleaning up. */
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
pool);
SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
}
while (kind == svn_node_dir && to_cleanup > 0);
]]]
[[[
if (shard == 0)
{
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
int i;
/* delete all files except the one for revision 0 */
for (i = 1; i < max_files_per_dir; ++i)
{
const char *path;
svn_pool_clear(iterpool);
path = svn_dirent_join(shard_path,
apr_psprintf(iterpool, "%d", i),
iterpool);
if (cancel_func)
SVN_ERR(cancel_func(cancel_baton));
SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
}
svn_pool_destroy(iterpool);
}
else
SVN_ERR(svn_io_remove_dir2(shard_path, TRUE,
cancel_func, cancel_baton, scratch_pool));
]]]
I checked that replacing the do-while loop with an equivalent while {} loop
makes the problem go away. My theory is that the compiler
incorrectly assumes to_cleanup is > 0 within the loop block and optimizes
away the inner check.
I have attached several generated assembly files for comparison:
- svn-disasm-vc19.44-orig.asm - code generated by MSVC 19.44 compiler.
- svn-disasm-vc19.44-patched.asm - code where `do {} while` loop replaced
with `while() {}` equivalent generated by MSVC 19.44 compiler
- svn-disasm-vc19.50-orig.asm - code generated by MSVC 19.50 compiler.
--
Ivan Zhakov
Index: subversion/libsvn_fs_fs/pack.c
===================================================================
--- subversion/libsvn_fs_fs/pack.c (revision 1934638)
+++ subversion/libsvn_fs_fs/pack.c (working copy)
@@ -1934,7 +1934,7 @@
{
svn_node_kind_t kind = svn_node_dir;
apr_int64_t to_cleanup = pb->shard;
- do
+ while(1)
{
SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
to_cleanup,
@@ -1950,8 +1950,12 @@
apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
pool);
SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
+
+ if (!(kind == svn_node_dir && to_cleanup > 0))
+ {
+ break;
+ }
}
- while (kind == svn_node_dir && to_cleanup > 0);
}
return SVN_NO_ERROR;
static svn_error_t *
synced_pack_shard(void *baton,
apr_pool_t *pool)
{
mov qword ptr [rsp+18h],rbx
push rbp
push rsi
push rdi
push r12
push r13
push r14
push r15
sub rsp,80h
mov rax,qword ptr [__security_cookie (07FF922D8A000h)]
xor rax,rsp
mov qword ptr [rsp+70h],rax
struct pack_baton *pb = baton;
fs_fs_data_t *ffd = pb->fs->fsap_data;
const char *revprops_shard_path, *revprops_pack_file_dir;
/* if enabled, pack the revprops in an equivalent way */
if (pb->revsprops_dir)
cmp qword ptr [rcx+38h],0
mov rbp,rdx
mov rax,qword ptr [rcx]
mov r14,rcx
mov r13,qword ptr [rax+38h]
je synced_pack_shard+101h (07FF922D53741h)
{
apr_int64_t pack_size_limit = 0.9 * ffd->revprop_pack_size;
revprops_pack_file_dir = svn_dirent_join(pb->revsprops_dir,
mov rbx,qword ptr [rcx+38h]
lea rdx,[string "%I64d.pack" (07FF922D7D400h)]
mov r8,qword ptr [rcx+40h]
xorps xmm0,xmm0
cvtsi2sd xmm0,qword ptr [r13+118h]
mov rcx,rbp
mulsd xmm0,mmword ptr [__real@3feccccccccccccd (07FF922D7F6B0h)]
cvttsd2si rsi,xmm0
call qword ptr [__imp_apr_psprintf (07FF922D761D8h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922D76400h)]
apr_psprintf(pool,
"%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
pb->shard),
pool);
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
mov r8,qword ptr [r14+40h]
lea rdx,[string "%I64d" (07FF922D76D1Ch)]
mov rbx,qword ptr [r14+38h]
mov rcx,rbp
mov rdi,rax
call qword ptr [__imp_apr_psprintf (07FF922D761D8h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922D76400h)]
apr_psprintf(pool, "%" APR_INT64_T_FMT, pb->shard),
pool);
SVN_ERR(svn_fs_fs__pack_revprops_shard(revprops_pack_file_dir,
mov ecx,dword ptr [r13+120h]
mov r15,rax
mov eax,dword ptr [r13+158h]
neg ecx
mov rcx,qword ptr [r14+20h]
mov r9d,dword ptr [r13+4]
sbb edx,edx
mov r8,qword ptr [r14+40h]
and edx,5
mov qword ptr [rsp+48h],rbp
mov qword ptr [rsp+40h],rcx
mov rcx,qword ptr [r14+18h]
mov qword ptr [rsp+38h],rcx
mov rcx,rdi
mov dword ptr [rsp+30h],eax
mov dword ptr [rsp+28h],edx
mov rdx,r15
mov qword ptr [rsp+20h],rsi
call svn_fs_fs__pack_revprops_shard (07FF922D58F00h)
test rax,rax
je synced_pack_shard+106h (07FF922D53746h)
jmp synced_pack_shard+230h (07FF922D53870h)
mov r15,qword ptr [rsp+50h]
revprops_shard_path,
pb->shard,
ffd->max_files_per_dir,
pack_size_limit,
ffd->compress_packed_revprops
? SVN__COMPRESSION_ZLIB_DEFAULT
: SVN__COMPRESSION_NONE,
ffd->flush_to_disk,
pb->cancel_func,
pb->cancel_baton,
pool));
}
/* Update the min-unpacked-rev file to reflect our newly packed shard. */
SVN_ERR(svn_fs_fs__write_min_unpacked_rev(pb->fs,
mov eax,dword ptr [r14+40h]
lea rcx,[rsp+58h]
mov rdi,qword ptr [r14]
inc eax
imul eax,dword ptr [r13+4]
mov rsi,qword ptr [rdi+38h]
movsxd rdx,eax
call qword ptr [__imp_svn__i64toa (07FF922D76490h)]
mov rcx,qword ptr [rdi+8]
lea rdx,[string "min-unpacked-rev" (07FF922D7BC60h)]
mov r8,rbp
mov rbx,rax
mov byte ptr [rsp+rax+58h],0Ah
call qword ptr [__imp_svn_dirent_join (07FF922D76400h)]
mov ecx,dword ptr [rsi+158h]
lea r8,[rbx+1]
mov qword ptr [rsp+28h],rbp
lea rdx,[rsp+58h]
mov dword ptr [rsp+20h],ecx
mov r9,rax
mov rcx,rax
call qword ptr [__imp_svn_io_write_atomic2 (07FF922D76368h)]
test rax,rax
jne synced_pack_shard+230h (07FF922D53870h)
(svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir),
pool));
ffd->min_unpacked_rev
= (svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir);
/* Finally, remove the existing shard directories.
* For revprops, clean up older obsolete shards as well as they might
* have been left over from an interrupted FS upgrade. */
SVN_ERR(svn_io_remove_dir2(pb->rev_shard_path, TRUE,
mov eax,dword ptr [r14+40h]
mov edx,1
inc eax
mov qword ptr [rsp+20h],rbp
imul eax,dword ptr [r13+4]
mov dword ptr [r13+10Ch],eax
mov r9,qword ptr [r14+20h]
mov r8,qword ptr [r14+18h]
mov rcx,qword ptr [r14+48h]
call qword ptr [__imp_svn_io_remove_dir2 (07FF922D769E8h)]
test rax,rax
jne synced_pack_shard+230h (07FF922D53870h)
pb->cancel_func, pb->cancel_baton, pool));
if (pb->revsprops_dir)
cmp qword ptr [r14+38h],rax
je synced_pack_shard+22Eh (07FF922D5386Eh)
{
svn_node_kind_t kind = svn_node_dir;
apr_int64_t to_cleanup = pb->shard;
mov rdi,qword ptr [r14+40h]
mov dword ptr [rsp+50h],2
nop dword ptr [rax]
do
{
SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
mov r9,qword ptr [r14+20h]
mov edx,1
mov r8,qword ptr [r14+18h]
mov rcx,r15
mov qword ptr [rsp+20h],rbp
call qword ptr [__imp_svn_io_remove_dir2 (07FF922D769E8h)]
test rax,rax
jne synced_pack_shard+230h (07FF922D53870h)
to_cleanup,
ffd->max_files_per_dir,
pb->cancel_func,
pb->cancel_baton,
pool));
/* If the previous shard exists, clean it up as well.
Don't try to clean up shard 0 as it we can't tell quickly
whether it actually needs cleaning up. */
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
mov rbx,qword ptr [r14+38h]
lea rdx,[string "%I64d" (07FF922D76D1Ch)]
dec rdi
mov rcx,rbp
mov r8,rdi
call qword ptr [__imp_apr_psprintf (07FF922D761D8h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922D76400h)]
apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
pool);
SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
mov r8,rbp
lea rdx,[kind]
mov rcx,rax
mov r15,rax
call qword ptr [__imp_svn_io_check_path (07FF922D76360h)]
test rax,rax
jne synced_pack_shard+230h (07FF922D53870h)
}
while (kind == svn_node_dir && to_cleanup > 0);
cmp dword ptr [kind],2
jne synced_pack_shard+22Eh (07FF922D5386Eh)
test rdi,rdi
jg synced_pack_shard+1C0h (07FF922D53800h)
}
return SVN_NO_ERROR;
xor eax,eax
}
mov rcx,qword ptr [rsp+70h]
xor rcx,rsp
call __security_check_cookie (07FF922D746D0h)
mov rbx,qword ptr [rsp+0D0h]
add rsp,80h
pop r15
pop r14
pop r13
pop r12
pop rdi
pop rsi
pop rbp
ret static svn_error_t *
synced_pack_shard(void *baton,
apr_pool_t *pool)
{
mov qword ptr [rsp+18h],rbx
push rbp
push rsi
push rdi
push r12
push r13
push r14
push r15
sub rsp,90h
mov rax,qword ptr [__security_cookie (07FF922B2A000h)]
xor rax,rsp
mov qword ptr [rsp+88h],rax
struct pack_baton *pb = baton;
fs_fs_data_t *ffd = pb->fs->fsap_data;
const char *revprops_shard_path, *revprops_pack_file_dir;
/* if enabled, pack the revprops in an equivalent way */
if (pb->revsprops_dir)
cmp qword ptr [rcx+38h],0
mov rbp,rdx
mov rax,qword ptr [rcx]
mov r13,rcx
mov qword ptr [rsp+60h],rdx
mov r15,qword ptr [rax+38h]
mov qword ptr [rsp+68h],r15
je synced_pack_shard+10Eh (07FF922AF374Eh)
{
apr_int64_t pack_size_limit = 0.9 * ffd->revprop_pack_size;
revprops_pack_file_dir = svn_dirent_join(pb->revsprops_dir,
mov rbx,qword ptr [rcx+38h]
lea rdx,[string "%I64d.pack" (07FF922B1D400h)]
mov r8,qword ptr [rcx+40h]
xorps xmm0,xmm0
cvtsi2sd xmm0,qword ptr [r15+118h]
mov rcx,rbp
mulsd xmm0,mmword ptr [__real@3feccccccccccccd (07FF922B1F6B0h)]
cvttsd2si rsi,xmm0
call qword ptr [__imp_apr_psprintf (07FF922B161D8h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922B16400h)]
apr_psprintf(pool,
"%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
pb->shard),
pool);
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
mov r8,qword ptr [r13+40h]
lea rdx,[string "%I64d" (07FF922B16D1Ch)]
mov rbx,qword ptr [r13+38h]
mov rcx,rbp
mov rdi,rax
call qword ptr [__imp_apr_psprintf (07FF922B161D8h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922B16400h)]
apr_psprintf(pool, "%" APR_INT64_T_FMT, pb->shard),
pool);
SVN_ERR(svn_fs_fs__pack_revprops_shard(revprops_pack_file_dir,
mov ecx,dword ptr [r15+120h]
mov r12,rax
mov eax,dword ptr [r15+158h]
neg ecx
mov rcx,qword ptr [r13+20h]
mov r9d,dword ptr [r15+4]
sbb edx,edx
mov r8,qword ptr [r13+40h]
and edx,5
mov qword ptr [rsp+48h],rbp
mov qword ptr [rsp+40h],rcx
mov rcx,qword ptr [r13+18h]
mov qword ptr [rsp+38h],rcx
mov rcx,rdi
mov dword ptr [rsp+30h],eax
mov dword ptr [rsp+28h],edx
mov rdx,r12
mov qword ptr [rsp+20h],rsi
call svn_fs_fs__pack_revprops_shard (07FF922AF8FC0h)
test rax,rax
je synced_pack_shard+113h (07FF922AF3753h)
jmp synced_pack_shard+2F0h (07FF922AF3930h)
mov r12,qword ptr [pool]
revprops_shard_path,
pb->shard,
ffd->max_files_per_dir,
pack_size_limit,
ffd->compress_packed_revprops
? SVN__COMPRESSION_ZLIB_DEFAULT
: SVN__COMPRESSION_NONE,
ffd->flush_to_disk,
pb->cancel_func,
pb->cancel_baton,
pool));
}
/* Update the min-unpacked-rev file to reflect our newly packed shard. */
SVN_ERR(svn_fs_fs__write_min_unpacked_rev(pb->fs,
mov eax,dword ptr [r13+40h]
lea rcx,[rsp+70h]
mov rdi,qword ptr [r13]
inc eax
imul eax,dword ptr [r15+4]
mov rsi,qword ptr [rdi+38h]
movsxd rdx,eax
call qword ptr [__imp_svn__i64toa (07FF922B16490h)]
mov rcx,qword ptr [rdi+8]
lea rdx,[string "min-unpacked-rev" (07FF922B1BC60h)]
mov r8,rbp
mov rbx,rax
mov byte ptr [rsp+rax+70h],0Ah
call qword ptr [__imp_svn_dirent_join (07FF922B16400h)]
mov ecx,dword ptr [rsi+158h]
lea r8,[rbx+1]
mov qword ptr [rsp+28h],rbp
lea rdx,[rsp+70h]
mov dword ptr [rsp+20h],ecx
mov r9,rax
mov rcx,rax
call qword ptr [__imp_svn_io_write_atomic2 (07FF922B16368h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF922AF3930h)
(svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir),
pool));
ffd->min_unpacked_rev
= (svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir);
/* Finally, remove the existing shard directories.
* For revprops, clean up older obsolete shards as well as they might
* have been left over from an interrupted FS upgrade. */
SVN_ERR(svn_io_remove_dir2(pb->rev_shard_path, TRUE,
mov eax,dword ptr [r13+40h]
mov edx,1
inc eax
mov qword ptr [rsp+20h],rbp
imul eax,dword ptr [r15+4]
mov dword ptr [r15+10Ch],eax
mov r9,qword ptr [r13+20h]
mov r8,qword ptr [r13+18h]
mov rcx,qword ptr [r13+48h]
call qword ptr [__imp_svn_io_remove_dir2 (07FF922B169E8h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF922AF3930h)
pb->cancel_func, pb->cancel_baton, pool));
if (pb->revsprops_dir)
cmp qword ptr [r13+38h],rax
je synced_pack_shard+2EEh (07FF922AF392Eh)
{
svn_node_kind_t kind = svn_node_dir;
apr_int64_t to_cleanup = pb->shard;
mov rdi,qword ptr [r13+40h]
mov qword ptr [rsp+58h],rdi
mov dword ptr [kind],2
nop
while(1)
{
SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
mov rax,qword ptr [ffd]
mov r15,qword ptr [r13+20h]
mov rsi,qword ptr [r13+18h]
mov r14d,dword ptr [rax+4]
test rdi,rdi
jne synced_pack_shard+279h (07FF922AF38B9h)
xor edx,edx
mov rcx,rbp
call qword ptr [__imp_svn_pool_create_ex (07FF922B16938h)]
mov ebx,1
mov rdi,rax
cmp r14d,ebx
jle synced_pack_shard+269h (07FF922AF38A9h)
mov rcx,rdi
call qword ptr [__imp_apr_pool_clear (07FF922B161D0h)]
mov r8d,ebx
lea rdx,[string "%d" (07FF922B1DE90h)]
mov rcx,rdi
call qword ptr [__imp_apr_psprintf (07FF922B161D8h)]
mov r8,rdi
mov rcx,r12
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922B16400h)]
mov rbp,rax
test rsi,rsi
je synced_pack_shard+243h (07FF922AF3883h)
mov rcx,r15
call rsi
test rax,rax
jne synced_pack_shard+2F0h (07FF922AF3930h)
mov r8,rdi
mov edx,1
mov rcx,rbp
call qword ptr [__imp_svn_io_remove_file2 (07FF922B167A0h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF922AF3930h)
inc ebx
cmp ebx,r14d
jl synced_pack_shard+202h (07FF922AF3842h)
mov rbp,qword ptr [pool]
mov rcx,rdi
call qword ptr [__imp_apr_pool_destroy (07FF922B16190h)]
mov rdi,qword ptr [to_cleanup]
jmp synced_pack_shard+297h (07FF922AF38D7h)
mov r9,r15
mov qword ptr [rsp+20h],rbp
mov r8,rsi
mov edx,1
mov rcx,r12
call qword ptr [__imp_svn_io_remove_dir2 (07FF922B169E8h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF922AF3930h)
to_cleanup,
ffd->max_files_per_dir,
pb->cancel_func,
pb->cancel_baton,
pool));
/* If the previous shard exists, clean it up as well.
Don't try to clean up shard 0 as it we can't tell quickly
whether it actually needs cleaning up. */
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
mov rbx,qword ptr [r13+38h]
lea rdx,[string "%I64d" (07FF922B16D1Ch)]
dec rdi
mov rcx,rbp
mov r8,rdi
mov qword ptr [to_cleanup],rdi
call qword ptr [__imp_apr_psprintf (07FF922B161D8h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF922B16400h)]
apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
pool);
SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
mov r8,rbp
lea rdx,[kind]
mov rcx,rax
mov r12,rax
call qword ptr [__imp_svn_io_check_path (07FF922B16360h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF922AF3930h)
if (!(kind == svn_node_dir && to_cleanup > 0))
cmp dword ptr [kind],2
jne synced_pack_shard+2EEh (07FF922AF392Eh)
test rdi,rdi
jg synced_pack_shard+1D0h (07FF922AF3810h)
{
break;
}
}
}
return SVN_NO_ERROR;
xor eax,eax
}
mov rcx,qword ptr [rsp+88h]
xor rcx,rsp
call __security_check_cookie (07FF922B14790h)
mov rbx,qword ptr [rsp+0E0h]
add rsp,90h
pop r15
pop r14
pop r13
pop r12
pop rdi
pop rsi
pop rbp
ret static svn_error_t *
synced_pack_shard(void *baton,
apr_pool_t *pool)
{
mov qword ptr [rsp+18h],rbx
push rbp
push rsi
push rdi
push r12
push r13
push r14
push r15
sub rsp,90h
mov rax,qword ptr [__security_cookie (07FF972012000h)]
xor rax,rsp
mov qword ptr [rsp+88h],rax
struct pack_baton *pb = baton;
fs_fs_data_t *ffd = pb->fs->fsap_data;
const char *revprops_shard_path, *revprops_pack_file_dir;
/* if enabled, pack the revprops in an equivalent way */
if (pb->revsprops_dir)
cmp qword ptr [rcx+38h],0
mov rbp,rdx
mov rax,qword ptr [rcx]
mov r13,rcx
mov qword ptr [rsp+60h],rdx
mov r15,qword ptr [rax+38h]
mov qword ptr [rsp+68h],r15
je synced_pack_shard+10Eh (07FF971FD76DEh)
{
apr_int64_t pack_size_limit = 0.9 * ffd->revprop_pack_size;
revprops_pack_file_dir = svn_dirent_join(pb->revsprops_dir,
mov rbx,qword ptr [rcx+38h]
lea rdx,[string "%I64d.pack" (07FF9720053C0h)]
mov r8,qword ptr [rcx+40h]
xorps xmm0,xmm0
cvtsi2sd xmm0,qword ptr [r15+118h]
mov rcx,rbp
mulsd xmm0,mmword ptr [__real@3feccccccccccccd (07FF972007670h)]
cvttsd2si rsi,xmm0
call qword ptr [__imp_apr_psprintf (07FF971FFE268h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF971FFE400h)]
apr_psprintf(pool,
"%" APR_INT64_T_FMT PATH_EXT_PACKED_SHARD,
pb->shard),
pool);
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
mov r8,qword ptr [r13+40h]
lea rdx,[string "%I64d" (07FF971FFECDCh)]
mov rbx,qword ptr [r13+38h]
mov rcx,rbp
mov rdi,rax
call qword ptr [__imp_apr_psprintf (07FF971FFE268h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF971FFE400h)]
apr_psprintf(pool, "%" APR_INT64_T_FMT, pb->shard),
pool);
SVN_ERR(svn_fs_fs__pack_revprops_shard(revprops_pack_file_dir,
mov ecx,dword ptr [r15+120h]
mov r12,rax
mov r9d,dword ptr [r15+4]
neg ecx
mov rcx,qword ptr [r13+20h]
mov r8,qword ptr [r13+40h]
sbb edx,edx
mov qword ptr [rsp+48h],rbp
and edx,5
mov qword ptr [rsp+40h],rcx
mov rcx,qword ptr [r13+18h]
mov qword ptr [rsp+38h],rcx
mov ecx,dword ptr [r15+158h]
mov dword ptr [rsp+30h],ecx
mov rcx,rdi
mov dword ptr [rsp+28h],edx
mov rdx,rax
mov qword ptr [rsp+20h],rsi
call svn_fs_fs__pack_revprops_shard (07FF971FDE8C0h)
test rax,rax
je synced_pack_shard+113h (07FF971FD76E3h)
jmp synced_pack_shard+2F0h (07FF971FD78C0h)
mov r12,qword ptr [pool]
revprops_shard_path,
pb->shard,
ffd->max_files_per_dir,
pack_size_limit,
ffd->compress_packed_revprops
? SVN__COMPRESSION_ZLIB_DEFAULT
: SVN__COMPRESSION_NONE,
ffd->flush_to_disk,
pb->cancel_func,
pb->cancel_baton,
pool));
}
/* Update the min-unpacked-rev file to reflect our newly packed shard. */
SVN_ERR(svn_fs_fs__write_min_unpacked_rev(pb->fs,
mov eax,dword ptr [r13+40h]
lea rcx,[rsp+70h]
mov rdi,qword ptr [r13]
inc eax
imul eax,dword ptr [r15+4]
mov rsi,qword ptr [rdi+38h]
movsxd rdx,eax
call qword ptr [__imp_svn__i64toa (07FF971FFE490h)]
mov rcx,qword ptr [rdi+8]
lea rdx,[string "min-unpacked-rev" (07FF972003C20h)]
mov r8,rbp
mov rbx,rax
mov byte ptr [rsp+rax+70h],0Ah
call qword ptr [__imp_svn_dirent_join (07FF971FFE400h)]
mov ecx,dword ptr [rsi+158h]
lea r8,[rbx+1]
mov qword ptr [rsp+28h],rbp
lea rdx,[rsp+70h]
mov dword ptr [rsp+20h],ecx
mov r9,rax
mov rcx,rax
call qword ptr [__imp_svn_io_write_atomic2 (07FF971FFE368h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF971FD78C0h)
(svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir),
pool));
ffd->min_unpacked_rev
= (svn_revnum_t)((pb->shard + 1) * ffd->max_files_per_dir);
/* Finally, remove the existing shard directories.
* For revprops, clean up older obsolete shards as well as they might
* have been left over from an interrupted FS upgrade. */
SVN_ERR(svn_io_remove_dir2(pb->rev_shard_path, TRUE,
mov eax,dword ptr [r13+40h]
mov edx,1
inc eax
mov qword ptr [rsp+20h],rbp
imul eax,dword ptr [r15+4]
mov dword ptr [r15+10Ch],eax
mov r9,qword ptr [r13+20h]
mov r8,qword ptr [r13+18h]
mov rcx,qword ptr [r13+48h]
call qword ptr [__imp_svn_io_remove_dir2 (07FF971FFE648h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF971FD78C0h)
pb->cancel_func, pb->cancel_baton, pool));
if (pb->revsprops_dir)
cmp qword ptr [r13+38h],rax
je synced_pack_shard+2EEh (07FF971FD78BEh)
{
svn_node_kind_t kind = svn_node_dir;
apr_int64_t to_cleanup = pb->shard;
mov rdi,qword ptr [r13+40h]
mov qword ptr [rsp+58h],rdi
mov dword ptr [kind],2
nop
do
{
SVN_ERR(svn_fs_fs__delete_revprops_shard(revprops_shard_path,
mov r15,qword ptr [r13+20h]
mov rsi,qword ptr [r13+18h]
test rdi,rdi
jne synced_pack_shard+279h (07FF971FD7849h)
mov rax,qword ptr [rsp+68h]
xor edx,edx
mov rcx,rbp
mov r14d,dword ptr [rax+4]
call qword ptr [__imp_svn_pool_create_ex (07FF971FFE900h)]
mov ebx,1
mov rdi,rax
cmp r14d,ebx
jle synced_pack_shard+269h (07FF971FD7839h)
mov rcx,rdi
call qword ptr [__imp_apr_pool_clear (07FF971FFE1A0h)]
mov r8d,ebx
lea rdx,[string "%d" (07FF972005E50h)]
mov rcx,rdi
call qword ptr [__imp_apr_psprintf (07FF971FFE268h)]
mov r8,rdi
mov rcx,r12
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF971FFE400h)]
mov rbp,rax
test rsi,rsi
je synced_pack_shard+243h (07FF971FD7813h)
mov rcx,r15
call rsi
test rax,rax
jne synced_pack_shard+2F0h (07FF971FD78C0h)
mov r8,rdi
mov edx,1
mov rcx,rbp
call qword ptr [__imp_svn_io_remove_file2 (07FF971FFE9B8h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF971FD78C0h)
inc ebx
cmp ebx,r14d
jl synced_pack_shard+202h (07FF971FD77D2h)
mov rbp,qword ptr [pool]
mov rcx,rdi
call qword ptr [__imp_apr_pool_destroy (07FF971FFE160h)]
mov rdi,qword ptr [to_cleanup]
jmp synced_pack_shard+297h (07FF971FD7867h)
mov r9,r15
mov qword ptr [rsp+20h],rbp
mov r8,rsi
mov edx,1
mov rcx,r12
call qword ptr [__imp_svn_io_remove_dir2 (07FF971FFE648h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF971FD78C0h)
to_cleanup,
ffd->max_files_per_dir,
pb->cancel_func,
pb->cancel_baton,
pool));
/* If the previous shard exists, clean it up as well.
Don't try to clean up shard 0 as it we can't tell quickly
whether it actually needs cleaning up. */
revprops_shard_path = svn_dirent_join(pb->revsprops_dir,
mov rbx,qword ptr [r13+38h]
lea rdx,[string "%I64d" (07FF971FFECDCh)]
dec rdi
mov rcx,rbp
mov r8,rdi
mov qword ptr [to_cleanup],rdi
call qword ptr [__imp_apr_psprintf (07FF971FFE268h)]
mov r8,rbp
mov rcx,rbx
mov rdx,rax
call qword ptr [__imp_svn_dirent_join (07FF971FFE400h)]
apr_psprintf(pool, "%" APR_INT64_T_FMT, --to_cleanup),
pool);
SVN_ERR(svn_io_check_path(revprops_shard_path, &kind, pool));
mov r8,rbp
lea rdx,[kind]
mov rcx,rax
mov r12,rax
call qword ptr [__imp_svn_io_check_path (07FF971FFE360h)]
test rax,rax
jne synced_pack_shard+2F0h (07FF971FD78C0h)
}
while (kind == svn_node_dir && to_cleanup > 0);
cmp dword ptr [kind],2
jne synced_pack_shard+2EEh (07FF971FD78BEh)
test rdi,rdi
jg synced_pack_shard+1D0h (07FF971FD77A0h)
}
return SVN_NO_ERROR;
xor eax,eax
}
mov rcx,qword ptr [rsp+88h]
xor rcx,rsp
call __security_check_cookie (07FF971FFCBF0h)
mov rbx,qword ptr [rsp+0E0h]
add rsp,90h
pop r15
pop r14
pop r13
pop r12
pop rdi
pop rsi
pop rbp
ret