diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2014-08-10 03:13:15 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2014-08-10 03:13:15 +0800 |
commit | 7faf0c568eba2216a25854a1b0b69990103ef309 (patch) | |
tree | d3301a2b487d9e66b4bb04213b5edee140c0551c | |
parent | f817f661e80cfac968ea572c8092422b53653294 (diff) | |
download | pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.tar pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.tar.gz pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.tar.bz2 pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.tar.lz pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.tar.xz pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.tar.zst pttbbs-7faf0c568eba2216a25854a1b0b69990103ef309.zip |
Reuse connection when rebuilding boards.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@6054 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rwxr-xr-x | pttbbs/daemon/postd/postd.py | 36 | ||||
-rw-r--r-- | pttbbs/daemon/postd/rebuild.c | 26 |
2 files changed, 40 insertions, 22 deletions
diff --git a/pttbbs/daemon/postd/postd.py b/pttbbs/daemon/postd/postd.py index fbd4b926..2d5deffc 100755 --- a/pttbbs/daemon/postd/postd.py +++ b/pttbbs/daemon/postd/postd.py @@ -56,7 +56,6 @@ def SavePost(content, is_legacy, keypak, data, extra=None): if extra: data.update(extra._asdict()) logging.debug("SavePost: %r => %r", keypak, data) - g_db.batch(True) key = '%s/%s' % (keypak.board, keypak.file) g_db.set(key, serialize(data)) logging.debug(' Saved: %s', key) @@ -83,7 +82,6 @@ def SavePost(content, is_legacy, keypak, data, extra=None): keypak.board, keypak.file, content_len, exec_time) if comments: SavePostComments(keypak, comments, 0) - g_db.batch(False) return content_len def GetPostContent(keypak): @@ -167,19 +165,29 @@ def handle_request(socket, _): content_len = SavePost(None, False, key, header, extra) fd.write(struct.pack(CONTENT_LEN_FORMAT, content_len)) elif req.operation == REQ_IMPORT: - header = DecodeFileHeader(fd.read(pttstruct.FILEHEADER_SIZE)) - extra = read_and_unpack(fd, AddRecordFormatString, AddRecord) - key = read_and_unpack(fd, PostKeyFormatString, PostKey) - content_len = SavePost(None, True, key, header, extra) - fd.write(struct.pack(CONTENT_LEN_FORMAT, content_len)) + g_db.batch(True) + while req.operation == REQ_IMPORT: + header = DecodeFileHeader(fd.read(pttstruct.FILEHEADER_SIZE)) + extra = read_and_unpack(fd, AddRecordFormatString, AddRecord) + key = read_and_unpack(fd, PostKeyFormatString, PostKey) + content_len = SavePost(None, True, key, header, extra) + fd.write(struct.pack(CONTENT_LEN_FORMAT, content_len)) + fd.flush() + req = read_and_unpack(fd, RequestFormatString, Request) + g_db.batch(False) elif req.operation == REQ_IMPORT_REMOTE: - header = DecodeFileHeader(fd.read(pttstruct.FILEHEADER_SIZE)) - extra = read_and_unpack(fd, AddRecordFormatString, AddRecord) - key = read_and_unpack(fd, PostKeyFormatString, PostKey) - content_len = read_and_unpack(fd, CONTENT_LEN_FORMAT)[0] - content = fd.read(content_len) - content_len = SavePost(content, True, key, header, extra) - fd.write(struct.pack(CONTENT_LEN_FORMAT, content_len)) + g_db.batch(True) + while req.operation == REQ_IMPORT_REMOTE: + header = DecodeFileHeader(fd.read(pttstruct.FILEHEADER_SIZE)) + extra = read_and_unpack(fd, AddRecordFormatString, AddRecord) + key = read_and_unpack(fd, PostKeyFormatString, PostKey) + content_len = read_and_unpack(fd, CONTENT_LEN_FORMAT)[0] + content = fd.read(content_len) + content_len = SavePost(content, True, key, header, extra) + fd.write(struct.pack(CONTENT_LEN_FORMAT, content_len)) + fd.flush() + req = read_and_unpack(fd, RequestFormatString, Request) + g_db.batch(False) elif req.operation == REQ_GET_CONTENT: key = read_and_unpack(fd, PostKeyFormatString, PostKey) content = GetPostContent(key) diff --git a/pttbbs/daemon/postd/rebuild.c b/pttbbs/daemon/postd/rebuild.c index 40279b58..919e9b35 100644 --- a/pttbbs/daemon/postd/rebuild.c +++ b/pttbbs/daemon/postd/rebuild.c @@ -4,9 +4,9 @@ const char *server = POSTD_ADDR; -int PostAddRecord(const char *board, const fileheader_t *fhdr, const char *fpath) +int PostAddRecord(int s, const char *board, const fileheader_t *fhdr, const char *fpath) { - int s, success = 1; + int success = 1; PostAddRequest req = {0}; uint32_t len = 0; char *userid; @@ -54,9 +54,6 @@ int PostAddRecord(const char *board, const fileheader_t *fhdr, const char *fpath strlcpy(req.extra.userid, userid, sizeof(req.extra.userid)); printf(" (userref: %s.%d)", req.extra.userid, req.extra.userref); - s = toconnectex(server, 10); - if (s < 0) - return 1; if (success && towrite(s, &req, sizeof(req)) < 0) success = 0; if (success && fpath) { @@ -78,12 +75,12 @@ int PostAddRecord(const char *board, const fileheader_t *fhdr, const char *fpath success = 0; if (success) printf(" (content: %d)", len); - close(s); return !success; } void rebuild_board(int bid GCC_UNUSED, boardheader_t *bp, int is_remote) { + int s; char dot_dir[PATHLEN], fpath[PATHLEN]; FILE *fp; fileheader_t fhdr; @@ -96,6 +93,12 @@ void rebuild_board(int bid GCC_UNUSED, boardheader_t *bp, int is_remote) printf(" (empty directory)\n"); return; } + s = toconnectex(server, 10); + if (s < 0) { + printf("failed to connect to server %s\n", server); + exit(1); + } + while (fread(&fhdr, sizeof(fhdr), 1, fp)) { // Skip unknown files if (fhdr.filename[0] != 'M' && fhdr.filename[1] != '.') { @@ -113,13 +116,20 @@ void rebuild_board(int bid GCC_UNUSED, boardheader_t *bp, int is_remote) } // TODO Add .DIR sequence number. - printf(" - Adding %s", fhdr.filename); - if (PostAddRecord(bp->brdname, &fhdr, is_remote ? fpath : NULL) != 0) + if (PostAddRecord(s, bp->brdname, &fhdr, is_remote ? fpath : NULL) != 0) printf(" (error)"); printf("\n"); } + // shutdown request + { + PostAddRequest req = {0}; + req.cb = sizeof(req); + towrite(s, &req, sizeof(req)); + close(s); + } + fclose(fp); } |