You are right - not a good idea. ok, try this on for size :
- The store mechanism works like before, where each message and ack/nack are first
dumped to storage before doing anything else.
- Messages are not duplicated by the SMSC drivers, but instead the driver just take a
reference to the message, and must return the reference with an ack or nack at the end
of processing.
- Messages are not destroyed after queueing to the SMSC driver, but instead kept in a
dictionary.
- Whenever an ack or nack is returned with a message it is matched against the
dictionary (after being stored, of course), and the matching message is then removed.
- The size of the store file is being monitored at all times.
- When a certain limit as been reached - be it storage size or a time limit - a
"rollover" of the store file is done, which is done as follows:
* the storage is locked
* the store file is renamed
* a new store file is craeted (with the old name) and all messages in the
dictionary are dropped into it
* the storage is released
* the old store file is deleted.
- While the store is locked in "rollover", no messages can be written to the storage.
I don't think its such a big deal, because only one message can wait on the storage at
any given time (if there are more then they are queued in the smsbox). also the
rollover should be pretty quick as it's mostly a not so big buffered IO write
(probably a few Ks at the most under normal conditions and an average load).
- When the bearerbox recovers from a crash it should try to read the backup file, and
if succesful (meaning the box crashed in the middle of a rollover), delete the regular
storage. else read the regular storage.
There are some loose ends here, but it's not so terrible, and assuming fast enough
processing (which is feasable in all but the most execptional conditions) we should be
safe enought
An alternate approach would be to simply store messages to an alternate file, and then
harvest the original file in a background low priority thread, store all the non-acked
messages from the original file in the new file, and then delete the original. this
approach is "safer", but it also more complicated as we could crash while we have the
same message in both files, and also this way messages may be written into storage
after their acks. this forces us to a much slower and ellaborate synchronization
process on recovery which can elliminate duplciates and also remember acks until their
messages are found later.
--
Oded Arbel
m-Wise Mobile Solutions
[EMAIL PROTECTED]
Mobile: +972-67-340014
Tel: +972-9-9581711 (ext: 116)
::..
"From the moment I picked your book up until I laid it down I was convulsed with
laughter.
Some day I intend reading it."
-- Groucho Marx (1895-1977)
> -----Original Message-----
> From: Kalle Marjola [mailto:[EMAIL PROTECTED]]
> Sent: Friday, June 14, 2002 10:27 AM
> To: [EMAIL PROTECTED]
> Subject: RE: Message store (Was: EMI: Serious Problem PANIC:
> Too manyconcurrentallocations)
>
>
> On Thu, 13 Jun 2002, Oded Arbel wrote:
>
> > You also don't need to store acks in the store, as only
> unacked messages
> > are stored there.
>
> But note that if you do not store them, you have to write the
> entire store
> each time you get ack or if your system goes down between two
> writes, it
> will resend all messages ackked after the last write.
>
> --
> &kalle marjola
>
>
>