Welcome to the Linux Foundation Forum!

Order of files in Lab 13.1

donaldsebleung
donaldsebleung Posts: 21
edited August 2020 in LFW211 Class Forum

I noticed that Labs 1 and 2 for Chapter 13 are swapped in the downloadable course resources relative to the online course notes, so let me first be clear that I am referring to "Lab 13.1 - Read Directory and Write File" from the online course notes.

For this lab, I have been able to list the files under the project directory and write them to out.txt; however, it often does so in a different order than the expected order (in particular, my list is sorted in alphanumeric order) so I get an assertion failure, e.g.

  ...
  actual: [
    '1lro5348nq3',
    'ab5hmkwhvap',
    'mgofil6hjz9',
    'tm4q0z9dp1d',
    'x637x6xphlc'
  ],
  expected: [
    'tm4q0z9dp1d',
    'ab5hmkwhvap',
    'x637x6xphlc',
    'mgofil6hjz9',
    '1lro5348nq3'
  ],
  ...

Should I consider myself to have passed the lab in this case, or should the order of the listed files match that of the expected output? In the latter case, I also tried sorting the files in ascending order based on creation time (by stat.birthtimeMs) but to no avail - perhaps the creation times of the files are too close together to be distinguished in the millisecond range?

Comments

  • I just managed to produce the exact output expected by the assertions (consistently). From the Node.js documentation on fs.Stats, the stats object contains the inode number of the file through the ino property, and I figured by inspecting the inode numbers of the generated files (ls -i on POSIX systems) that the test cases expect the files to be listed in ascending inode number (= ascending order of creation time?), so I sorted my file list by inode number before writing them to out.txt and passed the assertions that way.

  • Same problem here.
    Anyway I think that the task is not well explained. The assertion should pass despite of the items order inside the array.
    Thanks @donaldsebleung for the hint!

  • this was a bug and should now be fixed

  • Just downloaded the labs and it is not fixed yet.

  • @thogarth thanks for bringing that up, it looks like the fix never made it to production, I've sent the fix again through the appropriate channels

  • Below is my solution, I found the same issue described above.
    The out.txt file had all of the correct files written to it,
    the order did not match the order of the assertion so it
    throws an assertion error.

    function exercise () {
      // TODO read the files in the project folder
      // and write the to the out.txt file
      console.log('project', project)
      let folders = fs.readdirSync(project)
      folders = folders.toString();
      console.log('folders', folders);
      fs.writeFileSync(out, folders); 
    }
    
      generatedMessage: true,
      code: 'ERR_ASSERTION',
      actual: [
        'avlgu27c5i',
        'cfs7g03hbes',
        'm4i8blihch',
        'nsoa3hpbg7l',
        'o130lrxfe1l'
      ],
      expected: [
        'avlgu27c5i',
        'm4i8blihch',
        'cfs7g03hbes',
        'o130lrxfe1l',
        'nsoa3hpbg7l'
      ],
    
    
  • @andrewpartrickmiller is this with the latest labs download?

  • andrewpartrickmiller
    edited December 2020

    Yes, I use the most recent file. It says December on it.

  • coop
    coop Posts: 916

    try it again. David told you it was uploaded before it was actually processed for upload. These things are not instantaneous. The new version is Dec 30, not Dec 10.

  • @andrewpartrickmiller would you mind confirming if it's Dec 30 labs?

  • @davidmarkclements I downloaded the labs for Dec 30, and for this lab I noticed two things. One is that we have to use the synchronous fs read and write functions because the test will run and throw an error if we read and write asynchronously.

    The other thing I noticed is that my files are always listed out alphabetically when they are written to out.txt.

    And the expected files are not written out alphabetically.

    Which leads me to believe that when the files are created and passed to the system they are reorganized alphabetically, regardless of what order they are created, then when we retrieve them from the system they are reorganized in a separate order from which they were created.

    That is my hunch.

    I am still getting the same errors.

  • hello. I have the same problem and have the last download. I hope the automatic correction for exam will not make any surprise like that lol

  • I've also noticed this - the files do seem to be read alphabetically but the files array being asserted against is not. I'm not sure if node or the os doing the alphabetical ordering, but just sorting the files array created at/around line 10 works for me:

    const files = Array.from(Array(5), () => {
      return join(project, Math.random().toString(36).slice(2))
    })
    files.sort() // <---
    
  • I found the same as @mmayes. And the sort on line 10 does do the trick.

  • thanks @mmayes I'm adding this fix right now

  • I could make it work sorting files by ctimeMs using metadata.

    function exercise () {
      const filesList = fs.readdirSync(project)
    
      const filesWithTimeMs = []
    
      for (const file of filesList) {
        const { ctimeMs } = fs.statSync(join(project, file))
        filesWithTimeMs.push({file, ctimeMs})
      }
    
      const outputFilenames = filesWithTimeMs
        .sort((a, b) => (a.ctimeMs > b.ctimeMs) ? 1 : -1)
        .map(file => file.file)
    
      fs.writeFileSync(out, outputFilenames)
    }
    
  • kellv
    kellv Posts: 19

    I want to add that I've tried this w/ 12.22.1 on windows and it isn't consistent. If I run it over and over, the sequence isn't usually retained; meaning I rerun the node call manually repeatedly:

    > node index.js //order is correct
    > node index.js //order is not correct
    > node index.js //order is not correct
    > node index.js //order is not correct

    For it to work, I usually have to wait a while (let's say up to 30 seconds). Is this an issue on mac or linux?

  • @kellv this is with the latest code updates?

  • Should the file "out.txt" be created with code or is manually fine? I understand this is the how the function "exercise" should look like, correct?

  • xdxmxc
    xdxmxc Posts: 157

    @jsalcedo the idea is to create it with code - yeah that would do it.

Categories

Upcoming Training