Feda /dev/ - No Javascript allowed

Normas
spoiler
Personas non gratas
Memes feda dev




desu

#45000 La idea es que tu no tienes un proceso orquestrador.

Los procesos van por separado y no tienes ningun control sobre ellos ni como se estan ejecutando.

Estas haciendo un codigo que el usuario puede ejecutar y sea seguro. No hablamos de codigo en el lado del servidor o del que tengas control.

2 respuestas
JuAn4k4

#45000 ¿ De que mutex hablas entonces ? Porque compartir un mutex entre dos procesos independientes lanzados por el user me parece a mi que no existe.

1 respuesta
kidandcat

#45001 Si lo que quieres es compartir memoria desde 2 procesos: shm_open y a sincronizar
Pero vaya, de toda la vida se usan los lock files, lanzas el create, y esperas el fallo por si se te han adelantado.

If O_CREAT and O_EXCL are set, open() shall fail if the file exists. The check for the existence of the file and the creation of the file if it does not exist shall be atomic with respect to other threads executing open() naming the same filename in the same directory with O_EXCL and O_CREAT set. If O_EXCL and O_CREAT are set, and path names a symbolic link, open() shall fail and set errno to [EEXIST], regardless of the contents of the symbolic link. If O_EXCL is set and O_CREAT is not set, the result is undefined.

Usas el lock file de mutex, y cuando tengas el archivo tal cual lo quieres persistir, lo escribes.
Si abres el lock con O_CREAT | O_EXCL es imposible que lo abras desde dos procesos diferentes, al que llegue tarde le fallará la llamada.

Tampoco se muy bien qué quieres hacer, si lo resumes en un par de lineas podemos sacar mejores conclusiones (no creo que nadie tenga ganas de leerse más de 3 lineas de código y 5 posts)

2 respuestas
desu

#45003 si creas un lockfile, el proceso peta y no borras el lockfile que?

edit: te respondo yo mismo...

1 respuesta
PhDfailer

¿Cómo de normal es esto?

Aplicación que no tiene ningún tipo de documentación (Entiendo que normal)
Aplicación que no tiene ningún tipo de comentario en el código (Entiendo que menos normal, pero puede ser habitual). Hay líneas de código comentadas en PROD.
Aplicación que no tiene ningún test.
Aplicación organizada en microservicios (unos 60) que no puedes ejecutar en local. Ni hacer debug en local de forma sencilla.
La forma de ver si funciona un cambio es lanzarla a un servidor sandbox/pruebas.
Si supera esa prueba, pasa al siguiente estadio que es lanzarla con servidores en cluster replicando a los de producción pero de "prueba".
Si supera esa prueba, pasa el estadio de producción.

No me han contratado como ingenierio de software, pero tengo que entender como funciona esta aplicación para "replicar" muchas de sus funcionalidades en "entorno cloud que no mencionaré". Lo curioso es que al que han contratado de senior (4 puestos por encima mia) en mi equipo ni sabe lo que es una API. Y en esas estamos.

Nos estan metiendo presión para coger su mantenimiento la semana que viene, y empezar a transferirla a "entorno cloud que no mencionaré" en pocas semanas.

1 respuesta
kidandcat

#45004 Para eso tienes las utilidades especificas de cada SO, si estas en linux: https://linux.die.net/man/2/flock

Si tu proceso crashea, el SO libera el lock https://stackoverflow.com/a/12652718/4158710

1 respuesta
desu

#45006 usar un flock es como usar la solucion que yo he hecho... usar fcntl es mas fino...

me acabas de dar mi respuesta a mi pregunta?

1 respuesta
Lolerpopler

#45005 Miralo como una oportunidad. Pon los huevos sobre la mesa, arregla esa puta mierda y enseñales quien sabe de verdad.

Por curiosidad, esta el que hizo todo eso en la empresa aun?

1 respuesta
kidandcat

#45007 Y yo no te digo que no, solo respondo a tu pregunta de

otra cosa seria, imaginate que 2 procesos intentan crear el lockfile al mismo momento, funciona bien ese codigo? un open con 'w' flag es suficiente? mucho detalle bajo nivel a verificar.

y

si creas un lockfile, el proceso peta y no borras el lockfile que?

1 respuesta
desu

#45009 el primer parrafo lo escribi despues de hacer la solucion cabron...

y era una pregunta para reflexionar... que el codigo no esta claro con esa syscall que ocurre... XD

"mucho detalle bajo nivel a verificar"

y los flag de "wra" tiene semanticas distintas segun lo que hagas... era otro ejempo de que no esta claro el comportamiento, como el O_EXCL que sin el O_CREAT tiene undefined behavior por ejemplo... por ejemplo si haces un open(file, 'a').close() para crear un archivo que pasa? te parece que esa api es clara? xq no es lo mismo el 'a' que el 'w' en ese caso... porque el 'a' te crea el archivo si no existe...

Me has respondido a mi pregunta con mi respuesta si.

No se porque pierdo tanto tiempo con fperos la verdad.

1 respuesta
kidandcat

#45010 Como ya te dije, leo preguntas y respondo, no sigo tu vida en tus 100 posts diarios 🤷‍♂️

A lo mejor algún día alguna respuesta te sirve, sino solo tienes que ignorarlas, pero no tengo problema en ignorarte y no contestarte más si así lo deseas.

PD: No hace falta que respondas cada respuesta que te dan con tus intentos de desprecio, así no perderías tu preciado tiempo, pero bueno, cada uno con sus prioridades...

Edit: va, te ahorro tu preciado tiempo respondiendo, y por si alguien más está interesado:

Scripty
+

document.querySelectorAll('div[data-autor="desu"]').forEach(f => f.parentNode.removeChild(f))

Y ya no hay más Desu xD

1 respuesta
desu
#45011kidandcat:

sino solo tienes que ignorarlas

el problema es que otra persona puede leer mi pregunta, leer tu respuesta de mierda que esta mal, y pensar que eso esta bien

por eso he tenido que corregirte subnormal

y lo de ignorarme hace gracia, cuando muchisima gente solo lee mis posts en este hilo para ver si he puesto algo interesante y preguntarme despues cosas por mp XD

quizas si no dijeseis subnormalidades a cada post como el tonto de atras con el mutex mas gente podria participar en el hilo.

y esto no seria el estercolero de mononeuronales fperos que es. que no sabeis ni alinear un div ni entendeis que es un descriptor de archivo.

es una pena no poder preguntar nada en este foro sin que la gente te ponga respuestas mal como tu. solo molestais cuando alguien tiene una puta duda.

no entiendo si no entiendes la pregunta o no tienes ni puta idea xq no podeis dejar la pregunta pasar para que otra persona pueda ayudar? es que tio , sois autenticos subnormales.

id a stackoverflow con vuestras respuestas de mierda mal hechas.

aren-pulid0

Uf que chapas

1 respuesta
PhDfailer

#45008 lleva en desarrollo 6 años y han pasado 10+ personas, quedan 4 devs que les han pasado a otro proyecto.

A nuestro team nos transfieren este muerto para que lo migremos...

Kaledros

#45013 Casualmente...

Traber

#45001 Pero vamos a ver qué proceso orquestador ni qué pollas, si dices que te da por culo que el sistema operativo no lo maneje a nivel de kernel es porque quieres que todo se ejecute en la misma máquina, así que no necesitas un proceso externo que te gestione nada, o lo haces en tu código, o te vas a Torvalds, le comes la polla, y le pides amablemente que haga lo que quieres en el kernel.

#45002 No obstante, a petición de JuAnk4lv0 voy a poner un ejemplo de lo que hablo en C#:

Mutexer.cs
Program.cs

Ejemplos de uso:

  • Lanzar 2 consolas con los siguientes comandos
"Multiprocess Writer.exe" sample_log_file.txt desu_1
"Multiprocess Writer.exe" sample_log_file.txt desu_2

Veréis que por un lado la consola lanzará mensajes diciendo que no puede adquirir el mutex cuando ambos están funcionando, esto dejará de suceder cuando haya 1 sola instancia funcionando.

Por otro lado, se escribirá en el fichero que hayáis especificado una línea con timestamp y el ID de la instancia (último parámetro).

Podéis lanzar tantas como queráis (cambiad el ID para distinguir mejor desde qué instancia se escribe al log).

Saludos: Un FPero.

3 1 respuesta
Dr_Manhattan

Traber, especialista en manejo de datos y especialista en poner en su sitio a desu

4 1 respuesta
desu

#45016 Esta bien. Te agradezco que al menos, a diferencia de otros fperos hayas puesto codigo.

Pero para empezar windows != linux.

En windows si se permite lockear archivos como queria como ya comente mas posts atras.

Luego me miro tu codigo porque me parece interesante ver como funciona la API de windows.

#45017 tansolo se ha saltado la parte en que el problema lo tenemos con linux xq windows si funciona facil XD

1 2 respuestas
Traber

#45018 Es Net6, lo puedes compilar para linux, te vas a llevar una bonita sorpresa, porque funciona igual en linux.

Aunque haya pasado un ejemplo de Windows, es un copia-pega (algo más limpio he de decir) de lo que lleva usando uno de nuestros servicios desde hace años para escribir en log desde múltiples procesos, pero también lo usamos para detectar al inicio de la aplicación que no se esté ejecutando ya (sin usar lockfiles):

Y por supuesto el código:

1 respuesta
aren-pulid0

Booom headshot

5
TheBrotha

Me paso a recordaros que no esta permitido el contenido explícito en la web y mucho menos esta tremenda violación

3
Soltrac

#45018 Pues sí que eres listo, que vas a mirar el código en C# sabiendo que es un puto wrapper xD.

Pero bueno, lo voy adelantando......dotNET en Windows para el mutex usa la SYSCALL de OpenMutex y para Linux usa , si no recuerdo mal, pthread_create

aren-pulid0

Se está preparando la respuesta, dadle un par de horas

desu

#45019 Ya he mirado el codigo, si esta mal.

De nuevo, que lo tuyo funciona y esta genial si para tu solucion es suficiente.

Y te agradezco el aporte porque es una solucion implementando cosas que he dicho que NO quiero hacer.

Nosotros hablamos de que el kernel te levante el "mutex". No tener que hacerlo tu activamente con sleeps...

Gracias por el aporte pero esta mal.

Si quieres puedes volver a intentarlo porque Windows tiene syscalls que permiten hacer estas cosas de manera mejor que Linux.

Te has ganado que no te insulte despues de ver el codigo porque has tenido los huevos de ponerlo.

1 respuesta
B

#45024 que blandito te han dejado eh donde están esos HAHAHAHAH que yo los vea

1
desu

No voy a insultar a un usuario que al menos ha posteado una solucion que funciona.

Al contrario se lo agradezco.

Gracias a @Traber tenemos un ejemplo con mi codigo con fcntl, y su codigo con sleeps.

Son soluciones muy distintas, fijaros que mi codigo con fcntl no necesito hacer ningun sleep ni esperar ni re-intentar nada... El kernel avisa a mi proceso.

JuAn4k4

#45003 Si usas otro fichero (.lock) como lock pasa a ser advisory.

desu

uncle bob siendo completamente destruido

https://github.com/cmuratori/misc/blob/main/cleancodeqa.md
https://github.com/cmuratori/misc/blob/main/cleancodeqa-2.md

en el 2 podeis leer el final, donde casey basicamente se rie en su puta cara

CASEY: Well, I disagree with most of that, but if we're ending it here, I'll just add my final responses for github posterity:

Regarding "as I wrote in Clean Code (which, by the way, is not the same as your "Clean Code")," well, the point of this discussion was for you to elaborate on what is not the same. But your design for this IO system looks exactly like my "Clean Code" example - a virtual function for every operation, and one class per element in the system with no predication. So what are these differences that you're referring to? Now would be the time to explain what they are, since that was the point of the concrete example. If this is a bad example for illustrating the differences, that's fine, but it was the first one you gave so I assumed it would be one you'd want to use.

Regarding "when operations proliferate more rapidly than types, switch statements are better," that was not the case here. In no way are operations proliferating more rapidly than types in this system. Vendors will add drivers to an OS constantly, perhaps monthly or even weekly, whereas the number of operations in a particular system tends to go up much more slowly (once every few months at maximum, but more like once a year for something like an IO subsystem). It is the opposite of what you said. This is an important distinction, because what I am demonstrating here is the opposite of your rule: this is showing that even in the case where types proliferate far more rapidly than operations, as is the case with drivers in an OS, the principle doesn't work. Enums are better in both cases. Specifically because you have potentially thousands of types in the system (all the different drivers all the vendors have ever shipped), adding a single operation, however rarely, can cost massive programmer cycles due to the unnecessary work multiplication across types that vtables cause. Another way to say this would be, enums are more important in a system where types proliferate rapidly, not less.

Regarding "you eventually chose a design that sacrifices machine cycles to save programmer cycles," I did no such thing. This design achieves both, that's why I like it. It is dramatically faster to use something like a packet-based system than something like your original proposed design, because you do not take a ring transition on every operation. New OS IO APIs are now all designed this way: the user writes data without talking to the OS, and a kernel thread picks up those data writes. Nobody ever makes a function call, except occasionally to ensure the kernel thread hasn't gone to sleep :) This is what I meant by the bullet point, "If at some point we decide that users should be able to do multithreaded/bulk IO ops" I am talking about the necessity that actually occurred in both Linux and Windows of removing the frequency of ring transitions for saving CPU cycles. None of this is trading CPU cycles for programmer cycles. It's achieving both. The Linux kernel design of io_uring looks like my design! They did not add that to save programmer cycles. They added it because they wanted the highest possible IO throughput. This is an almost universal principle of modern OS design: anything that can be turned into data writes should be, and function calls should be minimized. It's been true for GPUs, for NICs, and for our example, disk IO.

Regarding "And so I think we wind up in the same place. When operations proliferate more rapidly than types we both use switches. When types proliferate more rapidly than operations we both use dynamic dispatch," Again, I don't see how you got there. Obviously types are proliferating more rapidly in this system, so that part is not true. If we don't believe drivers are proliferating rapidly, why are we loading them dynamically? I thought that was the entire point of the example! But perhaps more importantly, we are not "using dynamic dispatch" here in the way you seem to be suggesting. As I said when I posted the proposed design, I would also do this inside the drivers themselves. I would not duplicate drivers to remove if statements and switches inside a driver that allowed that driver to handle multiple similar devices. The only reason there are function pointers in this system is because the problem definition required that we load the driver from a different module, and we are not presuming a JIT or something which can weld things together for us. That introduces a mandatory cut, so we cannot get rid of it because the problem is defined to contain it.

But note that that is not the same between our two approaches. I have the function pointer there because it's required. And you'll note I minimized the number all the way down to one. I didn't put it in there because I think it saves programmer time. In fact, I'm not really sure I want it there at all. I haven't actually implemented this particular system in an OS, so it was somewhat off the top of my head, but it's very possible that if I actually went to write this, I wouldn't actually include that function pointer at all. Instead, I might just have the OS thread reading the queue and prefiltering the packets for quota/permissions, then updating a shared memory address that lets the driver know it can process the packets directly. Without actually implementing, I can't say that's for sure what I would do, but, it's probably something I would try.

So it feels like you're overstating the similarity of our approaches, but, if you think they're that similar, then, I guess that's just where we end up! Thanks for taking the time to create this thread which pushed the github emoji checker well beyond its limits.

Bob: Thank you Casey. I believe we should let our disagreement stand at this point and let our audience be the final judge. This has been fun. Perhaps we'll do it again some day.

Fijaros como uncle bob no deja de irse por las ramas con casos hipoteticos, inventarse nuevo vocabulario para justificar sus analogias, decir cosas que casey no ha dicho y demas falacias...

Menuda master class del señor Muratori.

2 1 respuesta
eondev

#45028 vamos lo de toda la vida de siempre ser pragmatico y no mongolo. Donde curraba yo eran muy de hexagonal y beunas practicas sobreingeneriles hasta para tomar el café, un poco lmao.
Menudos boilerplates de retrasao me tenía que comer

1 respuesta
desu

#45029 Es que es brutal el texto... me pasa mucho mucho estas cosas.

Uncle Bob es el tipico cuñao de toda la vida. Que no tiene ni puta idea de nada pero habla mucho. Con tecnicismos y analogias muchas hipotesis de un mundo ideal imaginario...


"ponme un poco de TDD en este singleton papi"

Menuda paciencia el señor Muratori si señor.

No entiendo como alguien como Uncle Bob ha accedido a hacer algo asi y dejar el ridiculo para la historia.


"a que hora ponen el stream de miudev juanillo? ahora manolo, despues de la clase de micro frontends hexagonales de codely!"

1 respuesta