@@ -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+
65026524RETT_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+
65656586RETT_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)
66946714RETT_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 ;
0 commit comments