Superb quality and spec AB-Com PULSe 4K SE. Crazy offer! Only £99! FREE UK DELIVERY! 4K UHD, Enigma 2, Multiboot 4 images & more!...
Superb quality and spec AB-Com PULSe 4K Rev II Twin Satellite tuner only £149! FREE UK DELIVERY! 4K UHD, Enigma 2, SATA HDD facility, Multiboot 4 images & more!...

[VU+ Solo4K] Write error that is not write error

  • Thread starter Thread starter B-N
  • Start date Start date
B

B-N

Guest
Hi support!

I get intermittent write errors on recordings a couple of times each week. I use a Synology DS413 as a network HDD for recordings. I have checked and rechecked the network and cables and can find no problem. No problem with diskspace or the server as far as I can determine.

So I started logging and am no longer so sure that error really is a write error. It may even be a serious error in OpenVIX code.

First indication of the error seems to come from the method
int eDVBRecordFileThread::AsyncIO::wait()
in the file https://github.com/OpenViX/enigma2/blob/master/lib/dvb/demux.cpp
I hope that is the right place and I’m not looking at old code :-)
I include a copy of that method down a bit.

I get two different errors: EINTR and Success (0, no error!)

This suggest to me that something might be wrong with the code so I started trying to understand how the code works and why it may be possible to get those errors. Lots of code so I have probably misunderstood some of how it is supposed to work :-)

If it really was a write error it would have been presented as a EDQUOT , EFBIG, EIO or ENOSPC or something like that.

EINTR means that the operation (in this case aio_write) was interrupted before it had any chance to begin writing data. If it would have been interrupted later it would have been a “short write”. In both cases the write need to be restarted.

The code just aborts on EINTR. Is that really the intended behaviour? The return value of aio_return is only used for error checking and don't check how many bytes was actually written successfully, to check for a short write.

I have no idea what signal causes the interrupt, maybe internal use in some library or elsewhere in Enigma2, but the possibility of an interrupt should always be taken into account in all code. Even if the interrupt is handled correctly so that user code continues without problems, system calls may be interrupted and has to be restarted after an interrupt.

My first thought was that maybe AIO-calls don’t need to check for interrupts or short writes. Searching the Internet indicates that some people believe so. But reading the documentation for AIO a bit I think it says that the AIO-calls behave exactly the same as the corresponding normal IO-calls with mostly the same errors and return values.

And I obviously get an interrupt during aio_write so in my mind that means it must be handled correctly! And from that follows that short writes must also be handled.

Even worse is that none of the potential short writes are logged or reported to the user. That may mean there are a lot of recordings out there that are missing small chunks here and there without anyone knowing. When I notice freezes and jumps in a recording I have previously said “it was probably bad weather when it was recorded”. Maybe not?

So I think there are two problems with the code: EINTR and short writes are not handled correctly.

Disclaimer: I have not been programming low level Unix code for the last 15 years so my memory may be a bit fuzzy and out dated about some details :-) I hope no one feels insulted by my opinions how code should be written in the best of worlds. And I have a tendency to talk to much :-)

I have yet to figure out why I got one “Success”-error, that is a bit strange.

Another thought: why does the code use AIO instead of normal IO?

The method I think generates the first error:
Code:
int eDVBRecordFileThread::AsyncIO::wait()
{
	if (aio.aio_buf != NULL) // Only if we had a request outstanding
	{
		while (aio_error(&aio) == EINPROGRESS)
		{
			eDebug("[eDVBRecordFileThread] Waiting for I/O to complete");
			struct aiocb* paio = &aio;
			int r = aio_suspend(&paio, 1, NULL);
			if (r < 0)
			{
				eDebug("[eDVBRecordFileThread] aio_suspend failed: %m");
				return -1;
			}
		}
		int r = aio_return(&aio);
		aio.aio_buf = NULL;
		if (r < 0)
		{
			eDebug("[eDVBRecordFileThread] wait: aio_return returned failure: %m");
			return -1;
		}
	}
	return 0;
}

Selected parts of the loggs:
Code:
...
< 52876.093> [eDVBRecordFileThread] wait: aio_return returned failure: Interrupted system call
< 52876.094> [eFilePushThreadRecorder] WRITE ERROR, aborting thread: Interrupted system call
< 52876.094> [eDVBRecordFileThread] waiting for aio to complete
< 52876.094> [eDVBRecordFileThread] Waiting for I/O to complete
< 52876.094> [eDVBServiceRecord] record write error
< 52876.094> [eDVBServiceRecord] stop recording!
< 52876.095> [eFilePushThreadRecorder] stopping thread.
< 52876.095> [eDVBRecordFileThread] Waiting for I/O to complete
< 52876.096> [eDVBRecordFileThread] buffer usage histogram (40 buffers of 188 kB)
< 52876.096> [eDVBRecordFileThread]   0:     18
< 52876.096> [eDVBRecordFileThread]   1:   5559
< 52876.096> [eDVBRecordFileThread]   2:   5507
< 52876.248> [eFilePushThreadRecorder] THREAD STOP
< 52876.295> [eDVBTSTools] setSource loading streaminfo for /media/hdd/movie/20161108 0625 - SVT1 HD - Gomorron Sverige.ts
< 52876.304> [eDVBServiceRecord] fixed up 16b837f25 to 45241 (offset 0)
< 52876.309> [RecordTimer] WRITE ERROR on recording, disk full?
< 52876.310> [Notifications] RemovePopup, id = DiskFullMessage
< 52876.310> [Notifications] AddPopup, id = DiskFullMessage
…
< 19043.820> [eDVBRecordFileThread] wait: aio_return returned failure: Interrupted system call
< 19043.820> [eFilePushThreadRecorder] WRITE ERROR, aborting thread: Interrupted system call
< 19043.820> [eDVBRecordFileThread] waiting for aio to complete
< 19043.820> [eDVBRecordFileThread] Waiting for I/O to complete
< 19043.821> [eDVBServiceRecord] record write error
< 19043.821> [eDVBServiceRecord] stop recording!
< 19043.822> [eFilePushThreadRecorder] stopping thread.
< 19043.824> [eDVBRecordFileThread] buffer usage histogram (40 buffers of 188 kB)
< 19043.824> [eDVBRecordFileThread]   0:     67
< 19043.824> [eDVBRecordFileThread]   1:   4879
< 19043.824> [eDVBRecordFileThread]   2:   4818
< 19043.995> [eFilePushThreadRecorder] THREAD STOP
< 19044.002> [eDVBTSTools] setSource loading streaminfo for /media/hdd/movie/20161111 1500 - H2 HD - Engineering Disasters.ts
< 19044.006> [eDVBServiceRecord] fixed up 9b646bb8 to a4fdb (offset 0)
< 19044.009> [RecordTimer] WRITE ERROR on recording, disk full?
< 19044.009> [Notifications] RemovePopup, id = DiskFullMessage
< 19044.009> [Notifications] AddPopup, id = DiskFullMessage
...
< 20762.202> [eDVBRecordFileThread] wait: aio_return returned failure: Success
< 20762.203> [eFilePushThreadRecorder] WRITE ERROR, aborting thread: Success
< 20762.203> [eDVBRecordFileThread] waiting for aio to complete
< 20762.203> [eDVBRecordFileThread] Waiting for I/O to complete
< 20762.203> [eDVBServiceRecord] record write error
< 20762.203> [eDVBServiceRecord] stop recording!
< 20762.204> [eFilePushThreadRecorder] stopping thread.
< 20762.205> [eDVBRecordFileThread] buffer usage histogram (40 buffers of 188 kB)
< 20762.206> [eDVBRecordFileThread]   0:     49
< 20762.206> [eDVBRecordFileThread]   1:  11634
< 20762.206> [eDVBRecordFileThread]   2:  11565
< 20762.268> [eFilePushThreadRecorder] THREAD STOP
< 20762.277> [eDVBTSTools] setSource loading streaminfo for /media/hdd/movie/Helmy/20161107 2100 - Animal Planet HD - My cat from hell.ts
< 20762.294> [eDVBServiceRecord] fixed up 14dd02ade to e4af6 (offset 0)
< 20762.294> [eDVBServiceRecord] fixed up 15f79eb9e to 11b80bb6 (offset 0)
< 20762.304> [RecordTimer] WRITE ERROR on recording, disk full?
< 20762.304> [Notifications] RemovePopup, id = DiskFullMessage
< 20762.304> [Notifications] AddPopup, id = DiskFullMessage
…..
 
Hi,
asynchronous writes are used so that the load of the box is minimized. The effect is normally very drastic. It does not make a lot of sense to use synchronous writes as each write access will block the box for a while.

ciao
 
So I started logging and am no longer so sure that error really is a write error. It may even be a serious error in OpenVIX code.
Sounds similar to a thread for ~6 months ago (to which there was no resolution).

EDIT:

The log reports bits in that are in this area of the thread:
http://www.world-of-satellite.com/s...disk-full-quot&p=387374&viewfull=1#post387374

Although there might have been some resolution - it appeared that there was, at least in one case, a network issue resulting in slow network file-system writing. (See last two posts).
 
Last edited:
Hmmm, it does look as though there is a bug in the piece of code you posted in #1.

aio_error() can return EINTR, so that should also be catered for.

Then the odd error=Success can be explained by this from the aio_return() man page:
If the asynchronous I/O operation has not yet completed, the return
value and effect of aio_return() are undefined.
​
and if the return code is EINTR then the request hasn't yet completed.


Although the question that still obtains is, "What is sending a signal to cause the interrupt?".
And, perhaps, why the signal handler isn't set to restart system calls....
 
Last edited:
Although the question that still obtains is, "What is sending a signal to cause the interrupt?".
And, perhaps, why the signal handler isn't set to restart system calls....
Turns out that lib/dvb/filepush.cpp is doing this deliberately.

Code:
static void signal_handler(int x)
{
}
 
static void ignore_but_report_signals()
{
        /* we set the signal to not restart syscalls, so we can detect our signal. */
        struct sigaction act;
        act.sa_handler = signal_handler; // no, SIG_IGN doesn't do it. we want to receive the -EINTR
        act.sa_flags = 0;
        sigaction(SIGUSR1, &act, 0);
}
So it creates a handler that does nothing at all (so nothing shows up in the log) just so that EINTR can be received.
This appears to be so that async I/O can be terminated (set m_stop non-zero and send a USR1 signal).
Perhaps some possible situations haven't catered for this.
 
I don't think it will be easy to set-up a situation to provoke this at will for testing....
 
My first inclination is that EINTR should be ignore in the same way that EINPROGRESS is.
My second is that the whole attempt should be abandoned (since the read/write has been interrupted to abandon it...).

That's base on reading this:
You call aio_error(3) to see if the operation is in progress or is completed (or was canceled). If it returns anything other than 0, then either there was an error, it's in progress, or it was canceled. So, no writes actually happened and you cannot call aio_return(3). If it's in progress, either do something else and try again later, or use aio_suspend(3) to wait for it to complete.
from here:
Code:
http://stackoverflow.com/questions/31291136/errors-of-aio-write
(which I've put here so that I know where to look for it in the future).
It's a matter of what "try again later" means. If you are aborting this read/write then perhaps the second and first above get swapped around?
 
Last edited:
Thank you birdman for all explaining and thinking! I thought I was going a bit crazy trying to figure out what was going on :-)
 
My first inclination is that EINTR should be ignore in the same way that EINPROGRESS is.
There's even a macro in unistd.h to do this:

Code:
/* Evaluate EXPRESSION, and repeat as long as it returns -1 with `errno'
   set to EINTR.  */
   
# define TEMP_FAILURE_RETRY(expression) \
  (__extension__                                                              \
    ({ long int __result;                                                     \
       do __result = (long int) (expression);                                 \
       while (__result == -1L && errno == EINTR);                             \
       __result; }))
#endif
 
More thinking about this results in:

EINTR means that the operation (in this case aio_write) was interrupted before it had any chance to begin writing data. If it would have been interrupted later it would have been a “short write”. In both cases the write need to be restarted.

The code just aborts on EINTR. Is that really the intended behaviour?
Yes, this is the intended behaviour: at least the abort of the write is - the reported error messages aren't.

The only signal that will cause this is SIGUSR1, and that is only sent when the async I/O needs to be aborted; because something else has already gone wrong. That's why the signal is sent in a way that forces any system call waiting on I/O to return with EINTR.

So this code does need to be tidied up to abort on EINTR (perhaps with a useful message, but certainly setting the return code to -1; and the same applies to the poll())

The real issue you have, though, has already happened by the time you get here, and your log in #1 doesn't record that.

What do the preceding 5s or so of log show?
 
Thanks!
I include much more of one of the logs, starting before recording starts. But the event one step before the error is 271 seconds earlier...
There is one set of rows that looks a bit suspicions:
< NNNNNN.NNN> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd NN(16)

Code:
< 51163.382> [SoftcamManager] oscam-latest already running
< 51163.383> [SoftcamManager] Checking if oscam-latest is frozen
< 51163.383> [eConsoleAppContainer] Starting /bin/sh
< 51163.496> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd 42(16)
< 51165.385> [SoftcamManager] oscam-latest is responding like it should
< 51165.387> [Task] job Components.Task.Job name=SoftcamKontroll #tasks=1 completed with [] in None
< 51240.601> [RecordTimer] activating state 1
< 51240.604> [RecordTimer] Found enough free space to record
< 51240.605> [RecordTimer] Filename calculated as: '/media/hdd/movie/20161108 0625 - SVT1 HD - Gomorron Sverige'
< 51240.605> [Navigation] recording service: <enigma.eServiceReference; proxy of <Swig Object of type 'eServiceReference *' at 0xb1b61a40> >
< 51240.606> [Config] getResolvedKey config.usage.remote_fallback empty variable.
< 51240.606> [eDVBResourceManager] allocate channel.. 0045:0046
< 51240.606> [eDVBFrontend] opening frontend 0
< 51240.609> [eDVBFrontend] (0)tune
< 51240.610> Unicable (EN50494)
< 51240.610> [eDVBSatelliteEquipmentControl] polarisation: V band: L position: 0 satcr: 0 tunerfreq: 1209MHz vco: 2380MHz tuningword 0x00f5
< 51240.610> [eDVBSatelliteEquipmentControl] polarisation: V band: L position: 0 satcr: 0 tunerfreq: 1208MHz vco: 2344MHz tuningword 0x00ec
< 51240.610> [eDVBSatelliteEquipmentControl] polarisation: V band: L position: 0 satcr: 0 tunerfreq: 1211MHz vco: 2364MHz tuningword 0x00f1
< 51240.610> tune timeout 5197ms
< 51240.610> [eDVBSatelliteEquipmentControl] RotorCmd ffffffff, lastRotorCmd ffffffff
< 51240.610> [eDVBFrontend] prepare_sat System 1 Freq 10903000 Pol 1 SR 25000000 INV 2 FEC 3 orbpos 3592 system 1 modulation 2 pilot 2, rolloff 1
< 51240.610> [eDVBFrontend] tuning to 1211 mhz
< 51240.610> [eDVBChannel] OURSTATE: tuner 0 tuning
< 51240.610> [eDVBServicePMTHandler] allocate Channel: res 0
< 51240.610> [eDVBCIInterfaces] addPMTHandler 1:0:19:ED9:45:46:E080000:0:0:0:
< 51240.610> [eDVBChannel] getDemux cap=00
< 51240.610> [eDVBResourceManager] allocate demux cap=00
< 51240.610> [eDVBResourceManager] allocating demux adapter=0, demux=0, source=0 fesource=0
< 51240.610> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51240.612> [eEPGCache] saveEventToFile epg event id 6de8
< 51240.614> [RecordTimer] prepare ok, waiting for begin
< 51240.616> [Trashcan] probing folders
< 51240.618> [Trashcan] found following trashcan's: ['/media/hdd/movie/.Trash']
< 51240.619> [Trashcan] looking in trashcan /media/hdd/movie/.Trash
< 51240.620> [eDVBFrontend] set static current limiting
< 51240.622> [eDVBFrontend] invalidate current switch params
< 51240.622> [eDVBFrontend] tuner 0 setVoltage 1
< 51240.624> [eDVBFrontend] tuner 0 sleep 200ms
< 51240.651> [Trashcan] /media/hdd/movie/.Trash: Size: 92839005135
< 51240.663> [Trashcan] /media/hdd/movie/.Trash: Size now: 92839005135
< 51240.665> [Task] job Components.Task.Job name=Rensar skräp #tasks=1 completed with [] in None
< 51240.824> [eDVBFrontend] tuner 0 setVoltage 2
< 51240.824> [eDVBFrontend] tuner 0 setTone 0
< 51240.825> [eDVBFrontend] tuner 0 sleep 20ms
< 51240.846> [eDVBFrontend] tuner unlocked .. goto 12
< 51240.846> [eDVBFrontend] set sequence pos 12
[eDVBFrontend] tuner 0 sendDiseqc: e0105a00f1
[eDVBFrontend] diseqc ioctl duration: 113 ms< 51240.960> [eDVBFrontend] tuner 0 sleep 50ms
< 51241.010> [eDVBFrontend] tuner 0 setVoltage 1
< 51241.011> [eDVBFrontend] update current switch params
< 51241.011> [eDVBFrontend] tuner 0 startTuneTimeout 5197
< 51241.011> [eDVBFrontend] tuner 0 setFrontend: events enabled
< 51241.011> [eDVBFrontend] setting frontend 0 events: on
< 51241.014> [eDVBFrontend] (0)fe event: status 0, inversion off, m_tuning 1
< 51241.014> [eDVBFrontend] tuner 0 sleep 500ms
< 51241.060> [eDVBFrontend] (0)fe event: status 7, inversion off, m_tuning 2
< 51241.212> [eDVBFrontend] (0)fe event: status 1f, inversion on, m_tuning 3
< 51241.212> [eDVBChannel] OURSTATE: tuner 0 ok
< 51241.212> [eDVBLocalTimerHandler] channel 0x19331e0 running
< 51241.212> [eDVBChannel] getDemux cap=00
< 51241.212> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.212> [eDVBSectionReader] DMX_SET_FILTER pid=20
< 51241.212> [eEPGCache] channel 0x19331e0 running
< 51241.212> [eDVBChannel] getDemux cap=00
< 51241.212> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.212> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.212> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.213> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.217> [eEPGCache] next update in 2 sec
< 51241.217> [eDVBResourceManager] stop release channel timer
< 51241.217> [eDVBChannel] getDemux cap=00
< 51241.217> [eDVBServicePMTHandler] ok ... now we start!!
< 51241.217> [eDVBServiceRecord] RECORD service event 5
< 51241.217> [eDVBCAService] new service 1:0:19:ED9:45:46:E080000:0:0:0:
< 51241.217> [eDVBCAService] add demux 0 to slot 0 service 1:0:19:ED9:45:46:E080000:0:0:0:
< 51241.219> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.219> [eDVBSectionReader] DMX_SET_FILTER pid=0
< 51241.219> [eDVBServiceRecord] RECORD service event 6
< 51241.219> [eDVBServiceRecord] tuned..
< 51241.219> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.219> [eDVBSectionReader] DMX_SET_FILTER pid=18
< 51241.220> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.220> [eDVBSectionReader] DMX_SET_FILTER pid=0
< 51241.221> [eDVBLocalTimerHandler] diff is 0
< 51241.221> [eDVBLocalTimerHandler] diff < 120 .. use Transponder Time
< 51241.221> [eDVBLocalTimerHandler] not changed
< 51241.221> [eDVBChannel] getDemux cap=00
< 51241.398> [eDVBServicePMTHandler] PATready
< 51241.398> [eDVBServicePMTHandler] use pmtpid 0100 for service_id 0ed9
< 51241.398> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.398> [eDVBSectionReader] DMX_SET_FILTER pid=256
< 51241.399> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.399> [eDVBSectionReader] DMX_SET_FILTER pid=0
< 51241.400> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.400> [eDVBSectionReader] DMX_SET_FILTER pid=420
< 51241.400> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.400> [eDVBSectionReader] DMX_SET_FILTER pid=17
< 51241.406> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.406> [eDVBSectionReader] DMX_SET_FILTER pid=256
< 51241.442> [eDVBServiceRecord] now running: Gomorron Sverige sammandrag (1200 seconds)
< 51241.442> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.443> [eDVBSectionReader] DMX_SET_FILTER pid=18
< 51241.463> [eDVBServicePMTHandler] sdt update done!
< 51241.508> [eDVBServiceRecord] RECORD service event 5
< 51241.509> [eDVBCIInterfaces] gotPMT
< 51241.509> [eDVBCAService] don't build/send the same CA PMT twice
< 51241.509> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51241.509> [eDVBSectionReader] DMX_SET_FILTER pid=256
< 51241.514> [eDVBFrontend] set dynamic current limiting
< 51243.223> [eEPGCache] start caching events(1478582682)
< 51243.225> [eDVBSectionReader] DMX_SET_FILTER pid=211
< 51243.225> [eDVBSectionReader] DMX_SET_FILTER pid=561
< 51243.226> [eDVBSectionReader] DMX_SET_FILTER pid=18
< 51243.226> [eDVBSectionReader] DMX_SET_FILTER pid=18
< 51243.227> [eDVBSectionReader] DMX_SET_FILTER pid=18
< 51250.228> [eEPGCache] abort non avail schedule reading
< 51250.230> [eEPGCache] abort non avail schedule other reading
< 51250.231> [eEPGCache] abort non avail mhw reading
< 51250.247> [eEPGCache] nownext finished(1478582689)
< 51250.248> [eEPGCache] stop caching events(1478582689)
< 51250.248> [eEPGCache] next update in 60 min
< 51260.618> [RecordTimer] activating state 2
< 51260.618> [RecordTimer] start recording
< 51260.620> [Config] getResolvedKey config.usage.blinking_rec_symbol_during_recording empty variable.
< 51260.620> [Config] getResolvedKey config.usage.blinking_rec_symbol_during_recording empty variable.
< 51260.620> [eDVBServiceRecord] Recording to /media/hdd/movie/20161108 0625 - SVT1 HD - Gomorron Sverige.ts...
< 51260.623> [eDVBServiceRecord] start recording...
< 51260.623> [eDVBServiceRecord] RECORD: have 1 video stream(s) (040a), and 2 audio stream(s) (0bd0, 1030), and the pcr pid is 040a, and the text pid is 183c
< 51260.623> [eDVBServiceRecord] ADD PID: 0000
< 51260.623> [eDVBServiceRecord] ADD PID: 0100
< 51260.623> [eDVBServiceRecord] ADD PID: 040a
< 51260.623> [eDVBServiceRecord] ADD PID: 0bd0
< 51260.623> [eDVBServiceRecord] ADD PID: 1030
< 51260.623> [eDVBServiceRecord] ADD PID: 183c
< 51260.625> [setIoPrio] realtime level 7 ok
< 51260.625> [eFilePushThreadRecorder] THREAD START
< 51264.430> [eDVBServiceRecord] pcr of eit change: 16b837f25
< 51264.430> [eDVBServiceRecord] now running: Gomorron Sverige (12900 seconds)
< 51264.431> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 51264.431> [eDVBSectionReader] DMX_SET_FILTER pid=18
< 51523.391> [SoftcamManager] oscam-latest already running
< 51523.392> [SoftcamManager] Checking if oscam-latest is frozen
< 51523.392> [eConsoleAppContainer] Starting /bin/sh
< 51523.516> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd 67(16)
< 51525.403> [SoftcamManager] oscam-latest is responding like it should
< 51525.405> [Task] job Components.Task.Job name=SoftcamKontroll #tasks=1 completed with [] in None
< 51883.402> [SoftcamManager] oscam-latest already running
< 51883.404> [SoftcamManager] Checking if oscam-latest is frozen
< 51883.404> [eConsoleAppContainer] Starting /bin/sh
< 51885.456> [SoftcamManager] oscam-latest is responding like it should
< 51885.458> [Task] job Components.Task.Job name=SoftcamKontroll #tasks=1 completed with [] in None
< 52141.221> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 52141.222> [eDVBSectionReader] DMX_SET_FILTER pid=20
< 52141.414> [eDVBLocalTimerHandler] diff is 0
< 52141.414> [eDVBLocalTimerHandler] diff < 120 .. use Transponder Time
< 52141.414> [eDVBLocalTimerHandler] not changed
< 52141.415> [eDVBChannel] getDemux cap=00
< 52236.430> [NetworkTime] setting E2 time: 1478583675.83
< 52243.413> [SoftcamManager] oscam-latest already running
< 52243.413> [SoftcamManager] Checking if oscam-latest is frozen
< 52243.414> [eConsoleAppContainer] Starting /bin/sh
< 52244.851> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd 67(16)
< 52246.719> [SoftcamManager] oscam-latest is responding like it should
< 52246.721> [Task] job Components.Task.Job name=SoftcamKontroll #tasks=1 completed with [] in None
< 52414.238> [AutoTimer] Auto Poll
< 52414.239> [AutoTimer] Auto Poll Started
< 52414.239> [AutoTimer] No changes in configuration, won't parse
< 52414.239> [eEPGCache] event 22cb not found in epgcache
....and a number of the same kind of lines...
< 52418.118> [eEPGCache] lookup events with 'Marvels Agents of S.H.I.E.L.D.' as title (case sensitive)
....and all the other auto timers I have....
< 52420.833> [Task] job Components.Task.Job name=AutoTimer #tasks=13 completed with [] in None
< 52603.421> [SoftcamManager] oscam-latest already running
< 52603.422> [SoftcamManager] Checking if oscam-latest is frozen
< 52603.422> [eConsoleAppContainer] Starting /bin/sh
< 52603.583> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd 67(16)
< 52605.450> [SoftcamManager] oscam-latest is responding like it should
< 52605.452> [Task] job Components.Task.Job name=SoftcamKontroll #tasks=1 completed with [] in None
< 52876.093> [eDVBRecordFileThread] wait: aio_return returned failure: Interrupted system call
< 52876.094> [eFilePushThreadRecorder] WRITE ERROR, aborting thread: Interrupted system call
< 52876.094> [eDVBRecordFileThread] waiting for aio to complete
< 52876.094> [eDVBRecordFileThread] Waiting for I/O to complete
< 52876.094> [eDVBServiceRecord] record write error
< 52876.094> [eDVBServiceRecord] stop recording!
< 52876.095> [eFilePushThreadRecorder] stopping thread.
< 52876.095> [eDVBRecordFileThread] Waiting for I/O to complete
< 52876.096> [eDVBRecordFileThread] buffer usage histogram (40 buffers of 188 kB)
< 52876.096> [eDVBRecordFileThread]   0:     18
< 52876.096> [eDVBRecordFileThread]   1:   5559
< 52876.096> [eDVBRecordFileThread]   2:   5507
< 52876.248> [eFilePushThreadRecorder] THREAD STOP
< 52876.295> [eDVBTSTools] setSource loading streaminfo for /media/hdd/movie/20161108 0625 - SVT1 HD - Gomorron Sverige.ts
< 52876.304> [eDVBServiceRecord] fixed up 16b837f25 to 45241 (offset 0)
< 52876.309> [RecordTimer] WRITE ERROR on recording, disk full?
< 52876.310> [Notifications] RemovePopup, id = DiskFullMessage
< 52876.310> [Notifications] AddPopup, id = DiskFullMessage
< 52963.431> [SoftcamManager] oscam-latest already running
< 52963.432> [SoftcamManager] Checking if oscam-latest is frozen
< 52963.432> [eConsoleAppContainer] Starting /bin/sh
< 52963.555> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd 64(16)
< 52965.435> [SoftcamManager] oscam-latest is responding like it should
< 52965.436> [Task] job Components.Task.Job name=SoftcamKontroll #tasks=1 completed with [] in None
< 53041.415> [eDVBDemux] open demux /dev/dvb/adapter0/demux0
< 53041.415> [eDVBSectionReader] DMX_SET_FILTER pid=20
< 53041.421> [eDVBLocalTimerHandler] diff is 0
< 53041.421> [eDVBLocalTimerHandler] diff < 120 .. use Transponder Time
< 53041.421> [eDVBLocalTimerHandler] not changed
< 53041.421> [eDVBChannel] getDemux cap=00
 
There is one set of rows that looks a bit suspicions:
< NNNNNN.NNN> [eMainloop::processOneEvent] unhandled POLLERR/HUP/NVAL for fd NN(16)
I get several (lots?) of those reported, so I doubt that's the problem.

You say this happens intermittently, but fairly frequently for you. It's just that no-one else seems to have this issue (except, possibly, one other) so it could be something specific to your set-up.
At the moment there isn't much info to go on, and the standard enigma2 code isn't going to give any more.
I take it you are running a solo4k. I could build an enigma2 for that with some additional debug statements, just to find out where the interrupting signal is coming from, which might help.
 
Yes, its a VU+ Solo 4K, with a minimum of plug ins I think. OSCAM, Autotimers, CrossEPG, EPGUpdate and maybe some more. When it was necessary a while ago to do a fresh install, without restoring settings, I think I only imported timers from old backup.

It has been quiet a while but this morning I got one write error again.

I think it may give us a clue if we knew which signal it is. Is it much work for you to add some signal debug statements?

I have started thinking a bit about where random signals may come from, like:
Is the handling of for example arithmetic exceptions different on a VU+ Solo 4K, ARM, than on other hardware?
What signals might be generated inside Python? Do they signal arithmetic exceptions via a SIGFPE and not setting SA_RESTART and is Python even running scripts inside the same process that get the EINTR?
 
It would also be interesting to check the return value of aio_return (how much that really was written) compared to the aio_nbytes in the aio_write call. To check for partial/short write. Maybe not so easy as it depends on the len parameter in a couple of call levels?
 
Is it much work for you to add some signal debug statements?
Not once I've got the first one done, which has thrown up a problem, but that's just something else to fix/workaround...

Is the handling of for example arithmetic exceptions different on a VU+ Solo 4K, ARM, than on other hardware?
No, and if these signals were being thrown you'd get a crash as there's no handler for them. The fact that there is no crash (just an error) indicates that it is SIGUSR1 being thrown by the program itself, as that's the only signal with a handler that does nothing.
 
Sorry for the delay. I was re-doing my development environment to have more space for it. It's now tidy...

Here's an enigma2 executable (all that is needed) for a vusolo4k that contains some printed info when a SIGUSR1 signal is raised and handled.

This is for 4.2.018.

View attachment enigma2-4.2.018-USR1-vusolo4k.zip

To install it you'll need to

Code:
init 4
cd /usr/bin/
cp -p enigma2 enigma2.orig
cp {new-file} enigma2
chmod 755 enigma2
init 3
Then, if you get the error again we can see where the signal is being sent from.

If you're running a version other than 4.2.018, let me know.
 
Thank you!

I had updated to 4.2.019 this morning, before reading this, but I installed it anyway and the receiver seems to be running fine.

Now I just hope there are new write errors, its been quiet for a a couple of days.
 
I had updated to 4.2.019 this morning, before reading this, but I installed it anyway and the receiver seems to be running fine.
Should be fine. I can't think of any changes that would cause a problem.

Now I just hope there are new write errors, its been quiet for a a couple of days.
Odd to be hoping for something to break.

I haven't added any code to try to fix the errors - I thought I'd see where they were occurring first.
 

OpenViX Feeds Status

Back
Top