Skip to content

Commit a2bb9bc

Browse files
committed
Fix #229
1 parent a258e59 commit a2bb9bc

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

monoio/src/driver/uring/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,8 @@ impl Drop for IoUringDriver {
583583

584584
impl Drop for UringInner {
585585
fn drop(&mut self) {
586+
// no need to wait for completion, as the kernel will clean up the ring asynchronically.
587+
let _ = self.uring.submitter().submit();
586588
unsafe {
587589
ManuallyDrop::drop(&mut self.uring);
588590
}

monoio/tests/fs_file.rs

+31-8
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ async fn read_hello(file: &File) {
2222
async fn basic_read() {
2323
let mut tempfile = tempfile();
2424
tempfile.write_all(HELLO).unwrap();
25+
tempfile.as_file_mut().sync_data().unwrap();
2526

2627
let file = File::open(tempfile.path()).await.unwrap();
2728
read_hello(&file).await;
@@ -31,6 +32,7 @@ async fn basic_read() {
3132
async fn basic_read_exact() {
3233
let mut tempfile = tempfile();
3334
tempfile.write_all(HELLO).unwrap();
35+
tempfile.as_file_mut().sync_data().unwrap();
3436

3537
let file = File::open(tempfile.path()).await.unwrap();
3638
let buf = Vec::with_capacity(HELLO.len());
@@ -49,6 +51,7 @@ async fn basic_write() {
4951

5052
let file = File::create(tempfile.path()).await.unwrap();
5153
file.write_at(HELLO, 0).await.0.unwrap();
54+
file.sync_all().await.unwrap();
5255

5356
let file = std::fs::read(tempfile.path()).unwrap();
5457
assert_eq!(file, HELLO);
@@ -60,6 +63,7 @@ async fn basic_write_all() {
6063

6164
let file = File::create(tempfile.path()).await.unwrap();
6265
file.write_all_at(HELLO, 0).await.0.unwrap();
66+
file.sync_all().await.unwrap();
6367

6468
let file = std::fs::read(tempfile.path()).unwrap();
6569
assert_eq!(file, HELLO);
@@ -69,6 +73,7 @@ async fn basic_write_all() {
6973
async fn cancel_read() {
7074
let mut tempfile = tempfile();
7175
tempfile.write_all(HELLO).unwrap();
76+
tempfile.as_file_mut().sync_data().unwrap();
7277

7378
let file = File::open(tempfile.path()).await.unwrap();
7479

@@ -82,6 +87,7 @@ async fn cancel_read() {
8287
async fn explicit_close() {
8388
let mut tempfile = tempfile();
8489
tempfile.write_all(HELLO).unwrap();
90+
tempfile.as_file_mut().sync_data().unwrap();
8591

8692
let file = File::open(tempfile.path()).await.unwrap();
8793
#[cfg(unix)]
@@ -91,7 +97,7 @@ async fn explicit_close() {
9197

9298
file.close().await.unwrap();
9399

94-
assert_invalid_fd(fd);
100+
assert_invalid_fd(fd, tempfile.as_file().metadata().unwrap());
95101
}
96102

97103
#[monoio::test_all]
@@ -101,6 +107,7 @@ async fn drop_open() {
101107
// Do something else
102108
let file_w = File::create(tempfile.path()).await.unwrap();
103109
file_w.write_at(HELLO, 0).await.0.unwrap();
110+
file_w.sync_all().await.unwrap();
104111

105112
let file = std::fs::read(tempfile.path()).unwrap();
106113
assert_eq!(file, HELLO);
@@ -125,7 +132,7 @@ fn drop_off_runtime() {
125132
let fd = file.as_raw_handle();
126133
drop(file);
127134

128-
assert_invalid_fd(fd);
135+
assert_invalid_fd(fd, tempfile.as_file().metadata().unwrap());
129136
}
130137

131138
#[monoio::test_all]
@@ -158,13 +165,29 @@ async fn poll_once(future: impl std::future::Future) {
158165
.await;
159166
}
160167

161-
fn assert_invalid_fd(fd: RawFd) {
168+
fn assert_invalid_fd(fd: RawFd, base: std::fs::Metadata) {
162169
use std::fs::File;
163170
#[cfg(unix)]
164-
let mut f = unsafe { File::from_raw_fd(fd) };
171+
let f = unsafe { File::from_raw_fd(fd) };
165172
#[cfg(windows)]
166-
let mut f = unsafe { File::from_raw_handle(fd) };
167-
let mut buf = vec![];
168-
169-
assert!(f.read_to_end(&mut buf).is_err());
173+
let f = unsafe { File::from_raw_handle(fd) };
174+
175+
let meta = f.metadata();
176+
std::mem::forget(f);
177+
178+
if let Ok(meta) = meta {
179+
if !meta.is_file() {
180+
return;
181+
}
182+
183+
#[cfg(unix)]
184+
{
185+
use std::os::unix::fs::MetadataExt;
186+
let inode = meta.ino();
187+
let actual = base.ino();
188+
if inode == actual {
189+
panic!();
190+
}
191+
}
192+
}
170193
}

0 commit comments

Comments
 (0)