ray/src/plasma.h

149 lines
4.5 KiB
C
Raw Normal View History

2016-08-13 17:11:11 -07:00
#ifndef PLASMA_H
#define PLASMA_H
#include <inttypes.h>
#include <stdio.h>
#include <errno.h>
#include <stddef.h>
2016-08-13 17:11:11 -07:00
#include <string.h>
#include "uthash.h"
2016-08-17 12:54:34 -07:00
#ifdef NDEBUG
#define LOG_DEBUG(M, ...)
2016-08-17 12:54:34 -07:00
#else
#define LOG_DEBUG(M, ...) \
fprintf(stderr, "[DEBUG] (%s:%d) " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)
2016-08-17 12:54:34 -07:00
#endif
#ifdef PLASMA_LOGGIN_ON
#define LOG_INFO(M, ...) \
fprintf(stderr, "[INFO] (%s:%d) " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)
#else
#define LOG_INFO(M, ...)
#endif
#define LOG_ERR(M, ...) \
fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, \
errno == 0 ? "None" : strerror(errno), ##__VA_ARGS__)
2016-08-13 17:11:11 -07:00
#define PLASMA_CHECK(CONDITION, M, ...) \
do { \
if (!(CONDITION)) { \
fprintf(stderr, "[FATAL] (%s:%d " #CONDITION ") \n" M, __FILE__, \
__LINE__); \
exit(-1); \
} \
} while (0)
2016-08-13 17:11:11 -07:00
typedef struct {
int64_t data_size;
int64_t metadata_size;
2016-08-13 17:11:11 -07:00
int64_t create_time;
int64_t construct_duration;
} plasma_object_info;
/** Represents an object ID hash, can hold a full SHA1 hash. */
typedef struct { unsigned char id[20]; } plasma_id;
2016-08-13 17:11:11 -07:00
enum plasma_request_type {
/** Create a new object. */
PLASMA_CREATE,
/** Get an object. */
PLASMA_GET,
/** Check if an object is present. */
PLASMA_CONTAINS,
/** Seal an object. */
PLASMA_SEAL,
/** Delete an object. */
PLASMA_DELETE,
/** Request transfer to another store. */
PLASMA_TRANSFER,
/** Header for sending data. */
PLASMA_DATA,
2016-08-13 17:11:11 -07:00
};
typedef struct {
/** The type of the request. */
2016-08-13 17:11:11 -07:00
int type;
/** The ID of the object that the request is about. */
2016-08-13 17:11:11 -07:00
plasma_id object_id;
/** The size of the object's data. */
int64_t data_size;
/** The size of the object's metadata. */
int64_t metadata_size;
/** In a transfer request, this is the IP address of the Plasma Manager to
* transfer the object to. */
2016-08-15 16:41:22 -07:00
uint8_t addr[4];
/** In a transfer request, this is the port of the Plasma Manager to transfer
* the object to. */
2016-08-15 16:41:22 -07:00
int port;
2016-08-13 17:11:11 -07:00
} plasma_request;
typedef struct {
/** The offset in bytes in the memory mapped file of the data. */
ptrdiff_t data_offset;
/** The offset in bytes in the memory mapped file of the metadata. */
ptrdiff_t metadata_offset;
/** The size in bytes of the memory mapped file. */
int64_t map_size;
/** The size in bytesof the data. */
int64_t data_size;
/** The size in bytes of the metadata. */
int64_t metadata_size;
/** This is used only to respond to requests of type PLASMA_CONTAINS. It is 1
* if the object is present and 0 otherwise. Used for plasma_contains. */
int has_object;
/** The file descriptor of the memory mapped file in the store. */
int store_fd_val;
2016-08-13 17:11:11 -07:00
} plasma_reply;
typedef struct {
plasma_id object_id;
uint8_t *data;
int64_t data_size;
uint8_t *metadata;
int64_t metadata_size;
2016-08-13 17:11:11 -07:00
int writable;
} plasma_buffer;
typedef struct {
/** Key that uniquely identifies the memory mapped file. In practice, we
* take the numerical value of the file descriptor in the object store. */
int key;
/** The result of mmap for this file descriptor. */
uint8_t *pointer;
/** Handle for the uthash table. */
UT_hash_handle hh;
} client_mmap_table_entry;
/** Information about a connection between a Plasma Client and Plasma Store.
* This is used to avoid mapping the same files into memory multiple times. */
typedef struct {
/** File descriptor of the Unix domain socket that connects to the store. */
int conn;
/** Table of dlmalloc buffer files that have been memory mapped so far. */
client_mmap_table_entry *mmap_table;
} plasma_store_conn;
/**
* This is used by the Plasma Client to send a request to the Plasma Store or
* the Plasma Manager.
*
* @param conn The file descriptor to use to send the request.
* @param req The address of the request to send.
* @return Void.
*/
void plasma_send_request(int conn, plasma_request *req);
/**
* This is used by the Plasma Store to send a reply to the Plasma Client.
*
* @param conn The file descriptor to use to send the reply.
* @param req The address of the reply to send.
* @return Void.
*/
void plasma_send_reply(int conn, plasma_reply *req);
2016-08-17 12:54:34 -07:00
2016-08-13 17:11:11 -07:00
#endif