Skip to content

Commit 28866c9

Browse files
committed
Uncomment fstat, lstat. Workaround for relink
1 parent aade923 commit 28866c9

File tree

3 files changed

+53
-17
lines changed

3 files changed

+53
-17
lines changed

splitfs/fileops_hub.c

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,7 +1512,7 @@ RETT_TRUNC _hub_TRUNC(INTF_TRUNC)
15121512
return result;
15131513
}
15141514

1515-
/*
1515+
15161516
RETT_STAT _hub_STAT(INTF_STAT)
15171517
{
15181518
CHECK_RESOLVE_FILEOPS(_hub_);
@@ -1544,7 +1544,23 @@ RETT_LSTAT64 _hub_LSTAT64(INTF_LSTAT64)
15441544
result = _hub_managed_fileops->LSTAT64(CALL_LSTAT64);
15451545
return result;
15461546
}
1547-
*/
1547+
1548+
RETT_LSTAT64 _hub_FSTAT64(INTF_FSTAT64)
1549+
{
1550+
CHECK_RESOLVE_FILEOPS(_hub_);
1551+
RETT_LSTAT64 result;
1552+
result = _hub_managed_fileops->FSTAT64(CALL_FSTAT64);
1553+
return result;
1554+
}
1555+
1556+
RETT_LSTAT64 _hub_FSTAT(INTF_FSTAT)
1557+
{
1558+
CHECK_RESOLVE_FILEOPS(_hub_);
1559+
RETT_LSTAT64 result;
1560+
result = _hub_managed_fileops->FSTAT(CALL_FSTAT);
1561+
return result;
1562+
}
1563+
15481564

15491565
/*
15501566
RETT_CLONE _hub_CLONE(INTF_CLONE)

splitfs/fileops_nvp.c

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ static inline void create_dr_mmap(struct NVNode *node, int is_overwrite)
202202
assert(0);
203203
}
204204

205-
fstat(dr_fd, &stat_buf);
205+
_nvp_fileops->STAT(_STAT_VER, dr_fd, &stat_buf);
206206

207207
if (is_overwrite) {
208208
node->dr_over_info.dr_fd = dr_fd;
@@ -1325,7 +1325,7 @@ void _nvp_init2(void)
13251325
dr_fd, //fd_with_max_perms,
13261326
0
13271327
);
1328-
fstat(dr_fd, &stat_buf);
1328+
_hub_find_fileop("posix")->FSTAT(_STAT_VER, dr_fd, &stat_buf);
13291329
free_pool_mmaps[i].dr_serialno = stat_buf.st_ino;
13301330
free_pool_mmaps[i].dr_fd = dr_fd;
13311331
free_pool_mmaps[i].valid_offset = 0;
@@ -1403,7 +1403,7 @@ void _nvp_init2(void)
14031403
dr_fd, //fd_with_max_perms,
14041404
0
14051405
);
1406-
fstat(dr_fd, &stat_buf);
1406+
_hub_find_fileop("posix")->FSTAT(_STAT_VER, dr_fd, &stat_buf);
14071407
free_pool_mmaps[i].dr_serialno = stat_buf.st_ino;
14081408
free_pool_mmaps[i].dr_fd = dr_fd;
14091409
free_pool_mmaps[i].valid_offset = 0;
@@ -2591,7 +2591,7 @@ static int nvp_get_over_dr_address(struct NVFile *nvf,
25912591

25922592
DEBUG_FILE("%s: Setting offset_start to DR_SIZE. FD = %d\n",
25932593
__func__, nvf->fd);
2594-
fstat(dr_fd, &stat_buf);
2594+
_nvp_fileops->FSTAT(_STAT_VER, dr_fd, &stat_buf);
25952595
nvf->node->dr_over_info.dr_serialno = stat_buf.st_ino;
25962596
nvf->node->dr_over_info.dr_fd = dr_fd;
25972597
nvf->node->dr_over_info.valid_offset = 0;
@@ -2831,7 +2831,7 @@ static int nvp_get_dr_mmap_address(struct NVFile *nvf, off_t offset,
28312831

28322832
DEBUG_FILE("%s: Setting offset_start to DR_SIZE. FD = %d\n",
28332833
__func__, nvf->fd);
2834-
fstat(dr_fd, &stat_buf);
2834+
_nvp_fileops->STAT(_STAT_VER, dr_fd, &stat_buf);
28352835
nvf->node->dr_info.dr_serialno = stat_buf.st_ino;
28362836
nvf->node->dr_info.dr_fd = dr_fd;
28372837
nvf->node->dr_info.valid_offset = 0;
@@ -4019,6 +4019,18 @@ RETT_CLOSE _nvp_REAL_CLOSE(INTF_CLOSE, ino_t serialno, int async_file_closing) {
40194019
nvf->node->reference--;
40204020
NVP_UNLOCK_NODE_WR(nvf);
40214021

4022+
// FIXME: This is a workaround for corner case bug in relink.
4023+
#if WORKLOAD_ROCKSDB
4024+
struct stat sbuf;
4025+
if(_nvp_fileops->FSTAT(_STAT_VER, file, &sbuf) != 0) {
4026+
perror("Failed to stat file");
4027+
}
4028+
if(sbuf.st_size != nvf->node->length) {
4029+
MSG("File size mismatch. Expected = %d; Actual = %d. Truncating explicitly as a workaround\n", nvf->node->length, sbuf.st_size);
4030+
_nvp_FTRUNC(file, nvf->node->length);
4031+
}
4032+
#endif
4033+
40224034
if (nvf->node->reference == 0) {
40234035
nvf->node->serialno = 0;
40244036
push_in_stack(1, 0, nvf->node->index_in_free_list, node_list_idx);
@@ -5737,6 +5749,16 @@ RETT_FTRUNC64 _nvp_FTRUNC64(INTF_FTRUNC64)
57375749
TBL_ENTRY_UNLOCK_WR(tbl_app);
57385750
NVP_UNLOCK_NODE_WR(nvf);
57395751
NVP_UNLOCK_FD_RD(nvf, cpuid);
5752+
#if WORKLOAD_ROCKSDB
5753+
struct stat sbuf;
5754+
if(_nvp_fileops->FSTAT(_STAT_VER, file, &sbuf) != 0) {
5755+
perror("Failed to stat file");
5756+
}
5757+
if(sbuf.st_size != nvf->node->length) {
5758+
MSG("FTRUNC: File size mismatch. Expected = %d; Actual = %d. Truncating explicitly as a workaround\n", nvf->node->length, sbuf.st_size);
5759+
_nvp_fileops->FTRUNC(file, nvf->node->length);
5760+
}
5761+
#endif
57405762
return 0;
57415763
}
57425764

@@ -6498,7 +6520,7 @@ RETT_MKDIRAT _nvp_MKDIRAT(INTF_MKDIRAT)
64986520
}
64996521

65006522

6501-
/*
6523+
65026524
RETT_STAT _nvp_STAT(INTF_STAT)
65036525
{
65046526
RETT_STAT result = 0;
@@ -6532,7 +6554,6 @@ RETT_STAT64 _nvp_STAT64(INTF_STAT64)
65326554
result = _nvp_fileops->STAT64(CALL_STAT64);
65336555
struct NVFile *nvf = NULL;
65346556
int cpuid = GET_CPUID();
6535-
assert(0);
65366557
pthread_spin_lock(&node_lookup_lock[0]);
65376558
if (_nvp_ino_lookup[buf->st_ino % 1024] != 0) {
65386559
int fd = _nvp_ino_lookup[buf->st_ino % 1024];
@@ -6561,14 +6582,13 @@ RETT_LSTAT64 _nvp_LSTAT64(INTF_LSTAT64)
65616582
{
65626583
return _nvp_STAT64(CALL_STAT64);
65636584
}
6564-
6585+
65656586
RETT_FSTAT _nvp_FSTAT(INTF_FSTAT)
65666587
{
65676588
RETT_FSTAT result = 0;
65686589
result = _nvp_fileops->FSTAT(CALL_FSTAT);
65696590
struct NVFile *nvf = NULL;
65706591
int cpuid = GET_CPUID();
6571-
assert(0);
65726592
nvf = &_nvp_fd_lookup[file];
65736593
NVP_LOCK_FD_RD(nvf, cpuid);
65746594
if (nvf->posix) {
@@ -6599,7 +6619,7 @@ RETT_FSTAT64 _nvp_FSTAT64(INTF_FSTAT64)
65996619
NVP_UNLOCK_FD_RD(nvf, cpuid);
66006620
return result;
66016621
}
6602-
*/
6622+
66036623

66046624
/* Before doing an fallocate we do an fsync
66056625
*
@@ -6634,7 +6654,7 @@ RETT_POSIX_FALLOCATE _nvp_POSIX_FALLOCATE(INTF_POSIX_FALLOCATE)
66346654

66356655
result = _nvp_fileops->POSIX_FALLOCATE(CALL_POSIX_FALLOCATE);
66366656

6637-
int ret = fstat(file, &sbuf);
6657+
int ret = _nvp_fileops->FSTAT(_STAT_VER, file, &sbuf);
66386658
assert(ret == 0);
66396659
nvf->node->true_length = sbuf.st_size;
66406660
nvf->node->length = nvf->node->true_length;
@@ -6676,7 +6696,7 @@ RETT_POSIX_FALLOCATE64 _nvp_POSIX_FALLOCATE64(INTF_POSIX_FALLOCATE64)
66766696

66776697
result = _nvp_fileops->POSIX_FALLOCATE64(CALL_POSIX_FALLOCATE64);
66786698

6679-
int ret = fstat(file, &sbuf);
6699+
int ret = _nvp_fileops->FSTAT(_STAT_VER, file, &sbuf);
66806700
assert(ret == 0);
66816701
nvf->node->true_length = sbuf.st_size;
66826702
nvf->node->length = nvf->node->true_length;
@@ -6694,7 +6714,7 @@ RETT_POSIX_FALLOCATE64 _nvp_POSIX_FALLOCATE64(INTF_POSIX_FALLOCATE64)
66946714
RETT_FALLOCATE _nvp_FALLOCATE(INTF_FALLOCATE)
66956715
{
66966716
CHECK_RESOLVE_FILEOPS(_nvp_);
6697-
RETT_FALLOCATE result = 0;
6717+
RETT_FALLOCATE result = -1;
66986718
struct stat sbuf;
66996719

67006720
struct NVFile *nvf = &_nvp_fd_lookup[file];
@@ -6718,7 +6738,7 @@ RETT_FALLOCATE _nvp_FALLOCATE(INTF_FALLOCATE)
67186738

67196739
result = _nvp_fileops->FALLOCATE(CALL_FALLOCATE);
67206740

6721-
int ret = fstat(file, &sbuf);
6741+
int ret = _nvp_fileops->FSTAT(_STAT_VER, file, &sbuf);
67226742
assert(ret == 0);
67236743
nvf->node->true_length = sbuf.st_size;
67246744
nvf->node->length = nvf->node->true_length;

splitfs/nv_common.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ int execv_done;
8484
#define OPS_64 OPS_FINITEPARAMS (OPEN64)
8585

8686
#ifdef TRACE_FP_CALLS
87-
#define ALLOPS_FINITEPARAMS_WPAREN (POSIX_FALLOCATE) (POSIX_FALLOCATE64) (FALLOCATE) (READ) (FREAD) (CLEARERR) (FEOF) (FERROR) (FREAD_UNLOCKED) (WRITE) (FWRITE) (FSEEK) (FTELL) (FTELLO) (CLOSE) (FCLOSE) (SEEK) (FTRUNC) (DUP) (DUP2) (FORK) (VFORK) (READV) (WRITEV) (PIPE) (SOCKETPAIR) OPS_FINITEPARAMS_64 (PREAD) (PWRITE) (FSYNC) (FDSYNC) (SOCKET) (ACCEPT) (UNLINK) (UNLINKAT) (SYNC_FILE_RANGE)
87+
#define ALLOPS_FINITEPARAMS_WPAREN (POSIX_FALLOCATE) (POSIX_FALLOCATE64) (FALLOCATE) (READ) (FREAD) (CLEARERR) (FEOF) (FERROR) (FREAD_UNLOCKED) (WRITE) (FWRITE) (FSEEK) (FTELL) (FTELLO) (CLOSE) (FCLOSE) (SEEK) (FTRUNC) (DUP) (DUP2) (FORK) (VFORK) (READV) (WRITEV) (PIPE) (SOCKETPAIR) OPS_FINITEPARAMS_64 (PREAD) (PWRITE) (FSYNC) (FDSYNC) (SOCKET) (ACCEPT) (UNLINK) (UNLINKAT) (SYNC_FILE_RANGE) (STAT) (STAT64) (FSTAT) (FSTAT64) (LSTAT) (LSTAT64)
8888
//(POSIX_FALLOCATE) (POSIX_FALLOCATE64) (FALLOCATE) (STAT) (STAT64) (FSTAT) (FSTAT64) (LSTAT) (LSTAT64)
8989
#define ALLOPS_WPAREN (OPEN) (OPENAT) (CREAT) (EXECVE) (EXECVP) (EXECV) (FOPEN) (FOPEN64) (IOCTL) (TRUNC) (MKNOD) (MKNODAT) (FCNTL) ALLOPS_FINITEPARAMS_WPAREN
9090
#define SHM_WPAREN (SHM_COPY)

0 commit comments

Comments
 (0)