You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Arfrever Frehtes Taifersar Arahesis <ar...@gmail.com> on 2008/07/02 17:41:06 UTC

[PATCH] Support Berkeley DB 4.7

[[[
Support Berkeley DB 4.7.

* subversion/libsvn_fs_base/fs.c
  (check_env_flags, get_db_pagesize, base_hotcopy):
   Use '#if DB_VERSION_MINOR >= 2' instead of '#ifdef DB_LOG_AUTOREMOVE'
   to check for Berkeley DB >= 4.2.
  (check_env_flags):
   Call DB_ENV->log_get_config() instead of DB_ENV->get_flags() for
   Berkeley DB >= 4.7.
  (base_hotcopy):
   Call check_env_flags() with DB_LOG_AUTO_REMOVE instead of DB_LOG_AUTOREMOVE
   for Berkeley DB >= 4.7.

* build/generator/gen_win.py
  (GeneratorBase._find_bdb): Allow Berkeley DB 4.7.
]]]

-- 
Arfrever Frehtes Taifersar Arahesis

Re: [PATCH] Support Berkeley DB 4.7

Posted by Arfrever Frehtes Taifersar Arahesis <ar...@gmail.com>.
2008-07-07 19:15:33 C. Michael Pilato napisał(a):
> Arfrever Frehtes Taifersar Arahesis wrote:
> > 2008-07-02 20:33:50 C. Michael Pilato napisał(a):
> >> Arfrever Frehtes Taifersar Arahesis wrote:
> >>> [[[
> >>> Support Berkeley DB 4.7.
> >>>
> >>> * subversion/libsvn_fs_base/fs.c
> >>>   (check_env_flags, get_db_pagesize, base_hotcopy):
> >>>    Use '#if DB_VERSION_MINOR >= 2' instead of '#ifdef DB_LOG_AUTOREMOVE'
> >>>    to check for Berkeley DB >= 4.2.
> >>>   (check_env_flags):
> >>>    Call DB_ENV->log_get_config() instead of DB_ENV->get_flags() for
> >>>    Berkeley DB >= 4.7.
> >>>   (base_hotcopy):
> >>>    Call check_env_flags() with DB_LOG_AUTO_REMOVE instead of DB_LOG_AUTOREMOVE
> >>>    for Berkeley DB >= 4.7.
> >>>
> >>> * build/generator/gen_win.py
> >>>   (GeneratorBase._find_bdb): Allow Berkeley DB 4.7.
> >>> ]]]
> 
> Patch looks good.  I'd still prefer to see all the #ifdef-y stuff moved to 
> bdb_compat.[ch], but I'll get over it.

Committed in r32017.

-- 
Arfrever Frehtes Taifersar Arahesis

Re: [PATCH] Support Berkeley DB 4.7

Posted by "C. Michael Pilato" <cm...@collab.net>.
Arfrever Frehtes Taifersar Arahesis wrote:
> 2008-07-02 20:33:50 C. Michael Pilato napisał(a):
>> Arfrever Frehtes Taifersar Arahesis wrote:
>>> [[[
>>> Support Berkeley DB 4.7.
>>>
>>> * subversion/libsvn_fs_base/fs.c
>>>   (check_env_flags, get_db_pagesize, base_hotcopy):
>>>    Use '#if DB_VERSION_MINOR >= 2' instead of '#ifdef DB_LOG_AUTOREMOVE'
>>>    to check for Berkeley DB >= 4.2.
>>>   (check_env_flags):
>>>    Call DB_ENV->log_get_config() instead of DB_ENV->get_flags() for
>>>    Berkeley DB >= 4.7.
>>>   (base_hotcopy):
>>>    Call check_env_flags() with DB_LOG_AUTO_REMOVE instead of DB_LOG_AUTOREMOVE
>>>    for Berkeley DB >= 4.7.
>>>
>>> * build/generator/gen_win.py
>>>   (GeneratorBase._find_bdb): Allow Berkeley DB 4.7.
>>> ]]]

Patch looks good.  I'd still prefer to see all the #ifdef-y stuff moved to 
bdb_compat.[ch], but I'll get over it.


-- 
C. Michael Pilato <cm...@collab.net>
CollabNet   <>   www.collab.net   <>   Distributed Development On Demand


Re: [PATCH] Support Berkeley DB 4.7

Posted by Arfrever Frehtes Taifersar Arahesis <ar...@gmail.com>.
2008-07-02 20:33:50 C. Michael Pilato napisał(a):
> Arfrever Frehtes Taifersar Arahesis wrote:
> > [[[
> > Support Berkeley DB 4.7.
> > 
> > * subversion/libsvn_fs_base/fs.c
> >   (check_env_flags, get_db_pagesize, base_hotcopy):
> >    Use '#if DB_VERSION_MINOR >= 2' instead of '#ifdef DB_LOG_AUTOREMOVE'
> >    to check for Berkeley DB >= 4.2.
> >   (check_env_flags):
> >    Call DB_ENV->log_get_config() instead of DB_ENV->get_flags() for
> >    Berkeley DB >= 4.7.
> >   (base_hotcopy):
> >    Call check_env_flags() with DB_LOG_AUTO_REMOVE instead of DB_LOG_AUTOREMOVE
> >    for Berkeley DB >= 4.7.
> > 
> > * build/generator/gen_win.py
> >   (GeneratorBase._find_bdb): Allow Berkeley DB 4.7.
> > ]]]
> > 
> > 
> > Index: subversion/libsvn_fs_base/fs.c
> > ===================================================================
> > --- subversion/libsvn_fs_base/fs.c	(revision 31974)
> > +++ subversion/libsvn_fs_base/fs.c	(working copy)
> > @@ -917,11 +917,9 @@ svn_fs_base__clean_logs(const char *live_path,
> >  }
> >  
> >  
> > -/* ### There -must- be a more elegant way to do a compile-time check
> > -       for BDB 4.2 or later.  We're doing this because apparently
> > -       env->get_flags() and DB->get_pagesize() don't exist in earlier
> > -       versions of BDB.  */
> > -#ifdef DB_LOG_AUTOREMOVE
> > +/* env->get_flags() and DB->get_pagesize() don't exist prior to
> > +   Berkeley DB 4.2. */
> > +#if DB_VERSION_MINOR >= 2
> 
> What happens when Berkeley DB 5.0 comes along?  Rather than check 
> DB_VERSION_MINOR explicitly, consider instead using:
> 
>     #if SVN_BDB_VERSION_AT_LEAST(major,minor)

OK.

> By the way, were you aware of libsvn_fs_base/bdb/bdb_compat.[ch]?  Seems we 
> could avoid some of the preprocessor noise fs.c with stuff like this:
> 
> /* In BDB 4.7, the DB_LOG_AUTOREMOVE flag was renamed to
>     DB_LOG_AUTO_REMOVE. */
> #if SVN_BDB_VERSION_AT_LEAST(4,7)
> #define SVN_BDB_LOG_AUTO_REMOVE DB_LOG_AUTO_REMOVE
> #elif SVN_BDB_VERSION_AT_LEAST(4,2)
> #define SVN_BDB_LOG_AUTO_REMOVE DB_LOG_AUTOREMOVE
> #endif

DB_LOG_AUTO_REMOVE / DB_LOG_AUTOREMOVE is used only in one place (in a call
to check_env_flags()), so defining SVN_BDB_LOG_AUTO_REMOVE is rather unnecessary.

> >  
> >  /* Open the BDB environment at PATH and compare its configuration
> >     flags with FLAGS.  If every flag in FLAGS is set in the
> > @@ -933,16 +931,28 @@ check_env_flags(svn_boolean_t *match,
> >                  apr_pool_t *pool)
> >  {
> >    bdb_env_baton_t *bdb;
> > +#if DB_VERSION_MINOR >= 7
> > +  int flag_state;
> > +#else
> >    u_int32_t envflags;
> > +#endif
> >  
> >    SVN_ERR(svn_fs_bdb__open(&bdb, path,
> >                             SVN_BDB_STANDARD_ENV_FLAGS,
> >                             0666, pool));
> > +#if DB_VERSION_MINOR >= 7
> > +  SVN_BDB_ERR(bdb, bdb->env->log_get_config(bdb->env, flags, &flag_state));
> > +#else
> > +  SVN_BDB_ERR(bdb, bdb->env->get_flags(bdb->env, &envflags));
> > +#endif
> >  
> > -  SVN_BDB_ERR(bdb, bdb->env->get_flags(bdb->env, &envflags));
> >    SVN_ERR(svn_fs_bdb__close(bdb));
> >  
> > +#if DB_VERSION_MINOR >= 7
> > +  if (flag_state == 0)
> > +#else
> >    if (flags & envflags)
> > +#endif
> >      *match = TRUE;
> >    else
> >      *match = FALSE;
> > @@ -977,7 +987,7 @@ get_db_pagesize(u_int32_t *pagesize,
> >  
> >    return svn_fs_bdb__close(bdb);
> >  }
> > -#endif /* DB_LOG_AUTOREMOVE */
> > +#endif /* DB_VERSION_MINOR >= 2 */
> 
> Should we add a helper function that calls the right DB_ENV function 
> depending on the BDB version to bdb_compat.c?

bdb->env->log_get_config(bdb->env, flags, &flag_state) (or its older equivalent) is called
only in one place in libsvn_fs_base, so a helper function is unneeded.

> 
> Also, did the DB_CONFIG file flag DB_LOG_AUTOREMOVE get renamed, too?

It wasn't renamed.

I'm attaching the updated patch.

[[[
Support Berkeley DB 4.7.

* subversion/libsvn_fs_base/fs.c
  (check_env_flags, get_db_pagesize, base_hotcopy):
   Use '#if SVN_BDB_VERSION_AT_LEAST(4, 2)' instead of
   '#ifdef DB_LOG_AUTOREMOVE' to check for Berkeley DB >= 4.2.
  (check_env_flags):
   Call DB_ENV->log_get_config() instead of DB_ENV->get_flags() for
   Berkeley DB >= 4.7.
  (base_hotcopy):
   Call check_env_flags() with DB_LOG_AUTO_REMOVE instead of DB_LOG_AUTOREMOVE
   for Berkeley DB >= 4.7.

* build/generator/gen_win.py
  (GeneratorBase._find_bdb): Allow Berkeley DB 4.7.
]]]

-- 
Arfrever Frehtes Taifersar Arahesis

Re: [PATCH] Support Berkeley DB 4.7

Posted by "C. Michael Pilato" <cm...@collab.net>.
Arfrever Frehtes Taifersar Arahesis wrote:
> [[[
> Support Berkeley DB 4.7.
> 
> * subversion/libsvn_fs_base/fs.c
>   (check_env_flags, get_db_pagesize, base_hotcopy):
>    Use '#if DB_VERSION_MINOR >= 2' instead of '#ifdef DB_LOG_AUTOREMOVE'
>    to check for Berkeley DB >= 4.2.
>   (check_env_flags):
>    Call DB_ENV->log_get_config() instead of DB_ENV->get_flags() for
>    Berkeley DB >= 4.7.
>   (base_hotcopy):
>    Call check_env_flags() with DB_LOG_AUTO_REMOVE instead of DB_LOG_AUTOREMOVE
>    for Berkeley DB >= 4.7.
> 
> * build/generator/gen_win.py
>   (GeneratorBase._find_bdb): Allow Berkeley DB 4.7.
> ]]]
> 
> 
> Index: subversion/libsvn_fs_base/fs.c
> ===================================================================
> --- subversion/libsvn_fs_base/fs.c	(revision 31974)
> +++ subversion/libsvn_fs_base/fs.c	(working copy)
> @@ -917,11 +917,9 @@ svn_fs_base__clean_logs(const char *live_path,
>  }
>  
>  
> -/* ### There -must- be a more elegant way to do a compile-time check
> -       for BDB 4.2 or later.  We're doing this because apparently
> -       env->get_flags() and DB->get_pagesize() don't exist in earlier
> -       versions of BDB.  */
> -#ifdef DB_LOG_AUTOREMOVE
> +/* env->get_flags() and DB->get_pagesize() don't exist prior to
> +   Berkeley DB 4.2. */
> +#if DB_VERSION_MINOR >= 2

What happens when Berkeley DB 5.0 comes along?  Rather than check 
DB_VERSION_MINOR explicitly, consider instead using:

    #if SVN_BDB_VERSION_AT_LEAST(major,minor)

By the way, were you aware of libsvn_fs_base/bdb/bdb_compat.[ch]?  Seems we 
could avoid some of the preprocessor noise fs.c with stuff like this:

/* In BDB 4.7, the DB_LOG_AUTOREMOVE flag was renamed to
    DB_LOG_AUTO_REMOVE. */
#if SVN_BDB_VERSION_AT_LEAST(4,7)
#define SVN_BDB_LOG_AUTO_REMOVE DB_LOG_AUTO_REMOVE
#elif SVN_BDB_VERSION_AT_LEAST(4,2)
#define SVN_BDB_LOG_AUTO_REMOVE DB_LOG_AUTOREMOVE
#endif

>  
>  /* Open the BDB environment at PATH and compare its configuration
>     flags with FLAGS.  If every flag in FLAGS is set in the
> @@ -933,16 +931,28 @@ check_env_flags(svn_boolean_t *match,
>                  apr_pool_t *pool)
>  {
>    bdb_env_baton_t *bdb;
> +#if DB_VERSION_MINOR >= 7
> +  int flag_state;
> +#else
>    u_int32_t envflags;
> +#endif
>  
>    SVN_ERR(svn_fs_bdb__open(&bdb, path,
>                             SVN_BDB_STANDARD_ENV_FLAGS,
>                             0666, pool));
> +#if DB_VERSION_MINOR >= 7
> +  SVN_BDB_ERR(bdb, bdb->env->log_get_config(bdb->env, flags, &flag_state));
> +#else
> +  SVN_BDB_ERR(bdb, bdb->env->get_flags(bdb->env, &envflags));
> +#endif
>  
> -  SVN_BDB_ERR(bdb, bdb->env->get_flags(bdb->env, &envflags));
>    SVN_ERR(svn_fs_bdb__close(bdb));
>  
> +#if DB_VERSION_MINOR >= 7
> +  if (flag_state == 0)
> +#else
>    if (flags & envflags)
> +#endif
>      *match = TRUE;
>    else
>      *match = FALSE;
> @@ -977,7 +987,7 @@ get_db_pagesize(u_int32_t *pagesize,
>  
>    return svn_fs_bdb__close(bdb);
>  }
> -#endif /* DB_LOG_AUTOREMOVE */
> +#endif /* DB_VERSION_MINOR >= 2 */

Should we add a helper function that calls the right DB_ENV function 
depending on the BDB version to bdb_compat.c?

Also, did the DB_CONFIG file flag DB_LOG_AUTOREMOVE get renamed, too?  If 
so, how do we compatibly deal with that, given that it is a configuration 
option that's under our users' control?

-- 
C. Michael Pilato <cm...@collab.net>
CollabNet   <>   www.collab.net   <>   Distributed Development On Demand