Tcl Source Code

Artifact [b079f464c5]
Login

Artifact b079f464c5e0233328f8b91f4d9401996207eb92a7c26a4994328350115ab2f4:

Ticket change [b079f464c5] - New ticket [3f7af0e21e] win: file delete could sporadic fail with "permission denied". by sebres 2018-07-12 13:51:21.
D 2018-07-12T13:51:21.111
J assignee nobody
J closer nobody
J cmimetype text/x-fossil-wiki
J comment Command\s`file\sdelete\s$target`\sfails\swith\s"permission\sdenied"\sunder\sWindows,\sif\sanother\sworker\schecks\sthe\ssame\starget\swith\sfile\sstat\s(Tcl_FSStat,\sresp.\sTclpObjStat)\sinternally,\sfor\sexample\sby\susage\sof\s`file\smkdir\s$target`,\setc.\r\n\r\nI\ssaw\sthis\sannoying\ssporadic\sbug\salready\sseveral\stimes,\sbut\sthought\sit\sgoing\sto\srude\santivirus.\sNope!\r\n\r\nThis\sis\sanother\scontinuation\sof\slatest\s"race\sconditions"\s(this\stime\son\sthe\sother\send\sand\swindows\sonly),\sgoing\sto\smissing\sflag\sFILE_SHARE_DELETE\sin\s[./artifact?ln=2089-2090&name=e226303aef54a130|NativeStat\sof\stclWinFile.c]\sin\sopposite\sto\s[./artifact?ln=1654-1655&name=e226303aef54a130|NativeAccess].\r\n\r\nI've\sfixed\sit\salready\s(waiting\sfor\stest-cases\spass)\sand\swill\smerge\sit\shereafter\sin\sall\sbranches\ssince\s8.5.\r\n\r\nAs\sPoC,\sfollowing\sscript\s(requires\sRFE\s[4f322b9d21])\sfill\ssporadically\sthrow\s"permission\sdenied"\sby\s`file\sdelete`\son\swindows.\r\nThis\sscript\s(was\sinitially\sa\srace\scondition\stest-case)\stries\sto\screate\sexactly\s5\sunique\stemp-folders\s(.../temp/tcl-test-tmp/0..4)\swith\s5\sworkers\sand\sdeletes\sit\safter\sshort\stime.\r\nAfter\smy\sfix\s(adding\sFILE_SHARE_DELETE\sflag)\sit\sdoes\snot\soccur\sanymore.\s\r\n<code><pre\sstyle="padding-left:10pt">\r\nset\sprms(path)\s[file\sjoin\s$::env(TEMP)\stcl-test-tmp]\r\nset\sprms(thcount)\s5\r\nset\sprms(repcount)\s1000\r\nset\sprms(main)\s[thread::id]\r\n\r\nproc\s::out\s{th\ss}\s{\r\n\s\sputs\s"$th\s$s"\r\n}\r\n##\screate\sworkers\sand\stest-routines:\r\nset\si\s0\r\ntime\s{\r\n\s\sset\sth($i)\s[thread::create\s[string\smap\s[list\s\\$\\$PRMS\s[list\s[array\sget\sprms]]]\s{\r\n\s\s\s\sproc\sout\s{s}\s{\r\n\s\s\s\s\s\supvar\sprms\sprms\r\n\s\s\s\s\s\sthread::send\s-async\s$prms(main)\s[list\sout\s[thread::id]\s$s]\r\n\s\s\s\s}\r\n\s\s\s\sproc\screate-tmp\s{}\s{\r\n\s\s\s\s\s\supvar\sprms\sprms\r\n\s\s\s\s\s\sset\si\s0\r\n\s\s\s\s\s\swhile\s1\s{\r\n\s\s\s\s\s\s\s\sset\spath\s[file\sjoin\s$prms(path)\s$i]\r\n\s\s\s\s\s\s\s\sif\s{[file\smkdir\s$path]}\s{\r\n\s\s\s\s\s\s\s\s\s\sreturn\s$path\r\n\s\s\s\s\s\s\s\s}\r\n\s\s\s\s\s\s\s\sif\s{[incr\scntr]\s>\s10000}\s{\serror\s"endless\scycle"\s}\r\n\s\s\s\s\s\s\s\sif\s{[incr\si]\s>=\s$prms(thcount)}\s{set\si\s0}\r\n\s\s\s\s\s\s}\r\n\s\s\s\s}\r\n\s\s\s\sproc\sdo-test\s{}\s{\r\n\s\s\s\s\s\sarray\sset\sprms\s$$PRMS\r\n\s\s\s\s\s\sif\s{[catch\s{\r\n\s\s\s\s\s\s\s\s##\srepeat\sworker\stask:\r\n\s\s\s\s\s\s\s\stime\s{\r\n\s\s\s\s\s\s\s\s\s\sset\spath\s[create-tmp]\r\n\s\s\s\s\s\s\s\s\s\sout\s"++\s[file\stail\s$path]"\r\n\s\s\s\s\s\s\s\s\s\sfile\sdelete\s-force\s$path\r\n\s\s\s\s\s\s\s\s\s\sout\s"--\s[file\stail\s$path]"\r\n\s\s\s\s\s\s\s\s}\s$prms(repcount)\r\n\s\s\s\s\s\s\s\s##\sdone.\r\n\s\s\s\s\s\s}\smsg\sopt]}\s{\r\n\s\s\s\s\s\s\s\sout\s"failed\swith\s[dict\sget\s$opt\s-errorcode]:\s$msg"\r\n\s\s\s\s\s\s}\r\n\s\s\s\s\s\sthread::send\s-async\s$prms(main)\s{incr\s::test_end}\r\n\s\s\s\s\s\sthread::release\r\n\s\s\s\s}\r\n\s\s\s\sthread::wait\r\n\s\s}]]\r\n\s\sincr\si\r\n}\s$prms(thcount)\r\n\r\n##\sstart\sin\sall\sworkers:\r\nset\s::test_end\s0\r\nfile\sdelete\s-force\s$prms(path)\r\nset\si\s0\r\ntime\s{\r\n\s\sthread::send\s-async\s$th($i)\sdo-test\r\n\s\sincr\si\r\n}\s$prms(thcount)\r\n\r\n##\swait\suntil\sall\sworkers\sget\sready\sand\scleanup:\r\nset\sev\s[after\s60000\s[list\sset\s::test_end\s$prms(thcount)]]\r\nwhile\s{$::test_end\s<\s$prms(thcount)}\s{vwait\s::test_end}\r\nafter\scancel\s$ev\r\nfile\sdelete\s-force\s$prms(path)\r\n</pre></code>
J foundin >=\s8.5
J is_private 0
J login sebres
J priority 5\sMedium
J resolution None
J severity Minor
J status Open
J submitter sebres
J subsystem -\sNew\sBuiltin\sCommands
J title win:\sfile\sdelete\scould\ssporadic\sfail\swith\s"permission\sdenied"
J type Bug
K 3f7af0e21e13f1f54df4e112d3bf3abb7cfc31dc
U sebres
Z 57a57ae3dc639a5bf22a963e18147184