bionic (7) libpmemcto.7.gz

Provided by: libpmemcto-dev_1.4.1-0ubuntu1~18.04.1_amd64 bug

NAME

       libpmemcto - close-to-open persistence (EXPERIMENTAL)

SYNOPSIS

              #include <libpmemcto.h>
              cc ... -lpmemcto -lpmem

   Library API versioning:
              const char *pmemcto_check_version(
                  unsigned major_required,
                  unsigned minor_required);

   Managing library behavior:
              void pmemcto_set_funcs(
                  void *(*malloc_func)(size_t size),
                  void (*free_func)(void *ptr),
                  void *(*realloc_func)(void *ptr, size_t size),
                  char *(*strdup_func)(const char *s),
                  void (*print_func)(const char *s));

   Error handling:
              const char *pmemcto_errormsg(void);

   Other library functions:
       A description of other libpmemcto functions can be found on the following manual pages:

       pmemcto_aligned_alloc(3),      pmemcto_malloc(3),     pmemcto_malloc_usable_size(3),     pmemcto_open(3),
       pmemcto_set_root_pointer(3), pmemcto_stats_print(3), pmemcto_strdup(3), pmemcto_wcsdup(3)

DESCRIPTION

       libpmemcto  is  a  persistent  memory  allocator  with  no  overhead  imposed  by  run-time  flushing  or
       transactional updates:

       • It  runs at traditional volatile memory allocator speeds - there is no flushing or consistency check at
         run-time.

       • An overhead imposed only when program exits normally and have to flush the file.

       • The program flushes the pool contents when it exits, and then rebuilds the pool on the next run.

       • If the program crashes before flushing the file (or if flushing fails), the pool is in an  inconsistent
         state causing subsequent pool opening to fail.

       libpmemcto  provides  common  malloc-like  interfaces  to  persistent memory pools built on memory-mapped
       files.  libpmemcto uses the mmap(2) system call to create a pool of persistent memory.   The  library  is
       intended  for  applications  using  Direct  Access  storage (DAX), which is memory-addressable persistent
       storage that supports load/store access without being paged via the  system  page  cache.   A  Persistent
       Memory-aware  file system is typically used to provide this type of access.  Memory-mapping a file from a
       Persistent Memory-aware file system provides the raw memory pools, and this  library  supplies  the  more
       familiar  malloc-like  interfaces on top of those pools.  libpmemcto is one of a collection of persistent
       memory libraries available, the others are:

       • libpmemobj(7), a general use persistent memory  API,  providing  memory  allocation  and  transactional
         operations on variable-sized objects.

       • libpmemblk(7), providing pmem-resident arrays of fixed-sized blocks with atomic updates.

       • libpmemlog(7), providing a pmem-resident log file.

       • libpmem(7), low-level persistent memory support.

       Under  normal  usage,  libpmemcto  will  never print messages or intentionally cause the process to exit.
       Exceptions to this are prints caused by calls to pmemcto_stats_print(3),  or  by  enabling  debugging  as
       described  under  DEBUGGING  AND ERROR HANDLING below.  The library uses pthreads(7) to be fully MT-safe,
       but never creates or destroys threads itself.  The library does not make use of any signals,  networking,
       and never calls select() or poll().

       The  system  memory  allocation  routines  like malloc() and free() are used by libpmemcto for managing a
       small amount of run-time state, but applications are allowed to override these calls  if  necessary  (see
       pmemcto_set_funcs()).

       This library builds on the low-level pmem support provided by libpmem(7).

       To  use  close-to-open  persistence  supplied  by  libpmemcto,  a  memory pool is first created using the
       pmemcto_create() function described in pmemcto_open(3).  The other libpmemcto functions  operate  on  the
       resulting  block  memory  pool  using  the  opaque  handle,  of  type  PMEMctopool*,  that is returned by
       pmemcto_create() or pmemcto_open().  Internally, libpmemcto will use either pmem_persist(3)  or  msync(2)
       when it needs to flush changes, depending on whether the memory pool appears to be persistent memory or a
       regular file (see the pmem_is_pmem(3) function in libpmem(7) for more information).  There is no need for
       applications  to  flush  changes directly when using the close-to-open persistence memory API provided by
       libpmemcto.

CAVEATS

       libpmemcto relies on the library destructor being called from the main  thread.   For  this  reason,  all
       functions  that  might  trigger  destruction  (e.g.   dlclose(3))  should  be  called in the main thread.
       Otherwise some of the resources associated with that thread might not be cleaned up properly.

LIBRARY API VERSIONING

       This section describes how the library API is versioned, allowing applications to work with  an  evolving
       API.

       The  pmemcto_check_version()  function is used to determine whether the installed libpmemcto supports the
       version of the library API required by an application.  The easiest way to do this is for the application
       to supply the compile-time version information, supplied by defines in <ibpmemcto.h>, like this:

              reason = pmemcto_check_version(PMEMCTO_MAJOR_VERSION,
                                             PMEMCTO_MINOR_VERSION);
              if (reason != NULL) {
                  /* version check failed, reason string tells you why */
              }

       Any  mismatch  in  the  major  version  number  is considered a failure, but a library with a newer minor
       version number will pass this check since increasing minor versions imply backwards compatibility.

       An application can also check specifically for the existence of an interface by checking for the  version
       where  that  interface was introduced.  These versions are documented in this man page as follows: unless
       otherwise specified, all interfaces  described  here  are  available  in  version  1.0  of  the  library.
       Interfaces added after version 1.0 will contain the text introduced in version x.y in the section of this
       manual describing the feature.

       When the version check performed by pmemcto_check_version() is successful,  the  return  value  is  NULL.
       Otherwise  the  return value is a static string describing the reason for failing the version check.  The
       string returned by pmemcto_check_version() must not be modified or freed.

MANAGING LIBRARY BEHAVIOR

       The pmemcto_set_funcs()  function  allows  an  application  to  override  memory  allocation  calls  used
       internally  by  libpmemcto.   Passing  in  NULL for any of the handlers will cause the libpmemcto default
       function to be used.  The library does not make heavy use of the system malloc  functions,  but  it  does
       allocate approximately 4-8 kilobytes for each memory pool in use.

DEBUGGING AND ERROR HANDLING

       The  pmemcto_errormsg()  function  returns a pointer to a static buffer containing the last error message
       logged for the current thread.  If errno was set, the error message may  include  a  description  of  the
       corresponding  error  code, as returned by strerror(3).  The error message buffer is thread-local; errors
       encountered in one thread do not affect its value in other threads.  The buffer is never cleared  by  any
       library function; its content is significant only when the return value of the immediately preceding call
       to a libpmemcto function indicated an error, or if errno was set.  The application  must  not  modify  or
       free the error message string, but it may be modified by subsequent calls to other library functions.

       Two versions of libpmemcto are typically available on a development system.  The normal version, accessed
       when a program is linked using the -lpmemcto option, is optimized for performance.   That  version  skips
       checks  that impact performance and never logs any trace information or performs any run-time assertions.
       If an error is detected in a call to  libpmemcto,  the  error  message  describing  the  failure  may  be
       retrieved with pmemcto_errormsg() as described above.

       A  second  version  of  libpmemcto, accessed when a program uses the libraries under /usr/lib/pmdk_debug,
       contains run-time assertions and trace points.  The typical way to access the debug version is to set the
       LD_LIBRARY_PATH  environment  variable  to  /usr/lib/pmdk_debug or /usr/lib64/pmdk_debug, as appropriate.
       Debugging output is controlled using the following environment variables.  These variables have no effect
       on the non-debug version of the library.

       • PMEMCTO_LOG_LEVEL

       The value of PMEMCTO_LOG_LEVEL enables trace points in the debug version of the library, as follows:

       • 0  -  This is the default level when PMEMCTO_LOG_LEVEL is not set.  No log messages are emitted at this
         level.

       • 1 - Additional details on any errors detected are logged, in  addition  to  returning  the  errno-based
         errors as usual.  The same information may be retrieved using pmemcto_errormsg().

       • 2 - A trace of basic operations is logged.

       • 3 - Enables a very verbose amount of function call tracing in the library.

       • 4  -  Enables  voluminous  and  fairly  obscure  tracing  information that is likely only useful to the
         libpmemcto developers.

       Unless PMEMCTO_LOG_FILE is set, debugging output is written to stderr.

       • PMEMCTO_LOG_FILE

       Specifies the name of a file where all logging information should be written.  If the last  character  in
       the  name  is  “-”, the PID of the current process will be appended to the file name when the log file is
       created.  If PMEMCTO_LOG_FILE is not set, the logging output is written to stderr.

       See also libpmem(7) for information on other environment variables that may affect libpmemcto behavior.

EXAMPLE

       The following example creates a memory pool, allocates some memory to contain the string “hello,  world”,
       and then frees that memory.

              #include <stdio.h>
              #include <fcntl.h>
              #include <errno.h>
              #include <stdlib.h>
              #include <unistd.h>
              #include <string.h>
              #include <libpmemcto.h>

              /* size of the pmemcto pool -- 1 GB */
              #define POOL_SIZE ((size_t)(1 << 30))

              /* name of our layout in the pool */
              #define LAYOUT_NAME "example_layout"

              struct root {
                  char *str;
                  char *data;
              };

              int
              main(int argc, char *argv[])
              {
                  const char path[] = "/pmem-fs/myfile";
                  PMEMctopool *pcp;

                  /* create the pmemcto pool or open it if already exists */
                  pcp = pmemcto_create(path, LAYOUT_NAME, POOL_SIZE, 0666);

                  if (pcp == NULL)
                      pcp = pmemcto_open(path, LAYOUT_NAME);

                  if (pcp == NULL) {
                      perror(path);
                      exit(1);
                  }

                  /* get the root object pointer */
                  struct root *rootp = pmemcto_get_root_pointer(pcp);

                  if (rootp == NULL) {
                      /* allocate root object */
                      rootp = pmemcto_malloc(pcp, sizeof(*rootp));

                      if (rootp == NULL) {
                          perror(pmemcto_errormsg());
                          exit(1);
                      }

                      /* save the root object pointer */
                      pmemcto_set_root_pointer(pcp, rootp);

                      rootp->str = pmemcto_strdup(pcp, "Hello World!");
                      rootp->data = NULL;
                  }

                  /* ... */

                  pmemcto_close(pcp);
              }

       See <http://pmem.io/pmdk/libpmemcto> for more examples using the libpmemcto API.

BUGS

       Unlike  libpmemobj(3),  data  replication  is  not  supported  in libpmemcto.  Thus, it is not allowed to
       specify replica sections in pool set files.

NOTES

       Unlike the normal malloc(), which asks the system for additional memory  when  it  runs  out,  libpmemcto
       allocates the size it is told to and never attempts to grow or shrink that memory pool.

AVAILABILITY

       libpmemcto is part of the PMDK since version 1.4 and is available from <https://github.com/pmem/pmdk>

ACKNOWLEDGEMENTS

       libpmemcto  depends  on  jemalloc,  written  by  Jason Evans, to do the heavy lifting of managing dynamic
       memory allocation.  See: <http://www.canonware.com/jemalloc>

       libpmemcto builds on the persistent memory programming model recommended  by  the  SNIA  NVM  Programming
       Technical Work Group: <http://snia.org/nvmp>

SEE ALSO

       ndctl-create-namespace(1),   dlclose(2),   mmap(2),   jemalloc(3),  malloc(3),  pmemcto_aligned_alloc(3),
       pmemcto_errormsg(3),       pmemcto_malloc(3),       pmemcto_malloc_usable_size(3),       pmemcto_open(3),
       pmemcto_set_root_pointer(3),  pmemcto_stats_print(3),  pmemcto_strdup(3),  pmemcto_wcsdup(3), libpmem(7),
       libpmemblk(7), libpmemlog(7), libpmemobj(7) and <http://pmem.io>