Driver-Taper protocol: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
|||
Line 107: | Line 107: | ||
|- | |- | ||
|global-result | |global-result | ||
|- | |||
|||||||Can ask-dumper-status (Should be done if taper detect no error (INPUT-GOOD and TAPE-GOOD) | |||
|- | |- | ||
|||<---||DONE INPUT-GOOD TAPE-GOOD||normal protocol for a success | |||<---||DONE INPUT-GOOD TAPE-GOOD||normal protocol for a success | ||
Line 113: | Line 115: | ||
|- | |- | ||
|||<---||FAILED INPUT-* TAPE-*||protocol for error in setup (before something is written to tape) | |||<---||FAILED INPUT-* TAPE-*||protocol for error in setup (before something is written to tape) | ||
|- | |||
|ask-dumper-status | |||
|- | |||
|||<---||DUMPER-STATUS||Ask driver the dumper status | |||
|- | |||
|DONE||--->||||Dumper succeeded | |||
|- | |||
|FAILED||--->||||Dumper failed | |||
|- | |- | ||
|part-result | |part-result | ||
Line 178: | Line 188: | ||
* PARTDONE handle label fileno "[sec %f kb %d kps %f]" | * PARTDONE handle label fileno "[sec %f kb %d kps %f]" | ||
* SPLIT-NEEDNEXT handle | * SPLIT-NEEDNEXT handle | ||
* DUMPER-STATUS handle | |||
* QUITTING | * QUITTING | ||
* BAD-COMMAND "error message" | * BAD-COMMAND "error message" | ||
Line 190: | Line 201: | ||
** PARTIAL taper hostname diskname timestamp level [sec %f kb %d kps %f] "error message" | ** PARTIAL taper hostname diskname timestamp level [sec %f kb %d kps %f] "error message" | ||
** FAILED taper hostname diskname timestamp level "error message" | ** FAILED taper hostname diskname timestamp level "error message" | ||
= algorithm after a part written to tape = | |||
if (successful part) { | |||
L_PART -> logfile | |||
if (splited dump) { | |||
PARTDONE -> DRIVER | |||
if (not splited dump || last part) { | |||
if (PORT-WRITE) { | |||
DUMPER-STATUS -> driver | |||
get dumper result from driver (FAILED|DONE) | |||
} | |||
if (partial) #from dumper status or partial flag in header { | |||
PARTIAL INPUT-GOOD TAPE-GOOD -> driver | |||
L_PARTIAL -> logfile | |||
} else (whole) { | |||
DONE INPUT-GOOD TAPE-GOOD -> driver | |||
L_SUCCESS -> logfile | |||
} | |||
} else #splited dump | |||
GOTO next part | |||
} else #failed part { | |||
if (something written to tape for this part) | |||
L_PARTPARTIAL -> logfile | |||
if (splitted dump and tape error && no-input-error) { | |||
SPLIT_NEEDNEXT -> driver | |||
L_INFO -> logfile | |||
#wait for driver NEW-TAPE or NO-NEW-TAPE | |||
#It could take a long time to get the result | |||
if(driver sent NEW-TAPE) | |||
if (new tape available) | |||
NEW-TAPE -> DRIVER | |||
GOTO retry that part to the new tape | |||
else #no valid writable tape found | |||
NO-NEW-TAPE -> DRIVER | |||
else #driver sent NO-NEW-TAPE | |||
noop | |||
} | |||
#it's possible to have both INPUT-* and TAPE-* error or none. | |||
if (nothing written to tape for this dump) { | |||
FAILED INPUT-* TAPE-* -> driver | |||
L_FAIL -> logfile | |||
} else #something written to tape for this dump { | |||
PARTIAL INPUT-* TAPE-* -> driver; | |||
L_PARTIAL -> logfile | |||
} | |||
} |
Revision as of 12:49, 20 October 2006
Communication method
driver talks via two pipes connected to taper's stdin and stdout. The commands and responses are plain text.
Command sequence during backup operation
- driver initialises taper with: START-TAPER <timestamp> to which taper replies with: TAPE-OK or, for fatal errors, with: TAPE-ERROR [<message>]. For speed up,taper is authorized to scan the library and find a valid tape after it received the START-TAPER command.
- driver will ask the taper to start a new tape with the NEW-TAPE command. It should be done for the first tape too.
- driver can ask taper to copy a file from the holding disk to tape (FILE-WRITE) or directly from a dumper (PORT-WRITE) or exit at the end of the run (QUIT).
- taper responds to the PORT-WRITE command with: PORT <port> which driver should then hand on to dumper in a PORT-DUMP command.
- If the copy to tape finishes correctly taper replies with DONE.
- If something goes wrong with the tape, taper can ask to continue on a new tape SPLIT-NEEDNEXT (for splited dump only) or it can abort that dump with PARTIAL or FAILED reply
- After any dump that finished in PARTIAL or FAILED with a TAPE-ERROR, the driver must send a NEW-TAPE before issuing another *-WRITE command.
Other commands
- If driver says something that taper doesn't recognise it responds with: BAD-COMMAND <message>
- taper responds to the QUIT command with: QUITING
Protocol command reference
Taper command reply
Reply | Description |
---|---|
TAPE-OK | taper is setup correctly |
TAPE-ERROR | Error in setup of the driver |
PORT | Reply sent in response to PORT-WRITE command |
DONE | Full dump is on the media |
PARTIAL | Dump was partially written to the media. |
FAILED | Nothing was written to the media |
DUMPER-STATUS | Ask driver to send the dumper status |
PARTDONE | A complete part is written to tape |
SPLIT-NEEDNEXT | Ask driver if it should continue on a new tape |
NEW-TAPE | Will continue on a new found tape |
NO-NEW-TAPE | Will not continue on a new tape |
DONE/PARTIAL and FAILED reply also contains an INPUT-* an TAPE-* message to denote any error:
Reply | Description |
---|---|
INPUT-GOOD | There was no error with the input. |
INPUT-ERROR | There was error with the input. |
Reply | Description |
---|---|
TAPE-GOOD | This tape can be use to write another dump. |
TAPE-ERROR | Nothing more can fit on that tape. |
A result for a successful dump should be: DONE INPUT-GOOD TAPE-GOOD
Driver/Taper Requests/Replies
Driver request | Taper reply | Description | |
---|---|---|---|
initail setup | |||
START-TAPER | ---> | ||
<--- | TAPE-OK | normal taper setup (a tape is available, nothing is written on it) | |
<--- | TAPE-ERROR | failed taper setup (no tape are available or something else is broken) | |
ask for new tape | |||
NEW-TAPE | ---> | driver tell the taper to use a new tape | |
<--- | GOT-NEW-TAPE | taper found one | |
<--- | NO-NEW-TAPE | no tape are available | |
file-write setup | |||
FILE-WRITE | ---> | ||
Will get one part-result for each part written and one global result | |||
port-write setup | |||
PORT-WRITE | ---> | ||
<--- | PORT | ||
Will continue with one part-result for each part written and one global result | |||
global-result | |||
Can ask-dumper-status (Should be done if taper detect no error (INPUT-GOOD and TAPE-GOOD) | |||
<--- | DONE INPUT-GOOD TAPE-GOOD | normal protocol for a success | |
<--- | PARTIAL INPUT-* TAPE-* | protocol for error in data phase (something written to tape) | |
<--- | FAILED INPUT-* TAPE-* | protocol for error in setup (before something is written to tape) | |
ask-dumper-status | |||
<--- | DUMPER-STATUS | Ask driver the dumper status | |
DONE | ---> | Dumper succeeded | |
FAILED | ---> | Dumper failed | |
part-result | |||
<--- | PARTDONE | successfully part written to tape | |
<--- | SPLIT-NEEDNEXT | We get a tape error, ask the driver if we can use a new tape (driver will send a NEW-TAPE or NO-NEW-TAPE command) | |
no new tape | |||
NO-NEW-TAPE | ---> | driver doesn't want the taper to use a new tape (continue with global-result) | |
quit | |||
QUIT | ---> | ||
<--- | QUITING |
Command/reply arguments
Protocol data
data | description |
---|---|
<timestamp> | Time as "yymmdd" of "yymmddhhmmss" |
<handle> | Request ID |
<filename> | Name of file on the holding disk where backup will be written to |
<port> | Taper port to send the backup data to |
<host> | Hostname of the client |
<disk> | Disk on the client being backed up |
<level> | Dump level being used for backup |
splitsize | size of each part on tape |
split_diskbuffer | file use to buffer a complete part |
<message> | Error or Status message |
driver command
- START-TAPER timestamp
- PORT-WRITE handle hostname diskname level datestamp splitsize split_diskbuffer
- FILE-WRITE handle filename hostname diskname level datestamp splitsize
- DONE handle (result from dumper send to taper)
- FAILED handle (result from dumper send to taper)
- NEW-TAPE
- NO-NEW-TAPE
- QUIT
taper reply
- TAPER-OK
- TAPER-ERROR "error-message"
- PARTIAL handle INPUT-* TAPE-* "[sec %f kb %d kps %f]" "input-error-message" "tape-error-message"
- DONE handle INPUT-GOOD TAPE-GOOD "[sec %f kb %d kps %f]" "" ""
- FAILED handle INPUT-* TAPE-* "input-error-message" "tape-error-message"
- NEW-TAPE label
- NO-NEW-TAPE
- PARTDONE handle label fileno "[sec %f kb %d kps %f]"
- SPLIT-NEEDNEXT handle
- DUMPER-STATUS handle
- QUITTING
- BAD-COMMAND "error message"
LOG
- One PART or PARTPARTIAL log line for all part written to tape. It tell the location and status of each part.
- PART taper label fileno hostname diskname timestamp part-number level [sec %f kb %d kps %f]
- PARTPARTIAL taper label fileno hostname diskname timestamp part-number level [sec %f kb %d kps %f] "error message"
- One DONE/PARTIAL/FAILED for each dump. It tell the status of the complete dump.
- DONE taper hostname diskname timestamp level [sec %f kb %d kps %f]
- PARTIAL taper hostname diskname timestamp level [sec %f kb %d kps %f] "error message"
- FAILED taper hostname diskname timestamp level "error message"
algorithm after a part written to tape
if (successful part) { L_PART -> logfile if (splited dump) { PARTDONE -> DRIVER if (not splited dump || last part) { if (PORT-WRITE) { DUMPER-STATUS -> driver get dumper result from driver (FAILED|DONE) } if (partial) #from dumper status or partial flag in header { PARTIAL INPUT-GOOD TAPE-GOOD -> driver L_PARTIAL -> logfile } else (whole) { DONE INPUT-GOOD TAPE-GOOD -> driver L_SUCCESS -> logfile } } else #splited dump GOTO next part } else #failed part { if (something written to tape for this part) L_PARTPARTIAL -> logfile if (splitted dump and tape error && no-input-error) { SPLIT_NEEDNEXT -> driver L_INFO -> logfile #wait for driver NEW-TAPE or NO-NEW-TAPE #It could take a long time to get the result if(driver sent NEW-TAPE) if (new tape available) NEW-TAPE -> DRIVER GOTO retry that part to the new tape else #no valid writable tape found NO-NEW-TAPE -> DRIVER else #driver sent NO-NEW-TAPE noop } #it's possible to have both INPUT-* and TAPE-* error or none. if (nothing written to tape for this dump) { FAILED INPUT-* TAPE-* -> driver L_FAIL -> logfile } else #something written to tape for this dump { PARTIAL INPUT-* TAPE-* -> driver; L_PARTIAL -> logfile } }