。。。

This commit is contained in:
ridethepig 2023-05-04 15:43:21 +08:00
parent 47053d35da
commit 3af49699a4
6 changed files with 2048 additions and 10 deletions

View File

@ -493,5 +493,478 @@
:height 1900.8}),
:page 5},
:content {:text "3.1 HOP"},
:properties {:color "yellow"}}],
:properties {:color "yellow"}}
{:id #uuid "64533b91-7e2b-448b-bb4f-807cc7cb5a77",
:page 5,
:position {:bounding {:x1 0,
:y1 625.848274230957,
:x2 1041.702880859375,
:y2 1331.830451965332,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 761.5968017578125,
:y1 625.848274230957,
:x2 1041.702880859375,
:y2 650.4196853637695,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 592.7053985595703,
:y1 648.160774230957,
:x2 779.3180541992188,
:y2 672.7321853637695,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 0,
:y1 1307.2590408325195,
:x2 0,
:y2 1331.830451965332,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 5},
:content {:text "first perform all reads and invisible writes outside the RTM"},
:properties {:color "yellow"}}
{:id #uuid "64533cf1-c232-4630-8cf9-88cf4dbfe0c2",
:page 5,
:position {:bounding {:x1 666.8732299804688,
:y1 759.7500305175781,
:x2 788.893310546875,
:y2 784.3214416503906,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 666.8732299804688,
:y1 759.7500305175781,
:x2 788.893310546875,
:y2 784.3214416503906,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 5},
:content {:text "sequence count"},
:properties {:color "yellow"}}
{:id #uuid "64534050-8459-4719-866e-612b76560e00",
:page 6,
:position {:bounding {:x1 100.79464721679688,
:y1 1121.4465026855469,
:x2 299.19744873046875,
:y2 1150.58935546875,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 1121.4465026855469,
:x2 299.19744873046875,
:y2 1150.58935546875,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 128.6875,
:y1 1124.8750610351562,
:x2 151.02301025390625,
:y2 1147.1875610351562,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 6},
:content {:text "3.2 File Operations"},
:properties {:color "yellow"}}
{:id #uuid "6453427e-ce5a-4746-960b-45f9546e8b37",
:page 5,
:position {:bounding {:x1 593.3750305175781,
:y1 1169.4732666015625,
:x2 897.7872924804688,
:y2 1194.044677734375,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 593.3750305175781,
:y1 1169.4732666015625,
:x2 897.7872924804688,
:y2 1194.044677734375,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 5},
:content {:text "Discussion of concurrency correctness."},
:properties {:color "yellow"}}
{:id #uuid "64534bc6-4bde-47c6-9fa2-3a085ff59c66",
:page 6,
:position {:bounding {:x1 100.79464721679688,
:y1 1159.5893249511719,
:x2 240.79701232910156,
:y2 1184.1607666015625,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 1159.5893249511719,
:x2 240.79701232910156,
:y2 1184.1607666015625,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 137.99107360839844,
:y1 1163.0178985595703,
:x2 156.61558532714844,
:y2 1181.6161193847656,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 6},
:content {:text "3.2.1 Data Read"},
:properties {:color "yellow"}}
{:id #uuid "64534cee-e35f-4e07-a79d-9185e36b57a2",
:page 6,
:position {:bounding {:x1 593.3750381469727,
:y1 600.6696472167969,
:x2 738.5257873535156,
:y2 625.2410888671875,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 593.3750381469727,
:y1 600.6696472167969,
:x2 738.5257873535156,
:y2 625.2410888671875,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 630.5625457763672,
:y1 604.0982208251953,
:x2 649.1870574951172,
:y2 622.6964416503906,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 6},
:content {:text "3.2.2 Data Write"},
:properties {:color "yellow"}}
{:id #uuid "64534d02-3d6b-4dd4-8d3f-e86767190f08",
:page 7,
:position {:bounding {:x1 100.79464721679688,
:y1 430.9553985595703,
:x2 238.2342071533203,
:y2 455.5268096923828,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 430.9553985595703,
:x2 238.2342071533203,
:y2 455.5268096923828,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 137.99107360839844,
:y1 434.38392639160156,
:x2 156.61558532714844,
:y2 452.9821319580078,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 7},
:content {:text "3.2.3 Allocation"},
:properties {:color "yellow"}}
{:id #uuid "64534d0c-9fe2-4817-b510-5d2da7d55dbf",
:page 7,
:position {:bounding {:x1 100.79464721679688,
:y1 898.3750305175781,
:x2 354.5528564453125,
:y2 927.5179138183594,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 898.3750305175781,
:x2 354.5528564453125,
:y2 927.5179138183594,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 128.6875,
:y1 901.8036193847656,
:x2 151.02301025390625,
:y2 924.1161193847656,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 7},
:content {:text "3.3 Directory Operations"},
:properties {:color "yellow"}}
{:id #uuid "64534d0f-1882-4633-9cd4-fce9d411aeb9",
:page 7,
:position {:bounding {:x1 100.79464721679688,
:y1 936.0982666015625,
:x2 240.4675750732422,
:y2 960.669677734375,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 936.0982666015625,
:x2 240.4675750732422,
:y2 960.669677734375,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 137.99107360839844,
:y1 939.52685546875,
:x2 156.61558532714844,
:y2 958.1250610351562,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 7},
:content {:text "3.3.1 Path Walk"},
:properties {:color "yellow"}}
{:id #uuid "64534d19-b941-4c04-a084-2d8a09d00883",
:page 7,
:position {:bounding {:x1 593.3750381469727,
:y1 465.1161117553711,
:x2 795.0186767578125,
:y2 489.6875228881836,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 593.3750381469727,
:y1 465.1161117553711,
:x2 795.0186767578125,
:y2 489.6875228881836,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 630.5625457763672,
:y1 468.54463958740234,
:x2 649.1870574951172,
:y2 487.14290618896484,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 7},
:content {:text "3.3.2 Directory Updates"},
:properties {:color "yellow"}}
{:id #uuid "64534d23-1327-40ef-b58e-7c5a01559552",
:page 8,
:position {:bounding {:x1 100.79464721679688,
:y1 504.79463958740234,
:x2 310.562255859375,
:y2 533.9375228881836,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 504.79463958740234,
:x2 310.562255859375,
:y2 533.9375228881836,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 128.6875,
:y1 508.22322845458984,
:x2 151.02301025390625,
:y2 530.5357284545898,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 8},
:content {:text "3.4 Other File Types"},
:properties {:color "yellow"}}
{:id #uuid "64534d33-2bfe-4817-a5bd-0cc3534584d7",
:page 8,
:position {:bounding {:x1 100.79464721679688,
:y1 640.2678833007812,
:x2 309.95745849609375,
:y2 669.4107360839844,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 640.2678833007812,
:x2 309.95745849609375,
:y2 669.4107360839844,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 128.6875,
:y1 643.6964416503906,
:x2 151.02301025390625,
:y2 666.0089416503906,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 8},
:content {:text "3.5 The Timestamps"},
:properties {:color "yellow"}}
{:id #uuid "64534d37-b14f-4943-92c0-7bb4823fbd50",
:page 8,
:position {:bounding {:x1 100.79464721679688,
:y1 1088.96435546875,
:x2 404.5784912109375,
:y2 1118.107177734375,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 1088.96435546875,
:x2 404.5784912109375,
:y2 1118.107177734375,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 128.6875,
:y1 1092.3929443359375,
:x2 151.02301025390625,
:y2 1114.7054443359375,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 8},
:content {:text "3.6 The Special Case: Rename"},
:properties {:color "yellow"}}
{:id #uuid "64534d45-e498-427d-b4ef-74eaf56f7aae",
:page 9,
:position {:bounding {:x1 100.79464721679688,
:y1 498.08929443359375,
:x2 286.7929382324219,
:y2 527.232177734375,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 100.79464721679688,
:y1 498.08929443359375,
:x2 286.7929382324219,
:y2 527.232177734375,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 111.95536041259766,
:y1 501.51788330078125,
:x2 134.29086303710938,
:y2 523.8303833007812,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 9},
:content {:text "4 Implementation"},
:properties {:color "yellow"}}
{:id #uuid "645357b1-b9ab-456c-87b3-c1047ec5ce59",
:page 6,
:position {:bounding {:x1 0,
:y1 811.6785888671875,
:x2 1041.711669921875,
:y2 1414.8214721679688,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 947.4280700683594,
:y1 811.6785888671875,
:x2 1041.711669921875,
:y2 836.2500305175781,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 593.3750381469727,
:y1 834.0000305175781,
:x2 1041.6945877075195,
:y2 858.5714416503906,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 593.3750381469727,
:y1 837.4285888671875,
:x2 1041.6945877075195,
:y2 856.0268249511719,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 593.3750381469727,
:y1 856.3125305175781,
:x2 730.7262649536133,
:y2 880.8839416503906,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 0,
:y1 1373.65185546875,
:x2 0,
:y2 1398.2232666015625,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 0,
:y1 1390.2500610351562,
:x2 0,
:y2 1414.8214721679688,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 6},
:content {:text "convert data updates to metadata updates that can be embedded in the RTM transactions."},
:properties {:color "yellow"}}
{:id #uuid "64535855-08bc-484d-951e-6cf191d5729f",
:page 6,
:position {:bounding {:x1 611.9732513427734,
:y1 879.3661346435547,
:x2 708.9877014160156,
:y2 903.9375610351562,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 611.9732513427734,
:y1 879.3661346435547,
:x2 708.9877014160156,
:y2 903.9375610351562,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 6},
:content {:text "Small writes, "},
:properties {:color "yellow"}}
{:id #uuid "64535ce3-9927-4e22-b2ed-9c396c3b43f2",
:page 6,
:position {:bounding {:x1 0,
:y1 1214.1072082519531,
:x2 1041.6976928710938,
:y2 1696.9911499023438,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 802.2041625976562,
:y1 1214.1072082519531,
:x2 1041.6976928710938,
:y2 1238.6786499023438,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 593.3750381469727,
:y1 1236.4197082519531,
:x2 748.9095840454102,
:y2 1260.9911499023438,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 0,
:y1 1672.4197387695312,
:x2 0,
:y2 1696.9911499023438,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 6},
:content {:text "But the blocks may have leaked after a system crash. "},
:properties {:color "red"}}
{:id #uuid "64535d27-c876-4481-856e-8962e5ba9b16",
:page 7,
:position {:bounding {:x1 257.77557373046875,
:y1 485.0536003112793,
:x2 436.4731140136719,
:y2 509.6250114440918,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 257.77557373046875,
:y1 485.0536003112793,
:x2 436.4731140136719,
:y2 509.6250114440918,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 7},
:content {:text " temporal allocating list"},
:properties {:color "yellow"}}
{:id #uuid "64535f97-b733-4522-a2d1-dbfc8837799e",
:page 7,
:position {:bounding {:x1 0,
:y1 327.9643020629883,
:x2 549.4309692382812,
:y2 733.5357360839844,
:width 1142.3999999999999,
:height 1478.3999999999999},
:rects ({:x1 0,
:y1 327.9643020629883,
:x2 0,
:y2 352.5357322692871,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 0,
:y1 344.5625171661377,
:x2 0,
:y2 369.1339473724365,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 338.12518310546875,
:y1 664.3303833007812,
:x2 549.4309692382812,
:y2 688.9018249511719,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 100.79464721679688,
:y1 686.6518249511719,
:x2 549.1180419921875,
:y2 711.2232360839844,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 100.79464721679688,
:y1 690.0803833007812,
:x2 549.1180419921875,
:y2 708.6786193847656,
:width 1142.3999999999999,
:height 1478.3999999999999}
{:x1 100.79464721679688,
:y1 708.9643249511719,
:x2 408.1436767578125,
:y2 733.5357360839844,
:width 1142.3999999999999,
:height 1478.3999999999999}),
:page 7},
:content {:text "the file system crashes after a reference to a block of data has been removed (when this block of memory has not yet been freed)"},
:properties {:color "red"}}],
:extra {:page 7}}

3
journals/2023_05_04.md Normal file
View File

@ -0,0 +1,3 @@
- TODO Paper1-HTMFS Implementation 看完
- TODO 模式识别作业提交
- TODO 写一会编译器

View File

@ -317,13 +317,14 @@ mark {
font-size: inherit;
text-decoration-style: solid;
text-decoration: underline;
text-decoration-color: var(--ls-primary-background-color);
text-decoration-color: rgba(255,198,0,0.7);
text-decoration-thickness: 4px;
text-underline-offset: -1px;
text-decoration-skip-ink: none;
}
html[data-theme="dark"] mark {
text-decoration-color: rgba(255,198,0,0.7);
}
/* fix color page-reference when mark text */
mark .page-ref,
mark .page-reference .bracket {

View File

@ -113,8 +113,8 @@ html[data-theme="light"],
/* {{ 1.2. Layout corrections */
/* Helps to not overlap content with tabs plugin */
#main-content-container {
margin-top: 1.9em;
padding-top: 1.9em !important;
margin-top: 1.0em;
padding-top: 1.0em !important;
}
/* Add some white space to the right.
(This is because the actual start of the content on the left side is offset if we include the bullets and spacing.) */
@ -353,7 +353,7 @@ html[data-theme="light"] .search-results-wrap a .rounded.border {
padding: 0.3em 0;
}
.ls-block[level="1"] {
padding-top: 0.6em;
padding-top: 0.3em;
}
.block-children {
padding: 0.16em 0;
@ -655,8 +655,8 @@ html[data-theme="light"] .cm-s-solarized.cm-s-dark .CodeMirror-gutters {
/* { == 4. Plugin specific ==> */
/* {{ 4.1. Tabs Plugin */
#main-content-container {
margin-top: 1.9em;
padding-top: 1.9em !important;
margin-top: 1.0em;
padding-top: 1.0em !important;
}
html[data-theme="dark"] #logseq-tabs_lsp_main {
filter: sepia(0) saturate(0.8) opacity(0.85) hue-rotate(360deg) grayscale(0.05) brightness(0.85) invert(0.04);

View File

@ -125,3 +125,116 @@ file-path:: ../assets/HTMFS_Strong_Consistency_Comes_for_Free_with_1682647018871
- 三种操作分类:
- Read、Invisible write(内部的东西,比如块分配信息) 、Visible write(应用程序可见的)
- 只有 Visible Write 用 HTM 实现Invisible 和 Read 通过别的机制来实现
- 对于一整个FS操作首先在 RTM 外面完成所需的 read 和 invisible然后用 RTM 完成 visible保证它们是 atomic 的。
hl-page:: 5
ls-type:: annotation
id:: 64533b91-7e2b-448b-bb4f-807cc7cb5a77
hl-color:: yellow
- RTM外面的部分不保证并发安全用 sequence count 来解决这个问题。
hl-page:: 5
ls-type:: annotation
id:: 64533cf1-c232-4630-8cf9-88cf4dbfe0c2
hl-color:: yellow
- 这东西的原型是 Linux 里面的 `seqlock` 。基本原理可以看这个。 [SeqLock中文博客](http://www.wowotech.net/kernel_synchronization/seqlock.html)。 然后这里的机制大概就是把 writer lock 给换成了 RTM虽然细节上不是很一样
- 在读之前RTM外先记录 seqcount然后进入 RTM 之后进行验证,需要保证在 RTM commit 之前这些 seqcount 都没变。如果有变化,就需要重新回到 RTM 外面的某一点重新读取
- 当然如果是 accidental abort那么只需要重新执行RTM就可以了就算前面读的数据炸了反正还是要验证一次的
- 不过有个问题它没说,就是 invisible write它没有RTM保证不会写冲突啊不过也有可能它会保证 invisible 不涉及临界区??
- Discussion of concurrency correctness.
ls-type:: annotation
hl-page:: 5
hl-color:: yellow
id:: 6453427e-ce5a-4746-960b-45f9546e8b37
- Read-Read显然不冲突
- Write-Write 他说potential conflicting write 会被RTM保护起来不过有可能会live lock掉
- Write-Read 也就是如果在RTM里面写入并且commit之前读取会导致RTM abort
- Read-Write 的情况就比较复杂了。作者给了个图,考虑了 T1 读同时有T2写的例子
- T2 在 T1 验证之前写Valid fail 然后重新读。不过其实是有一个 overlap 的图里面的第三个B点应该也会 RTM-abort
- T2 在 T1 验证之后、RTM commit 之前写:因为读取的数据在 RTM 的 read-set 里面,所有还是会 RTM abort
- 3.2 File Operations
ls-type:: annotation
hl-page:: 6
hl-color:: yellow
id:: 64534050-8459-4719-866e-612b76560e00
- 其实看 Figure 3 就行了
- 3.2.1 Data Read
ls-type:: annotation
hl-page:: 6
hl-color:: yellow
id:: 64534bc6-4bde-47c6-9fa2-3a085ff59c66
- 前面也写了,用 seqcnt 机制来保证读一致性。众所周知每个文件的inode里面都有block指针这里给每个指针都配上了一个seqno读的时候就用这些个东西
- 3.2.2 Data Write
ls-type:: annotation
hl-page:: 6
hl-color:: yellow
id:: 64534cee-e35f-4e07-a79d-9185e36b57a2
- convert data updates to metadata updates that can be embedded in the RTM transactions.
ls-type:: annotation
hl-page:: 6
hl-color:: yellow
id:: 645357b1-b9ab-456c-87b3-c1047ec5ce59
- small writes直接塞进RTM
hl-page:: 6
ls-type:: annotation
id:: 64535855-08bc-484d-951e-6cf191d5729f
hl-color:: yellow
- 大量写入先把数据写入PM然后再更新元数据。这时候用的就是block指针了。具体空间分配是用的DRAM数据存疑然后 shadow page 写文件数据);最后 RTM 修改 FS 元数据allocation 的修改这个时候才会被持久化。如果 trx 提交之前炸了,顶多就是写了点垃圾数据到空白位置罢了。
- But the blocks may have leaked after a system crash. 没看懂为啥会leak啊你的 alloc 数据又没落盘。
hl-stamp:: 1683184901505
hl-page:: 6
ls-type:: annotation
id:: 64535ce3-9927-4e22-b2ed-9c396c3b43f2
hl-color:: red
- 不过看上去它们这边是认为分配一个块是个双向的过程不仅会在总的freelist里面有记录block 里面也有一个记录表明它的分配情况?
- 3.2.3 Allocation
ls-type:: annotation
hl-page:: 7
hl-color:: yellow
id:: 64534d02-3d6b-4dd4-8d3f-e86767190f08
- 首先把已经分配的块放进一个 temporal allocating list 里面 (大概会在 alloc 阶段持久化如果commit成功就不管它如果出事了就把这个里面的块还回去
hl-page:: 7
ls-type:: annotation
id:: 64535d27-c876-4481-856e-8962e5ba9b16
hl-color:: yellow
- 在释放块的时候,也会存在中途 crash 的问题。一般是先删掉reference 然后再释放块如果没释放完那这个块就leak了。还是有和前面类似的疑问这东西不是 引用一删就已经整完了吗?
- the file system crashes after a reference to a block of data has been removed (when this block of memory has not yet been freed)
ls-type:: annotation
hl-page:: 7
hl-color:: red
id:: 64535f97-b733-4522-a2d1-dbfc8837799e
hl-stamp:: 1683185566331
- 3.3 Directory Operations
ls-type:: annotation
hl-page:: 7
hl-color:: yellow
id:: 64534d0c-9fe2-4817-b510-5d2da7d55dbf
- 3.3.1 Path Walk
ls-type:: annotation
hl-page:: 7
hl-color:: yellow
id:: 64534d0f-1882-4633-9cd4-fce9d411aeb9
- 3.3.2 Directory Updates
ls-type:: annotation
hl-page:: 7
hl-color:: yellow
id:: 64534d19-b941-4c04-a084-2d8a09d00883
- 3.4 Other File Types
ls-type:: annotation
hl-page:: 8
hl-color:: yellow
id:: 64534d23-1327-40ef-b58e-7c5a01559552
- 就写了一个 symlink但是这玩意就是其他操作的组合罢了没啥特别的东西
- 3.5 The Timestamps
ls-type:: annotation
hl-page:: 8
hl-color:: yellow
id:: 64534d33-2bfe-4817-a5bd-0cc3534584d7
- 3.6 The Special Case: Rename
ls-type:: annotation
hl-page:: 8
hl-color:: yellow
id:: 64534d37-b14f-4943-92c0-7bb4823fbd50
- 4 Implementation
ls-type:: annotation
hl-page:: 9
hl-color:: yellow
id:: 64534d45-e498-427d-b4ef-74eaf56f7aae