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  

Reply via email to