Last active
August 29, 2015 14:09
-
-
Save andyrudoff/9f0aee99c7b046fdb974 to your computer and use it in GitHub Desktop.
libpmemlog examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This is a gist containing libpmemlog examples, so they can be embedded in web pages. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2014, Intel Corporation | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* * Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in | |
* the documentation and/or other materials provided with the | |
* distribution. | |
* | |
* * Neither the name of Intel Corporation nor the names of its | |
* contributors may be used to endorse or promote products derived | |
* from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
/* | |
* addlog -- given a log file, append a log entry | |
* | |
* Usage: | |
* fallocate -l 1G /path/to/pm-aware/file | |
* addlog /path/to/pm-aware/file "first line of entry" "second line" | |
*/ | |
#include <stdio.h> | |
#include <fcntl.h> | |
#include <time.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <libpmemlog.h> | |
#include "logentry.h" | |
int | |
main(int argc, char *argv[]) | |
{ | |
PMEMlogpool *plp; | |
struct logentry header; | |
struct iovec *iovp; | |
struct iovec *next_iovp; | |
int iovcnt; | |
if (argc < 3) { | |
fprintf(stderr, "usage: %s filename lines...\n", argv[0]); | |
exit(1); | |
} | |
const char *path = argv[1]; | |
/* create the log in the given file, or open it if already created */ | |
if ((plp = pmemlog_create(path, 0, 0)) == NULL && | |
(plp = pmemlog_open(path)) == NULL) { | |
perror(path); | |
exit(1); | |
} | |
/* fill in the header */ | |
time(&header.timestamp); | |
header.pid = getpid(); | |
/* | |
* Create an iov for pmemlog_appendv(). For each argument given, | |
* allocate two entries (one for the string, one for the newline | |
* appended to the string). Allocate 1 additional entry for the | |
* header that gets prepended to the entry. | |
*/ | |
iovcnt = (argc - 2) * 2 + 1; | |
if ((iovp = malloc(sizeof (*iovp) * iovcnt)) == NULL) { | |
perror("malloc"); | |
exit(1); | |
} | |
next_iovp = iovp; | |
/* put the header into iov first */ | |
next_iovp->iov_base = &header; | |
next_iovp->iov_len = sizeof (header); | |
next_iovp++; | |
/* | |
* Now put each arg in, following it with the string "\n". | |
* Calculate a total character count in header.len along the way. | |
*/ | |
header.len = 0; | |
for (int arg = 2; arg < argc; arg++) { | |
/* add the string given */ | |
next_iovp->iov_base = argv[arg]; | |
next_iovp->iov_len = strlen(argv[arg]); | |
header.len += next_iovp->iov_len; | |
next_iovp++; | |
/* add the newline */ | |
next_iovp->iov_base = "\n"; | |
next_iovp->iov_len = 1; | |
header.len += 1; | |
next_iovp++; | |
} | |
/* atomically add it all to the log */ | |
if (pmemlog_appendv(plp, iovp, iovcnt) < 0) { | |
perror("pmemlog_appendv"); | |
exit(1); | |
} | |
pmemlog_close(plp); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2014, Intel Corporation | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* * Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in | |
* the documentation and/or other materials provided with the | |
* distribution. | |
* | |
* * Neither the name of Intel Corporation nor the names of its | |
* contributors may be used to endorse or promote products derived | |
* from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
/* | |
* info prepended to each log entry... | |
*/ | |
struct logentry { | |
size_t len; /* length of the rest of the log entry */ | |
time_t timestamp; | |
pid_t pid; | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2014, Intel Corporation | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* * Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in | |
* the documentation and/or other materials provided with the | |
* distribution. | |
* | |
* * Neither the name of Intel Corporation nor the names of its | |
* contributors may be used to endorse or promote products derived | |
* from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
/* | |
* manpage.c -- simple example for the libpmemlog man page | |
*/ | |
#include <stdio.h> | |
#include <fcntl.h> | |
#include <errno.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <string.h> | |
#include <libpmemlog.h> | |
/* size of the pmemlog pool -- 1 GB */ | |
#define POOL_SIZE ((off_t)(1 << 30)) | |
/* | |
* printit -- log processing callback for use with pmemlog_walk() | |
*/ | |
int | |
printit(const void *buf, size_t len, void *arg) | |
{ | |
fwrite(buf, len, 1, stdout); | |
return 0; | |
} | |
int | |
main(int argc, char *argv[]) | |
{ | |
const char path[] = "/pmem-fs/myfile"; | |
PMEMlogpool *plp; | |
size_t nbyte; | |
char *str; | |
/* create the pmemlog pool or open it if it already exists */ | |
plp = pmemlog_create(path, POOL_SIZE, 0666); | |
if (plp == NULL) | |
plp = pmemlog_open(path); | |
if (plp == NULL) { | |
perror(path); | |
exit(1); | |
} | |
/* how many bytes does the log hold? */ | |
nbyte = pmemlog_nbyte(plp); | |
printf("log holds %zu bytes\n", nbyte); | |
/* append to the log... */ | |
str = "This is the first string appended\n"; | |
if (pmemlog_append(plp, str, strlen(str)) < 0) { | |
perror("pmemlog_append"); | |
exit(1); | |
} | |
str = "This is the second string appended\n"; | |
if (pmemlog_append(plp, str, strlen(str)) < 0) { | |
perror("pmemlog_append"); | |
exit(1); | |
} | |
/* print the log contents */ | |
printf("log contains:\n"); | |
pmemlog_walk(plp, 0, printit, NULL); | |
pmemlog_close(plp); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (c) 2014, Intel Corporation | |
* | |
* Redistribution and use in source and binary forms, with or without | |
* modification, are permitted provided that the following conditions | |
* are met: | |
* | |
* * Redistributions of source code must retain the above copyright | |
* notice, this list of conditions and the following disclaimer. | |
* | |
* * Redistributions in binary form must reproduce the above copyright | |
* notice, this list of conditions and the following disclaimer in | |
* the documentation and/or other materials provided with the | |
* distribution. | |
* | |
* * Neither the name of Intel Corporation nor the names of its | |
* contributors may be used to endorse or promote products derived | |
* from this software without specific prior written permission. | |
* | |
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY LOG OF THE USE | |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
*/ | |
/* | |
* printlog -- given a log file, print the entries | |
* | |
* Usage: | |
* printlog [-t] /path/to/pm-aware/file | |
* | |
* -t option means truncate the file after printing it. | |
*/ | |
#include <stdio.h> | |
#include <fcntl.h> | |
#include <time.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <unistd.h> | |
#include <libpmemlog.h> | |
#include "logentry.h" | |
/* | |
* printlog -- callback function called when walking the log | |
*/ | |
int | |
printlog(const void *buf, size_t len, void *arg) | |
{ | |
const void *endp = buf + len; /* first byte after log contents */ | |
/* for each entry in the log... */ | |
while (buf < endp) { | |
struct logentry *headerp = (struct logentry *)buf; | |
buf += sizeof (struct logentry); | |
/* print the header */ | |
printf("Entry from pid: %ld\n", (long)headerp->pid); | |
printf(" Created: %s", ctime(&headerp->timestamp)); | |
printf(" Contents:\n"); | |
/* print the log data itself */ | |
fwrite(buf, headerp->len, 1, stdout); | |
buf += headerp->len; | |
} | |
return 0; | |
} | |
int | |
main(int argc, char *argv[]) | |
{ | |
int opt; | |
int tflag = 0; | |
PMEMlogpool *plp; | |
while ((opt = getopt(argc, argv, "t")) != -1) | |
switch (opt) { | |
case 't': | |
tflag = 1; | |
break; | |
default: | |
fprintf(stderr, "usage: %s [-t] file\n", argv[0]); | |
exit(1); | |
} | |
if (optind >= argc) { | |
fprintf(stderr, "usage: %s [-t] file\n", argv[0]); | |
exit(1); | |
} | |
const char *path = argv[optind]; | |
if ((plp = pmemlog_open(path)) == NULL) { | |
perror(path); | |
exit(1); | |
} | |
/* the rest of the work happens in printlog() above */ | |
pmemlog_walk(plp, 0, printlog, NULL); | |
if (tflag) | |
pmemlog_rewind(plp); | |
pmemlog_close(plp); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment