[Unison-hackers] [unison-svn] r375 - trunk/src

Benjamin Pierce bcpierce at cis.upenn.edu
Thu Jul 16 22:32:05 EDT 2009


Hi Jerome,

I've upgraded to this version, but it still appears to be scanning  
ignored subdirectories.  Is it possible that my archives are messed up  
from running the previous version, or is there perhaps another bug to  
squash...?

    - B



On Jul 16, 2009, at 6:13 PM, vouillon at seas.upenn.edu wrote:

> Author: vouillon
> Date: 2009-07-16 18:13:45 -0400 (Thu, 16 Jul 2009)
> New Revision: 375
>
> Modified:
>   trunk/src/RECENTNEWS
>   trunk/src/mkProjectInfo.ml
>   trunk/src/update.ml
> Log:
> * Fixed small bug in new update detection optimization:
>  do not perform the optimization for directories with ignored
>  children in the archive.  Indeed, we cannot rely on the archive in
>  this case instead of reading the directory contents from the
>  filesystem (systematically pruning the ignored children from the
>  archive is too costly).
>
>
> Modified: trunk/src/RECENTNEWS
> ===================================================================
> --- trunk/src/RECENTNEWS	2009-07-16 19:33:15 UTC (rev 374)
> +++ trunk/src/RECENTNEWS	2009-07-16 22:13:45 UTC (rev 375)
> @@ -1,5 +1,15 @@
> CHANGES FROM VERSION 2.36.-27
>
> +* Fixed small bug in new update detection optimization:
> +  do not perform the optimization for directories with ignored
> +  children in the archive.  Indeed, we cannot rely on the archive in
> +  this case instead of reading the directory contents from the
> +  filesystem (systematically pruning the ignored children from the
> +  archive is too costly).
> +
> +-------------------------------
> +CHANGES FROM VERSION 2.36.-27
> +
> * Experimental update detection optimization:
>   do not read the contents of unchanged directories
> * MyMap.map and MyMap.mapi now iterate in increasing order
>
> Modified: trunk/src/mkProjectInfo.ml
> ===================================================================
> --- trunk/src/mkProjectInfo.ml	2009-07-16 19:33:15 UTC (rev 374)
> +++ trunk/src/mkProjectInfo.ml	2009-07-16 22:13:45 UTC (rev 375)
> @@ -93,3 +93,4 @@
>
>
>
> +
>
> Modified: trunk/src/update.ml
> ===================================================================
> --- trunk/src/update.ml	2009-07-16 19:33:15 UTC (rev 374)
> +++ trunk/src/update.ml	2009-07-16 22:13:45 UTC (rev 375)
> @@ -1316,7 +1316,8 @@
>    whether the directory is now empty *)
> let rec buildUpdateChildren
>     fspath path (archChi: archive NameMap.t) unchangedChildren  
> fastCheckInfos
> -    : archive NameMap.t option * (Name.t * Common.updateItem) list  
> * bool
> +    : archive NameMap.t option * (Name.t * Common.updateItem) list *
> +      bool * bool
>     =
>   showStatusDir path;
>   let skip =
> @@ -1334,7 +1335,7 @@
>              | _ ->
>                  ())
>           archChi;
> -      (None, [], false)
> +      (None, [], false, false)
>     end else begin
>       let updates = ref [] in
>       let archUpdated = ref false in
> @@ -1352,16 +1353,18 @@
>       let newChi = NameMap.mapi handleChild archChi in
>       (* The Recon module relies on the updates to be sorted *)
>       ((if !archUpdated then Some newChi else None),
> -       Safelist.rev !updates, false)
> +       Safelist.rev !updates, false, false)
>     end
>   end else
>   let curChildren = ref (getChildren fspath path) in
>   let emptied = not (NameMap.is_empty archChi) && !curChildren = [] in
> +  let hasIgnoredChildren = ref false in
>   let updates = ref [] in
>   let archUpdated = ref false in
>   let handleChild nm archive status =
>     let path' = Path.child path nm in
>     if Globals.shouldIgnore path' then begin
> +      hasIgnoredChildren := true;
>       debugignore (fun()->Util.msg "buildUpdateChildren: ignoring  
> path %s\n"
>                             (Path.toString path'));
>       archive
> @@ -1440,7 +1443,7 @@
>     !curChildren;
>   (* The Recon module relies on the updates to be sorted *)
>   ((if !archUpdated then Some newChi else None),
> -   Safelist.rev !updates, emptied)
> +   Safelist.rev !updates, emptied, !hasIgnoredChildren)
>
> and buildUpdateRec archive currfspath path fastCheckInfos =
>   try
> @@ -1497,10 +1500,20 @@
>             (PropsUpdated, info.Fileinfo.desc) in
>         let unchanged =
>           dirContentsClearlyUnchanged info archDesc fastCheckInfos in
> -        let (newChildren, childUpdates, emptied) =
> +        let (newChildren, childUpdates, emptied,  
> hasIgnoredChildren) =
>           buildUpdateChildren
>             currfspath path prevChildren unchanged fastCheckInfos in
>         let (archDesc, updated) =
> +          (* If the archive contain ignored children, we cannot use  
> it to
> +             skip reading the directory contents from the filesystem.
> +             Actually, we could check for ignored children in the  
> archive,
> +             but this has a significant cost.  We could mark  
> directories
> +             with ignored children, and only perform the checks for  
> them,
> +             but that does not seem worthwhile, are directories with
> +             ignored children are expected to be rare in the archive.
> +             (These are files or directories which used not to be
> +             ignored and are now ignored.) *)
> +          if hasIgnoredChildren then (archDesc, true) else
>           directoryCheckContentUnchanged
>             currfspath path info archDesc childUpdates  
> fastCheckInfos in
>         (begin match newChildren with
> @@ -1517,7 +1530,7 @@
>            NoUpdates)
>     | (`DIRECTORY, _) ->
>         debug (fun() -> Util.msg "  buildUpdate -> New directory\n");
> -        let (newChildren, childUpdates, _) =
> +        let (newChildren, childUpdates, _, _) =
>           buildUpdateChildren
>             currfspath path NameMap.empty false fastCheckInfos in
>         (None,
>
> _______________________________________________
> Unison-hackers mailing list
> Unison-hackers at lists.seas.upenn.edu
> http://lists.seas.upenn.edu/mailman/listinfo/unison-hackers



More information about the Unison-hackers mailing list