summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2014-08-10 03:13:15 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2014-08-10 03:13:15 +0800
commit7faf0c568eba2216a25854a1b0b69990103ef309 (patch)
treed3301a2b487d9e66b4bb04213b5edee140c0551c
parentf817f661e80cfac968ea572c8092422b53653294 (diff)
downloadpttbbs-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-xpttbbs/daemon/postd/postd.py36
-rw-r--r--pttbbs/daemon/postd/rebuild.c26
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);
}