Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/global.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ unsigned long flush_bands;
unsigned long flush_band_size;
unsigned long flush_fifo_blocks;
unsigned long flush_ssd_blocks;
unsigned long flush_ssd_zones;
//unsigned long write-fifo-num;
//unsigned long write-ssd-num;
unsigned long flush_fifo_times;
Expand Down
5 changes: 3 additions & 2 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ main(int argc, char **argv)
"../trace/stg_0.csv.req",
"../trace/ts_0.csv.req",
"../trace/usr_0.csv.req",
"../trace/wdev_0.csv.req",
"../trace/web_0.csv.req"};
"/home/trace/MS-Cambridge/wdev_0.csv.req",
"../trace/web_0.csv.req",
"/home/test.txt"};

if (argc == 8) {
NSSDBuffers = atoi(argv[1]);
Expand Down
172 changes: 80 additions & 92 deletions src/ssd-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ initSSDBuffer()
read_ssd_blocks = 0;
time_read_ssd = 0.0;
time_write_ssd = 0.0;
read_hit_num;
read_hit_num = 0;
flush_ssd_zones = 0;
}

void *
Expand All @@ -63,14 +64,15 @@ flushSSDBuffer(SSDBufferDesc * ssd_buf_hdr)
SSD_BUFFER_SIZE = BNDSZ;
BLCKSZ = BNDSZ;
}
returnCode = posix_memalign(&ssd_buffer, 512, sizeof(char) * BLCKSZ);
returnCode = posix_memalign(&ssd_buffer,512,sizeof(char)*SSD_BUFFER_SIZE);
if (returnCode < 0) {
printf("[ERROR] flushSSDBuffer():--------posix memalign\n");
free(ssd_buffer);
exit(-1);
}
gettimeofday(&tv_begin_temp, &tz_begin_temp);
time_begin_temp = tv_begin_temp.tv_sec + tv_begin_temp.tv_usec / 1000000.0;
time_begin_temp = tv_begin_temp.tv_sec + tv_begin_temp.tv_usec / 1000000.0;
returnCode = pread(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE);
if (returnCode < 0) {
printf("[ERROR] flushSSDBuffer():-------read from ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE);
Expand Down Expand Up @@ -322,103 +324,89 @@ write_block(off_t offset, char *ssd_buffer)
ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID | SSD_BUF_DIRTY;
}
}
void
read_band(off_t offset, char *ssd_buffer)

void read_band(off_t offset, char *ssd_buffer, char *zone_buffer)
{
if (BandOrBlock == 1) {
SSD_BUFFER_SIZE = BNDSZ;
}
printf("enter read_band\n");
void *ssd_buf_block;
bool found = 0;
int returnCode;
printf("read_band\n");
void *ssd_buf_block;
bool found = 0;
int returnCode;

static SSDBufferTag ssd_buf_tag;
static SSDBufferDesc *ssd_buf_hdr;
static SSDBufferTag ssd_buf_tag;
static SSDBufferDesc *ssd_buf_hdr;

ssd_buf_tag.offset = offset / ZONESZ * ZONESZ;
if (DEBUG)
printf("[INFO] read band():-------band offset=%lu\n", ssd_buf_tag.offset);

ssd_buf_hdr = SSDBufferAlloc(ssd_buf_tag, &found);
if (found) {
read_ssd_blocks++;
returnCode = pread(ssd_fd, ssd_buffer, BLCKSZ, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE + offset - ssd_buf_tag.offset);
if (returnCode < 0) {
printf("[ERROR] read():-------read from smr: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
} else {
returnCode = smrread(smr_fd, zone_buffer, ZONESZ, ssd_buf_tag.offset);
flush_ssd_blocks++;
returnCode = pwrite(ssd_fd, zone_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE);
if(returnCode < 0) {
printf("[ERROR]read():-------write to ssd: fd=%d, errorcode=%d,offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
returnCode = fsync(ssd_fd);
if(returnCode < 0){
printf("[ERROR] read band():------------fsync\n");
exit(-1);
}
}
ssd_buf_hdr->ssd_buf_flag &= ~SSD_BUF_VALID;
ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID;

ssd_buf_tag.offset = offset;
static SSDBufferTag band_tag;
band_tag.offset = (offset / BNDSZ);
static SSDBufferTag hdr_tag;
hdr_tag.offset = (band_tag.offset) * BNDSZ;
size_t new_offset = offset - hdr_tag.offset;
char *band_buffer;
returnCode = posix_memalign(&band_buffer, 512, sizeof(char) * BNDSZ);
if (returnCode < 0) {
printf("[ERROR] read_band():-------posix_memalign\n");
exit(-1);
}
printf("readband_tag%ld\n", band_tag.offset);
if (DEBUG)
printf("[INFO] read():-------offset=%lu\n", offset);
ssd_buf_hdr = SSDBufferAlloc(hdr_tag, &found);
if (found) {
returnCode = pread(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE + new_offset);
if (returnCode < 0) {
printf("[ERROR] read():-------read from smr: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
} else {
returnCode = smrread(smr_fd, band_buffer, BNDSZ, hdr_tag.offset);
//returnCode = pread(smr_fd, ssd_buffer, SSD_BUFFER_SIZE, offset);
if (returnCode < 0) {
printf("[ERROR] read():-------read from smr: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
flush_ssd_blocks++;
returnCode = pwrite(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE);
returnCode = pwrite(ssd_fd, band_buffer, BNDSZ, ssd_buf_hdr->ssd_buf_id * BNDSZ);
if (returnCode < 0) {
printf("[ERROR] read():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
}
ssd_buf_hdr->ssd_buf_flag &= ~SSD_BUF_VALID;
ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID;
}
void
write_band(off_t offset, char *ssd_buffer)
{
if (BandOrBlock == 1) {
SSD_BUFFER_SIZE = BNDSZ;
}
void *ssd_buf_block;
bool found;
int returnCode;

static SSDBufferTag ssd_buf_tag;
static SSDBufferDesc *ssd_buf_hdr;
void write_band(off_t offset, char *ssd_buffer, char *zone_buffer)
{
void *ssd_buf_block;
bool found;
int returnCode;

ssd_buf_tag.offset = offset;
static SSDBufferTag band_tag;
band_tag.offset = (offset / BNDSZ);
static SSDBufferTag hdr_tag;
hdr_tag.offset = (band_tag.offset) * BNDSZ;
size_t new_offset = offset - hdr_tag.offset;
char *band_buffer;
if (DEBUG)
printf("[INFO] write():-------offset=%lu\n", offset);
static SSDBufferTag ssd_buf_tag;
static SSDBufferDesc *ssd_buf_hdr;

returnCode = posix_memalign(&band_buffer, 512, sizeof(char) * BNDSZ);
if (returnCode < 0) {
printf("[ERROR] write_band():-------posix_memalign\n");
exit(-1);
}
ssd_buf_hdr = SSDBufferAlloc(hdr_tag, &found);
flush_ssd_blocks++;
if (flush_ssd_blocks % 10000 == 0)
printf("hit num:%lu flush_ssd_blocks:%lu flush_fifo_times:%lu flush_fifo_blocks:%lu flusd_bands:%lu\n ", hit_num, flush_ssd_blocks, flush_fifo_times, flush_fifo_blocks, flush_bands);
if (found) {
returnCode = pwrite(ssd_fd, ssd_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * BNDSZ + new_offset);
} else {
returnCode = smrread(smr_fd, band_buffer, BNDSZ, hdr_tag.offset);
ssd_buf_tag.offset = offset / ZONESZ * ZONESZ;
if (DEBUG)
printf("[INFO] write():-------offset=%lu\n", offset);

if (returnCode < 0) {
printf("[ERROR] write():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
memcpy(band_buffer + new_offset, ssd_buffer, BLCKSZ);
}
ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID | SSD_BUF_DIRTY;
ssd_buf_hdr = SSDBufferAlloc(ssd_buf_tag, &found);
if (found) {
flush_ssd_blocks++;
returnCode = pwrite(ssd_fd, ssd_buffer, BLCKSZ, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE + offset - ssd_buf_tag.offset);
if (returnCode < 0) {
printf("[ERROR] write():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
returnCode = fsync(ssd_fd);
if(returnCode < 0){
printf("[ERROR] write band():--------fsync\n");
exit(-1);
}
} else {
returnCode = smrread(smr_fd, zone_buffer, ZONESZ, ssd_buf_tag.offset);

if (returnCode < 0) {
printf("[ERROR] write():-------write to ssd: fd=%d, errorcode=%d, offset=%lu\n", ssd_fd, returnCode, offset);
exit(-1);
}
memcpy(zone_buffer + offset - ssd_buf_tag.offset, ssd_buffer, BLCKSZ);
flush_ssd_zones++;
if(flush_ssd_zones % 10000 == 0)
printf("flush_ssd_zones:%lu\n",flush_ssd_zones);
returnCode = pwrite(ssd_fd, zone_buffer, SSD_BUFFER_SIZE, ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE);
if(returnCode < 0) {
printf("[ERROR] write band():---------write to ssd: ssd_fd:%d, errorcode=%d, offset = %lu\n",ssd_fd, returnCode,ssd_buf_hdr->ssd_buf_id * SSD_BUFFER_SIZE);
}
}
ssd_buf_hdr->ssd_buf_flag |= SSD_BUF_VALID | SSD_BUF_DIRTY;
}
6 changes: 4 additions & 2 deletions src/ssd-cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,15 @@ typedef enum
} SSDEvictionStrategy;

extern size_t BNDSZ;
extern size_t ZONESZ;
extern int BandOrBlock;
extern SSDBufferDesc *ssd_buffer_descriptors;
extern SSDBufferHashBucket *ssd_buffer_hashtable;
extern SSDBufferStrategyControl *ssd_buffer_strategy_control;
extern unsigned long hit_num;
extern unsigned long flush_ssd_blocks;
extern unsigned long read_ssd_blocks;
extern unsigned long flush_ssd_zones;
extern double time_read_ssd;
extern double time_write_ssd;
extern double time_begin_temp;
Expand All @@ -74,8 +76,8 @@ extern unsigned long read_hit_num;
extern void initSSDBuffer();
extern void read_block(off_t offset, char* ssd_buffer);
extern void write_block(off_t offset, char* ssd_buffer);
extern void read_band(off_t offset, char* ssd_buffer);
extern void write_band(off_t offset, char* ssd_buffer);
extern void read_band(off_t offset, char* ssd_buffer, char *zone_buffer);
extern void write_band(off_t offset, char* ssd_buffer, char *zone_buffer);

//extern int read(unsigned offset);
//extern int write(unsigned offset);
Expand Down
2 changes: 1 addition & 1 deletion src/strategy/maxcold.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ typedef struct
unsigned char ischosen;
} BandDescForMaxColdNow;

extern size_t ZONESZ;
//extern size_t ZONESZ;
extern unsigned long NBANDTables;
extern unsigned long NSMRBands;
extern unsigned long PERIODTIMES;
Expand Down
12 changes: 10 additions & 2 deletions src/trace2call.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ trace_to_iocall(char *trace_file_path)
bool is_first_call = 1;
int i;
float size_float;
char *zone_buffer;

gettimeofday(&tv_begin, &tz_begin);
time_begin = tv_begin.tv_sec + tv_begin.tv_usec / 1000000.0;
Expand All @@ -39,6 +40,13 @@ trace_to_iocall(char *trace_file_path)
free(ssd_buffer);
exit(-1);
}
if(BandOrBlock == 1){
returnCode = posix_memalign(&zone_buffer,512,sizeof(char)*ZONESZ);
if(returnCode < 0){
printf("[ERROR] flushSSDBuffer():--------posix memalign\n");
exit(-1);
}
}
while (!feof(trace)) {
returnCode = fscanf(trace, "%c %d %lu\n", &action, &i, &offset);
if (returnCode < 0)
Expand Down Expand Up @@ -73,14 +81,14 @@ trace_to_iocall(char *trace_file_path)
if (BandOrBlock == 0)
write_block(offset, ssd_buffer);
else
write_band(offset, ssd_buffer);
write_band(offset, ssd_buffer, zone_buffer);
} else if (action == '0') {
if (DEBUG)
printf("[INFO] trace_to_iocall():--------read offset=%lu\n", offset);
//if (BandOrBlock == 0)
// read_block(offset, ssd_buffer);
//else
// read_band(offset, ssd_buffer);
// read_band(offset, ssd_buffer, zone_buffer);
}
offset += BLCKSZ;
size -= BLCKSZ;
Expand Down