Ticket UUID: | 93166ec5cc5b429090137e6d65a8fc9f3cf31118 | ||
Title: | disk I/O error on commit (AIX) | ||
Status: | Closed | Type: | Code_Defect |
Severity: | Severe | Priority: | |
Subsystem: | Resolution: | Not_A_Bug | |
Last Modified: | 2010-02-25 12:39:38 | ||
Version Found In: | 0f27a59808 | ||
Description & Comments: | |||
I have been getting a 'disk I/O error' when performing commits on an AIX system.
The error prevents the autosync-push from taking place. A manual push works just fine.
After a fair bit of tracking down, I found it is caused by the fsync(fd) call in unixDelete(). DBA0035:/home/dba0035/code/fossil-scm.org >fsl commit -m "where is> New_Version: ba79ed2621c11aad28ed30d6d3de9f922a5c445c dt: unixDelete(1) rc:0 zPath:/home/dba0035/code/fossil-scm.org/_FOSSIL_-mj544AAF 2B fd:7 dt: unixDelete(2) rc:1290 errno:9 fossil: disk I/O error COMMIT If you have recently updated your fossil executable, you might need to run "fossil all rebuild" to bring the repository schemas up to date. DBA0035:/home/dba0035/code/fossil-scm.org > Tracked using the following patch --- src/sqlite3.c +++ src/sqlite3.c @@ -25516,20 +25516,18 @@ unlink(zPath); #ifndef SQLITE_DISABLE_DIRSYNC if( dirSync ){ int fd; rc = openDirectory(zPath, &fd); +printf("dt: unixDelete(1) rc:%d zPath:%s fd:%d\n", rc, zPath, fd); if( rc==SQLITE_OK ){ #if OS_VXWORKS if( fsync(fd)==-1 ) #else if( fsync(fd) ) #endif { rc = SQLITE_IOERR_DIR_FSYNC; +printf("dt: unixDelete(2) rc:%d errno:%d\n", rc, errno); } if( close(fd)&&!rc ){ rc = SQLITE_IOERR_DIR_CLOSE; } } The errno of 9 is DBA0035:/usr/include >grep EBADF * errno.h:#define EBADF 9 /* Bad file descriptor */ To get around this I have applied the following patch to bypass the dirSync processing... Not sure of the implications but nothing has broken yet! --- sqlite3.c +++ sqlite3.c @@ -48918,13 +48918,12 @@ } /* Delete the master journal file. This commits the transaction. After ** doing this the directory is synced again before any individual ** transaction files are deleted. + rc = sqlite3OsDelete(pVfs, zMaster, 1); + */ + rc = sqlite3OsDelete(pVfs, zMaster, 0); - */ - rc = sqlite3OsDelete(pVfs, zMaster, 1); sqlite3DbFree(db, zMaster); zMaster = 0; if( rc ){ return rc; } drh added on 2010-02-24 21:51:43: anonymous added on 2010-02-25 08:40:04: Recompiled as suggested and autosync now working beautifully!!! Suddenly fossil comes alive. Autosync: http://nnn.nnn.nnn.nnn:8080/ Bytes Cards Artifacts Deltas Send: 130 1 0 0 Received: 1196 26 0 0 Total network traffic: 315 bytes sent, 831 bytes received New_Version: 4d9585118174ba091078318d13942715b662c86b Autosync: http://nnn.nnn.nnn.nnn:8080/ Bytes Cards Artifacts Deltas Send: 2763 31 1 2 Received: 1334 29 0 0 Total network traffic: 1713 bytes sent, 903 bytes received |