Its pretty bad. Sadly I've seen worse.
Assuming you attach all nodes in the cluster to a shared disk area to avoid syncing the folders. You then have to ask yourself, what would happen if the same user logs into two nodes at the same time? What if they log into node a, then node b, then log out from b and go back to node a? Say you decide to use a the database to check if the user has logged in and is active. What happens if they time out? They log into node a, use it. Go to lunch. The session times out. Are then are blocked from using node b? From node a as well?
That kind of stuff would never fly in a design review around here. Access to any non-transational resource from a server is a red flag and I expect the developer to demonstrate what they did the minimize the risks. Normally, the amount of code you'd write to get around design defects would make maintenance too expensive.
There are work around options you might try. As an example, you could store the files on a file share and use the database to map an application level abstraction of the file name to physical file location. You could use transactions to lock the rows in the database while the files are accessed. You'd have to hold your nose while implementing such a stinker of a system but it would get rid of the complicated user file structure while you work on a better fix.
I worked on an awful servlet app that created PDF files. The creation could take anywhere from 20 minutes to an hour because the report was made up of hundreds of pages filled with charts and tables. Each chart and table had a query or three behind it. At first, jobs were created via a thread spawned from the servlet which wrote a file in the WEB-INF directory. When the user got notified that the file was created, the download servlet sent the file and deleted the file from disk. It was like a j2ee bad practice checklist. We got around this by having the web app write a job request to a table and then have another process poll the table looking for jobs. Once the pdf file was ready and copied to the ftp location, the URL would be written to a table and a link would show up on the user's screen. Downloads where served by a different server as plain old static content.