CHANGES.txt 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. Hadoop YARN Change Log
  2. Release 2.0.5-beta - UNRELEASED
  3. INCOMPATIBLE CHANGES
  4. YARN-396. Rationalize AllocateResponse in RM Scheduler API. (Zhijie Shen
  5. via hitesh)
  6. YARN-439. Flatten NodeHeartbeatResponse. (Xuan Gong via sseth)
  7. NEW FEATURES
  8. IMPROVEMENTS
  9. YARN-365. Change NM heartbeat handling to not generate a scheduler event
  10. on each heartbeat. (Xuan Gong via sseth)
  11. YARN-380. Fix yarn node -status output to be better readable. (Omkar Vinit
  12. Joshi via vinodkv)
  13. YARN-410. Fixed RM UI so that the new lines diagnostics for a failed app on
  14. the per-application page are translated to html line breaks. (Omkar Vinit
  15. Joshi via vinodkv)
  16. YARN-198. Added a link to RM pages from the NodeManager web app. (Jian He
  17. via vinodkv)
  18. YARN-237. Refreshing the RM page forgets how many rows I had in my
  19. Datatables (jian he via bobby)
  20. YARN-481. Add AM Host and RPC Port to ApplicationCLI Status Output
  21. (Chris Riccomini via bikas)
  22. YARN-297. Improve hashCode implementations for PB records. (Xuan Gong via
  23. hitesh)
  24. YARN-417. Create AMRMClient wrapper that provides asynchronous callbacks.
  25. (Sandy Ryza via bikas)
  26. OPTIMIZATIONS
  27. BUG FIXES
  28. YARN-383. AMRMClientImpl should handle null rmClient in stop()
  29. (Hitesh Shah via sseth)
  30. YARN-385. Add missing fields - location and #containers to
  31. ResourceRequestPBImpl's toString(). (Sandy Ryza via sseth)
  32. YARN-377. Use the new StringUtils methods added by HADOOP-9252 and fix
  33. TestContainersMonitor. (Chris Nauroth via szetszwo)
  34. YARN-391. Formatting fixes for LCEResourceHandler classes.
  35. (Steve Loughran via sseth)
  36. YARN-390. ApplicationCLI and NodeCLI hard-coded platform-specific line
  37. separator causes test failures on Windows. (Chris Nauroth via suresh)
  38. YARN-406. Fix TestRackResolver to function in networks where "host1"
  39. resolves to a valid host. (Hitesh Shah via sseth)
  40. YARN-376. Fixes a bug which would prevent the NM knowing about completed
  41. containers and applications. (Jason Lowe via sseth)
  42. YARN-196. Nodemanager should be more robust in handling connection failure
  43. to ResourceManager when a cluster is started (Xuan Gong via hitesh)
  44. YARN-485. TestProcfsProcessTree#testProcessTree() doesn't wait long enough
  45. for the process to die. (kkambatl via tucu)
  46. YARN-470. Support a way to disable resource monitoring on the NodeManager.
  47. (Siddharth Seth via hitesh)
  48. YARN-71. Fix the NodeManager to clean up local-dirs on restart.
  49. (Xuan Gong via sseth)
  50. Release 2.0.4-alpha - UNRELEASED
  51. INCOMPATIBLE CHANGES
  52. NEW FEATURES
  53. IMPROVEMENTS
  54. OPTIMIZATIONS
  55. BUG FIXES
  56. YARN-429. capacity-scheduler config missing from yarn-test artifact.
  57. (sseth via hitesh)
  58. Release 2.0.3-alpha - 2013-02-06
  59. INCOMPATIBLE CHANGES
  60. NEW FEATURES
  61. YARN-145. Add a Web UI to the fair share scheduler. (Sandy Ryza via tomwhite)
  62. YARN-3. Add support for CPU isolation/monitoring of containers.
  63. (adferguson via tucu)
  64. YARN-230. RM Restart phase 1 - includes support for saving/restarting all
  65. applications on an RM bounce. (Bikas Saha via acmurthy)
  66. YARN-103. Add a yarn AM-RM client module. (Bikas Saha via sseth)
  67. YARN-286. Add a YARN ApplicationClassLoader. (tomwhite)
  68. YARN-2. Enhanced CapacityScheduler to account for CPU alongwith memory for
  69. multi-dimensional resource scheduling. (acmurthy)
  70. YARN-328. Use token request messages defined in hadoop common. (suresh)
  71. YARN-231. RM Restart - Add FS-based persistent store implementation for
  72. RMStateStore (Bikas Saha via hitesh)
  73. IMPROVEMENTS
  74. YARN-223. Update process tree instead of getting new process trees.
  75. (Radim Kolar via llu)
  76. YARN-57. Allow process-tree based resource calculation et al. to be
  77. pluggable to support it on multiple platforms. (Radim Kolar via acmurthy)
  78. YARN-78. Changed UnManagedAM application to use YarnClient. (Bikas Saha via
  79. vinodkv)
  80. YARN-93. Fixed RM to propagate diagnostics from applications that have
  81. finished but failed (Jason Lowe via vinodkv).
  82. YARN-28. Fixed TestCompositeService to not depend on test-order and thus
  83. made it pass on JDK7 (Thomas Graves via vinodkv).
  84. YARN-82. Change the default local and log dirs to be based on
  85. hadoop.tmp.dir and yarn.log.dir. (Hemanth Yamijala via sseth)
  86. YARN-53. Added the missing getGroups API to ResourceManager. (Bo Wang via
  87. vinodkv)
  88. YARN-116. Add the ability to change the RM include/exclude file without
  89. a restart. (xieguiming and Harsh J via sseth)
  90. YARN-23. FairScheduler: FSQueueSchedulable#updateDemand() - potential
  91. redundant aggregation. (kkambatl via tucu)
  92. YARN-127. Move RMAdmin tool to its correct location - the client module.
  93. (vinodkv)
  94. YARN-40. Provided support for missing YARN commands (Devaraj K and Vinod
  95. Kumar Vavilapalli via vinodkv)
  96. YARN-33. Change LocalDirsHandlerService to validate the configured local and
  97. log dirs. (Mayank Bansal via sseth)
  98. YARN-94. Modify DistributedShell to point to main-class by default, clean up
  99. the help message, and hard-code the AM class. (Hitesh Shah via vinodkv)
  100. YARN-146. Add unit tests for computing fair share in the fair scheduler.
  101. (Sandy Ryza via tomwhite)
  102. HADOOP-8911. CRLF characters in source and text files.
  103. (Raja Aluri via suresh)
  104. YARN-136. Make ClientToAMTokenSecretManager part of RMContext (Vinod Kumar
  105. Vavilapalli via sseth)
  106. YARN-183. Clean up fair scheduler code. (Sandy Ryza via tomwhite)
  107. YARN-129. Simplify classpath construction for mini YARN tests. (tomwhite)
  108. YARN-254. Update fair scheduler web UI for hierarchical queues.
  109. (sandyr via tucu)
  110. YARN-315. Using the common security token protobuf definition from hadoop
  111. common. (Suresh Srinivas via vinodkv)
  112. YARN-170. Change NodeManager stop to be reentrant. (Sandy Ryza via vinodkv)
  113. YARN-331. Fill in missing fair scheduler documentation. (sandyr via tucu)
  114. YARN-277. Use AMRMClient in DistributedShell to exemplify the approach.
  115. (Bikas Saha via hitesh)
  116. YARN-360. Allow apps to concurrently register tokens for renewal.
  117. (Daryn Sharp via sseth)
  118. OPTIMIZATIONS
  119. BUG FIXES
  120. YARN-131. Fix incorrect ACL properties in capacity scheduler documentation.
  121. (Ahmed Radwan via sseth)
  122. YARN-102. Move the apache header to the top of the file in MemStore.java.
  123. (Devaraj K via sseth)
  124. YARN-134. ClientToAMSecretManager creates keys without checking for
  125. validity of the appID. (Vinod Kumar Vavilapalli via sseth)
  126. YARN-30. Fixed tests verifying web-services to work on JDK7. (Thomas Graves
  127. via vinodkv)
  128. YARN-150. Fixes AppRejectedTransition does not unregister a rejected
  129. app-attempt from the ApplicationMasterService (Bikas Saha via sseth)
  130. YARN-140. Add capacity-scheduler-default.xml to provide a default set of
  131. configurations for the capacity scheduler. (ahmed via tucu)
  132. YARN-179. Fix some unit test failures. (Vinod Kumar Vavilapalli via sseth)
  133. YARN-181. Fixed eclipse settings broken by capacity-scheduler.xml move via
  134. YARN-140. (Siddharth Seth via vinodkv)
  135. YARN-169. Update log4j.appender.EventCounter to use
  136. org.apache.hadoop.log.metrics.EventCounter (Anthony Rojas via tomwhite)
  137. YARN-184. Remove unnecessary locking in fair scheduler, and address
  138. findbugs excludes. (sandyr via tucu)
  139. YARN-224. Fair scheduler logs too many nodeUpdate INFO messages.
  140. (Sandy Ryza via tomwhite)
  141. YARN-222. Fair scheduler should create queue for each user by default.
  142. (Sandy Ryza via tomwhite)
  143. MAPREDUCE-4778. Fair scheduler event log is only written if directory
  144. exists on HDFS. (Sandy Ryza via tomwhite)
  145. YARN-229. Remove old unused RM recovery code. (Bikas Saha via acmurthy)
  146. YARN-187. Add hierarchical queues to the fair scheduler.
  147. (Sandy Ryza via tomwhite)
  148. YARN-72. NM should handle cleaning up containers when it shuts down.
  149. (Sandy Ryza via tomwhite)
  150. YARN-267. Fix fair scheduler web UI. (Sandy Ryza via tomwhite)
  151. YARN-264. y.s.rm.DelegationTokenRenewer attempts to renew token even
  152. after removing an app. (kkambatl via tucu)
  153. YARN-271. Fair scheduler hits IllegalStateException trying to reserve
  154. different apps on same node. (Sandy Ryza via tomwhite)
  155. YARN-272. Fair scheduler log messages try to print objects without
  156. overridden toString methods. (sandyr via tucu)
  157. YARN-278. Fair scheduler maxRunningApps config causes no apps to make
  158. progress. (sandyr via tucu)
  159. YARN-282. Fair scheduler web UI double counts Apps Submitted.
  160. (sandyr via tucu)
  161. YARN-283. Fair scheduler fails to get queue info without root prefix.
  162. (sandyr via tucu)
  163. YARN-192. Node update causes NPE in the fair scheduler.
  164. (Sandy Ryza via tomwhite)
  165. YARN-288. Fair scheduler queue doesn't accept any jobs when ACLs are
  166. configured. (Sandy Ryza via tomwhite)
  167. YARN-300. After YARN-271, fair scheduler can infinite loop and not
  168. schedule any application. (Sandy Ryza via tomwhite)
  169. YARN-301. Fair scheduler throws ConcurrentModificationException when
  170. iterating over app's priorities. (Sandy Ryza via tomwhite)
  171. YARN-217. Fix RMAdmin protocol description to make it work in secure mode
  172. also. (Devaraj K via vinodkv)
  173. YARN-253. Fixed container-launch to not fail when there are no local
  174. resources to localize. (Tom White via vinodkv)
  175. YARN-330. Fix flakey test: TestNodeManagerShutdown#testKillContainersOnShutdown.
  176. (Sandy Ryza via hitesh)
  177. YARN-335. Fair scheduler doesn't check whether rack needs containers
  178. before assigning to node. (Sandy Ryza via tomwhite)
  179. YARN-336. Fair scheduler FIFO scheduling within a queue only allows 1
  180. app at a time. (Sandy Ryza via tomwhite)
  181. YARN-135. Client tokens should be per app-attempt, and should be
  182. unregistered on App-finish. (vinodkv via sseth)
  183. YARN-302. Fair scheduler assignmultiple should default to false. (sandyr via tucu)
  184. YARN-372. Move InlineDispatcher from hadoop-yarn-server-resourcemanager to
  185. hadoop-yarn-common (sseth via hitesh)
  186. YARN-370. Fix SchedulerUtils to correctly round up the resource for
  187. containers. (Zhijie Shen via acmurthy)
  188. YARN-355. Fixes a bug where RM app submission could jam under load.
  189. (Daryn Sharp via sseth)
  190. Release 2.0.2-alpha - 2012-09-07
  191. YARN-9. Rename YARN_HOME to HADOOP_YARN_HOME. (vinodkv via acmurthy)
  192. NEW FEATURES
  193. YARN-1. Promote YARN to be a sub-project of Apache Hadoop. (acmurthy)
  194. IMPROVEMENTS
  195. YARN-29. Add a yarn-client module. (Vinod Kumar Vavilapalli via sseth)
  196. YARN-10. Fix DistributedShell module to not have a dependency on
  197. hadoop-mapreduce-client-core. (Hitesh Shah via vinodkv)
  198. YARN-80. Add support for delaying rack-local containers in
  199. CapacityScheduler. (acmurthy)
  200. YARN-137. Change the default YARN scheduler to be the CapacityScheduler.
  201. (sseth via acmurthy)
  202. OPTIMIZATIONS
  203. BUG FIXES
  204. YARN-13. Fix pom versions for YARN in branch-2 (todd)
  205. MAPREDUCE-2374. "Text File Busy" errors launching MR tasks. (Andy Isaacson
  206. via atm)
  207. YARN-12. Fix findbugs warnings in FairScheduler. (Junping Du via acmurthy)
  208. YARN-22. Fix ContainerLogs to work if the log-dir is specified as a URI.
  209. (Mayank Bansal via sseth)
  210. YARN-37. Change TestRMAppTransitions to use the DrainDispatcher.
  211. (Mayank Bansal via sseth)
  212. YARN-79. Implement close on all clients to YARN so that RPC clients don't
  213. throw exceptions on shut-down. (Vinod Kumar Vavilapalli)
  214. YARN-42. Modify NM's non-aggregating logs' handler to stop properly so that
  215. NMs don't get NPEs on startup errors. (Devaraj K via vinodkv)
  216. YARN-15. Updated default classpath for YARN applications to reflect split of
  217. YARN into a sub-project. (Arun C Murthy via vinodkv)
  218. YARN-75. Modified ResourceManager's RMContainer to handle a valid RELEASE
  219. event at RUNNING state. (Siddharth Seth via vinodkv)
  220. YARN-138. Ensure default values for minimum/maximum container sizes is
  221. sane. (harsh & sseth via acmurthy)
  222. Release 0.23.7 - UNRELEASED
  223. INCOMPATIBLE CHANGES
  224. NEW FEATURES
  225. IMPROVEMENTS
  226. YARN-133 Update web services docs for RM clusterMetrics (Ravi Prakash via
  227. kihwal)
  228. YARN-249. Capacity Scheduler web page should show list of active users per
  229. queue like it used to (in 1.x) (Ravi Prakash via tgraves)
  230. YARN-236. RM should point tracking URL to RM web page when app fails to
  231. start (Jason Lowe via jeagles)
  232. YARN-269. Resource Manager not logging the health_check_script result when
  233. taking it out (Jason Lowe via kihwal)
  234. YARN-227. Application expiration difficult to debug for end-users
  235. (Jason Lowe via jeagles)
  236. YARN-443. allow OS scheduling priority of NM to be different than the
  237. containers it launches (tgraves)
  238. YARN-468. coverage fix for org.apache.hadoop.yarn.server.webproxy.amfilter
  239. (Aleksey Gorshkov via bobby)
  240. YARN-200. yarn log does not output all needed information, and is in a
  241. binary format (Ravi Prakash via jlowe)
  242. OPTIMIZATIONS
  243. YARN-357. App submission should not be synchronized (daryn)
  244. BUG FIXES
  245. YARN-343. Capacity Scheduler maximum-capacity value -1 is invalid (Xuan
  246. Gong via tgraves)
  247. YARN-364. AggregatedLogDeletionService can take too long to delete logs
  248. (jlowe)
  249. YARN-362. Unexpected extra results when using webUI table search (Ravi
  250. Prakash via jlowe)
  251. YARN-400. RM can return null application resource usage report leading to
  252. NPE in client (Jason Lowe via tgraves)
  253. YARN-426. Failure to download a public resource prevents further downloads
  254. (Jason Lowe via bobby)
  255. YARN-448. Remove unnecessary hflush from log aggregation (Kihwal Lee via
  256. bobby)
  257. YARN-345. Many InvalidStateTransitonException errors for ApplicationImpl
  258. in Node Manager (Robert Parker via jlowe)
  259. YARN-109. .tmp file is not deleted for localized archives (Mayank Bansal
  260. via bobby)
  261. Release 0.23.6 - UNRELEASED
  262. INCOMPATIBLE CHANGES
  263. NEW FEATURES
  264. IMPROVEMENTS
  265. YARN-285. Added a temporary plugin interface for RM to be able to redirect
  266. to JobHistory server for apps that it no longer tracks. (Derek Dagit via
  267. vinodkv)
  268. OPTIMIZATIONS
  269. BUG FIXES
  270. YARN-188. Coverage fixing for CapacityScheduler (Aleksey Gorshkov via
  271. bobby)
  272. YARN-214. RMContainerImpl does not handle event EXPIRE at state RUNNING
  273. (jeagles via bobby)
  274. YARN-151. Browser thinks RM main page JS is taking too long
  275. (Ravi Prakash via bobby)
  276. YARN-204. test coverage for org.apache.hadoop.tools (Aleksey Gorshkov via
  277. bobby)
  278. YARN-251. Proxy URI generation fails for blank tracking URIs (Tom White
  279. via jlowe)
  280. YARN-258. RM web page UI shows Invalid Date for start and finish times
  281. (Ravi Prakash via jlowe)
  282. YARN-266. RM and JHS Web UIs are blank because AppsBlock is not escaping
  283. string properly (Ravi Prakash via jlowe)
  284. YARN-280. RM does not reject app submission with invalid tokens
  285. (Daryn Sharp via tgraves)
  286. YARN-225. Proxy Link in RM UI thows NPE in Secure mode
  287. (Devaraj K via bobby)
  288. YARN-293. Node Manager leaks LocalizerRunner object for every Container
  289. (Robert Joseph Evans via jlowe)
  290. YARN-50. Implement renewal / cancellation of Delegation Tokens
  291. (Siddharth Seth via tgraves)
  292. YARN-320. RM should always be able to renew its own tokens.
  293. (Daryn Sharp via sseth)
  294. YARN-325. RM CapacityScheduler can deadlock when getQueueInfo() is
  295. called and a container is completing (Arun C Murthy via tgraves)
  296. YARN-334. Maven RAT plugin is not checking all source files (tgraves)
  297. YARN-354. WebAppProxyServer exits immediately after startup (Liang Xie via
  298. jlowe)
  299. Release 0.23.5 - 2012-11-28
  300. INCOMPATIBLE CHANGES
  301. NEW FEATURES
  302. IMPROVEMENTS
  303. YARN-161. Fix multiple compiler warnings for unchecked operations in YARN
  304. common. (Chris Nauroth via vinodkv)
  305. YARN-43. Fix TestResourceTrackerService to not depend on test order and thus
  306. pass on JDK7. (Thomas Graves via vinodkv)
  307. YARN-32. Fix TestApplicationTokens to not depend on test order and thus pass
  308. on JDK7. (vinodkv)
  309. YARN-186. Coverage fixing LinuxContainerExecutor (Aleksey Gorshkov via
  310. bobby)
  311. YARN-216. Remove jquery theming support. (Robert Joseph Evans via jlowe)
  312. OPTIMIZATIONS
  313. BUG FIXES
  314. YARN-163. Retrieving container log via NM webapp can hang with multibyte
  315. characters in log (jlowe via bobby)
  316. YARN-174. Modify NodeManager to pass the user's configuration even when
  317. rebooting. (vinodkv)
  318. YARN-177. CapacityScheduler - adding a queue while the RM is running has
  319. wacky results (acmurthy vai tgraves)
  320. YARN-178. Fix custom ProcessTree instance creation (Radim Kolar via bobby)
  321. YARN-180. Capacity scheduler - containers that get reserved create
  322. container token to early (acmurthy and bobby)
  323. YARN-139. Interrupted Exception within AsyncDispatcher leads to user
  324. confusion. (Vinod Kumar Vavilapalli via jlowe)
  325. YARN-165. RM should point tracking URL to RM web page for app when AM fails
  326. (jlowe via bobby)
  327. YARN-159. RM web ui applications page should be sorted to display last app
  328. first (tgraves via bobby)
  329. YARN-166. capacity scheduler doesn't allow capacity < 1.0 (tgraves via
  330. bobby)
  331. YARN-189. Fixed a deadlock between RM's ApplicationMasterService and the
  332. dispatcher. (Thomas Graves via vinodkv)
  333. YARN-202. Log Aggregation generates a storm of fsync() for namenode
  334. (Kihwal Lee via bobby)
  335. YARN-201. Fix CapacityScheduler to be less conservative for starved
  336. off-switch requests. (jlowe via acmurthy)
  337. YARN-206. TestApplicationCleanup.testContainerCleanup occasionally fails.
  338. (jlowe via jeagles)
  339. YARN-212. NM state machine ignores an APPLICATION_CONTAINER_FINISHED event
  340. when it shouldn't (Nathan Roberts via jlowe)
  341. YARN-219. NM should aggregate logs when application finishes. (bobby)
  342. Release 0.23.4
  343. INCOMPATIBLE CHANGES
  344. NEW FEATURES
  345. IMPROVEMENTS
  346. Change package of YarnClient to org.apache.hadoop. (Bikas Saha via vinodkv)
  347. YARN-108. FSDownload can create cache directories with the wrong
  348. permissions (Jason Lowe via bobby)
  349. YARN-57. Allow process-tree based resource calculation et al. to be
  350. pluggable to support it on multiple platforms. (Radim Kolar via acmurthy)
  351. OPTIMIZATIONS
  352. BUG FIXES
  353. YARN-88. DefaultContainerExecutor can fail to set proper permissions.
  354. (Jason Lowe via sseth)
  355. YARN-106. Nodemanager needs to set permissions of local directories (jlowe
  356. via bobby)
  357. Release 0.23.3
  358. INCOMPATIBLE CHANGES
  359. NEW FEATURES
  360. IMPROVEMENTS
  361. OPTIMAZATIONS
  362. BUG FIXES
  363. YARN-14. Symlinks to peer distributed cache files no longer work
  364. (Jason Lowe via bobby)
  365. YARN-25. remove old aggregated logs (Robert Evans via tgraves)
  366. YARN-27. Failed refreshQueues due to misconfiguration prevents further
  367. refreshing of queues (Arun Murthy via tgraves)
  368. MAPREDUCE-4323. NM leaks filesystems (Jason Lowe via jeagles)
  369. YARN-39. RM-NM secret-keys should be randomly generated and rolled every
  370. so often. (vinodkv and sseth via sseth)
  371. YARN-31. Fix TestDelegationTokenRenewer to not depend on test order so as to
  372. pass tests on jdk7. (Thomas Graves via vinodkv)
  373. YARN-63. RMNodeImpl is missing valid transitions from the UNHEALTHY state
  374. (Jason Lowe via bobby)
  375. YARN-60. Fixed a bug in ResourceManager which causes all NMs to get NPEs and
  376. thus causes all containers to be rejected. (vinodkv)
  377. YARN-66. aggregated logs permissions not set properly (tgraves via bobby)
  378. YARN-68. NodeManager will refuse to shutdown indefinitely due to container
  379. log aggregation (daryn via bobby)
  380. YARN-87. NM ResourceLocalizationService does not set permissions of local
  381. cache directories (Jason Lowe via tgraves)