Plasma Note

本文介绍一个使用共享存储的本地 store library plasma

使用

  1. plasma_delete

使用该函数时需要确保对应的 object 确实保存了且进行了 seal 操作否则会出错。所以在进行 delete 操作之前,需要先使用 plasma_contains 去判断该 object 是否存在且 sealed。

1
2
3
4
int flag = 0;
plasma_contains(conn, id, &flag);
if (flag)
  plasma_delete(conn, id);

source code note

内存的申请

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* Create a buffer. This is creating a temporary file and then
 * immediately unlinking it so we do not leave traces in the system. */
int create_buffer(int64_t size) {
  static char template[] = "/tmp/plasmaXXXXXX";
  char file_name[32];
  strncpy(file_name, template, 32);
  int fd = mkstemp(file_name);
  if (fd < 0)
    return -1;
  FILE *file = fdopen(fd, "a+");
  if (!file) {
    close(fd);
    return -1;
  }
  if (unlink(file_name) != 0) {
    LOG_ERR("unlink error");
    return -1;
  }
  if (ftruncate(fd, (off_t) size) != 0) {
    LOG_ERR("ftruncate error");
    return -1;
  }
  return fd;
}

在 plasma 中内存块的申请是通过创建临时文件的形式,由于 linux 单个进程允许打开的最大 fd 数量一般为 10240。 所以其最大创建的次数为 10240 - 3 (有三个默认的 fd 已打开).

add pwrite function

在 plasma 上增加 linux 函数 pwrite 的功能,即支持对对象进行按一定位移去写数据,空的位置写上空值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
  char buf[20] = {0};
  int fd = open("test.txt", O_WRONLY | O_CREAT, 0640);
  // pread(fd,buf,5,2); //10表示要读的字节数,2表示偏移量
  // printf("buf=%s\n",buf);

  char str[10] = "12345";
  // pwrite(fd,str,3,5);//3表示要写入的字节数,2表示偏移量

  close(fd);
  return 0;
}

updatedupdated2022-07-182022-07-18