Merge pull request #1826 from csoler/v0.6-FT4

attempt to solve GXS data access problems in new blocking API
This commit is contained in:
csoler 2020-03-13 14:37:53 +01:00 committed by GitHub
commit 4c4b7ce754
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 73 additions and 50 deletions

View File

@ -164,7 +164,9 @@ struct RsGxsCommentService
virtual bool getRelatedComments( uint32_t token, virtual bool getRelatedComments( uint32_t token,
std::vector<RsGxsComment> &comments ) = 0; std::vector<RsGxsComment> &comments ) = 0;
virtual bool createNewComment(uint32_t &token, RsGxsComment &comment) = 0; virtual bool createNewComment(uint32_t &token, const RsGxsComment &comment) = 0; // async API
virtual bool createComment(RsGxsComment& comment) = 0; // blocking API. Updates comment with new metadata.
virtual bool createNewVote(uint32_t &token, RsGxsVote &vote) = 0; virtual bool createNewVote(uint32_t &token, RsGxsVote &vote) = 0;
virtual bool acknowledgeComment( virtual bool acknowledgeComment(

View File

@ -274,8 +274,7 @@ struct RsGxsIfaceHelper
{ mTokenService.requestGroupStatistic(token, grpId); } { mTokenService.requestGroupStatistic(token, grpId); }
/// @see RsTokenService::cancelRequest /// @see RsTokenService::cancelRequest
bool cancelRequest(uint32_t token) bool cancelRequest(uint32_t token) { return mTokenService.cancelRequest(token); }
{ return mTokenService.cancelRequest(token); }
/** /**
* @deprecated * @deprecated
@ -291,12 +290,21 @@ protected:
* @param[in] token token associated to the request caller is waiting for * @param[in] token token associated to the request caller is waiting for
* @param[in] maxWait maximum waiting time in milliseconds * @param[in] maxWait maximum waiting time in milliseconds
* @param[in] checkEvery time in millisecond between status checks * @param[in] checkEvery time in millisecond between status checks
* @param[in] auto_delete_if_unsuccessful delete the request when it fails. This avoid leaving useless pending requests in the queue that would slow down additional calls.
*/ */
RsTokenService::GxsRequestStatus waitToken( RsTokenService::GxsRequestStatus waitToken(
uint32_t token, uint32_t token,
std::chrono::milliseconds maxWait = std::chrono::milliseconds(2000), std::chrono::milliseconds maxWait = std::chrono::milliseconds(2000),
std::chrono::milliseconds checkEvery = std::chrono::milliseconds(20)) std::chrono::milliseconds checkEvery = std::chrono::milliseconds(20),
{ return mTokenService.waitToken(token, maxWait, checkEvery); } bool auto_delete_if_unsuccessful=true)
{
RsTokenService::GxsRequestStatus res = mTokenService.waitToken(token, maxWait, checkEvery);
if(res != RsTokenService::COMPLETE && auto_delete_if_unsuccessful)
cancelRequest(token);
return res;
}
private: private:
RsGxsIface& mGxs; RsGxsIface& mGxs;

View File

@ -232,7 +232,8 @@ public:
RsTokenService::GxsRequestStatus waitToken( RsTokenService::GxsRequestStatus waitToken(
uint32_t token, uint32_t token,
std::chrono::milliseconds maxWait = std::chrono::milliseconds(500), std::chrono::milliseconds maxWait = std::chrono::milliseconds(500),
std::chrono::milliseconds checkEvery = std::chrono::milliseconds(2)) std::chrono::milliseconds checkEvery = std::chrono::milliseconds(2),
bool auto_delete_if_unsuccessful=true)
{ {
#if defined(__ANDROID__) && (__ANDROID_API__ < 24) #if defined(__ANDROID__) && (__ANDROID_API__ < 24)
auto wkStartime = std::chrono::steady_clock::now(); auto wkStartime = std::chrono::steady_clock::now();
@ -241,12 +242,13 @@ LLwaitTokenBeginLabel:
#endif #endif
auto timeout = std::chrono::steady_clock::now() + maxWait; auto timeout = std::chrono::steady_clock::now() + maxWait;
auto st = requestStatus(token); auto st = requestStatus(token);
while( !(st == RsTokenService::FAILED || st >= RsTokenService::COMPLETE) while( !(st == RsTokenService::FAILED || st >= RsTokenService::COMPLETE) && std::chrono::steady_clock::now() < timeout )
&& std::chrono::steady_clock::now() < timeout )
{ {
std::this_thread::sleep_for(checkEvery); std::this_thread::sleep_for(checkEvery);
st = requestStatus(token); st = requestStatus(token);
} }
if(st != RsTokenService::COMPLETE && auto_delete_if_unsuccessful)
cancelRequest(token);
#if defined(__ANDROID__) && (__ANDROID_API__ < 24) #if defined(__ANDROID__) && (__ANDROID_API__ < 24)
/* Work around for very slow/old android devices, we don't expect this /* Work around for very slow/old android devices, we don't expect this

View File

@ -140,7 +140,7 @@ virtual bool getChannelDownloadDirectory(const RsGxsGroupId &groupId, std::strin
std::vector<RsGxsComment> &msgs ) override std::vector<RsGxsComment> &msgs ) override
{ return mCommentService->getGxsRelatedComments(token, msgs); } { return mCommentService->getGxsRelatedComments(token, msgs); }
virtual bool createNewComment(uint32_t &token, RsGxsComment &msg) override virtual bool createNewComment(uint32_t &token, const RsGxsComment &msg) override
{ {
return mCommentService->createGxsComment(token, msg); return mCommentService->createGxsComment(token, msg);
} }
@ -277,7 +277,7 @@ virtual bool ExtraFileRemove(const RsFileHash &hash);
/// @deprecated Implementation of @see RsGxsChannels::createComment /// @deprecated Implementation of @see RsGxsChannels::createComment
RS_DEPRECATED_FOR(createCommentV2) RS_DEPRECATED_FOR(createCommentV2)
bool createComment(RsGxsComment& comment) override; bool createComment(RsGxsComment &comment) override;
/// @deprecated Implementation of @see RsGxsChannels::createVote /// @deprecated Implementation of @see RsGxsChannels::createVote
RS_DEPRECATED_FOR(createVoteV2) RS_DEPRECATED_FOR(createVoteV2)

View File

@ -278,8 +278,12 @@ bool p3GxsCircles::getCirclesSummaries(std::list<RsGroupMetaData>& circles)
uint32_t token; uint32_t token;
RsTokReqOptions opts; RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_META; opts.mReqType = GXS_REQUEST_TYPE_GROUP_META;
if( !requestGroupInfo(token, opts) if( !requestGroupInfo(token, opts) || waitToken(token) != RsTokenService::COMPLETE )
|| waitToken(token) != RsTokenService::COMPLETE ) return false; {
std::cerr << "Cannot get circles summary. Token queue is overloaded?" << std::endl;
return false;
}
else
return getGroupSummary(token, circles); return getGroupSummary(token, circles);
} }
@ -289,8 +293,12 @@ bool p3GxsCircles::getCirclesInfo( const std::list<RsGxsGroupId>& circlesIds,
uint32_t token; uint32_t token;
RsTokReqOptions opts; RsTokReqOptions opts;
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA; opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA;
if( !requestGroupInfo(token, opts, circlesIds) if( !requestGroupInfo(token, opts, circlesIds) || waitToken(token) != RsTokenService::COMPLETE )
|| waitToken(token) != RsTokenService::COMPLETE ) return false; {
std::cerr << "Cannot get circle info. Token queue is overloaded?" << std::endl;
return false;
}
else
return getGroupData(token, circlesInfo); return getGroupData(token, circlesInfo);
} }

View File

@ -425,7 +425,7 @@ double p3GxsCommentService::calculateBestScore(int upVotes, int downVotes)
/********************************************************************************************/ /********************************************************************************************/
bool p3GxsCommentService::createGxsComment(uint32_t &token, RsGxsComment &msg) bool p3GxsCommentService::createGxsComment(uint32_t &token, const RsGxsComment &msg)
{ {
#ifdef DEBUG_GXSCOMMON #ifdef DEBUG_GXSCOMMON
std::cerr << "p3GxsCommentService::createGxsComment() GroupId: " << msg.mMeta.mGroupId; std::cerr << "p3GxsCommentService::createGxsComment() GroupId: " << msg.mMeta.mGroupId;

View File

@ -66,7 +66,7 @@ class p3GxsCommentService: public GxsTokenQueue
bool getGxsCommentData(const uint32_t &token, std::vector<RsGxsComment> &msgs); bool getGxsCommentData(const uint32_t &token, std::vector<RsGxsComment> &msgs);
bool getGxsRelatedComments(const uint32_t &token, std::vector<RsGxsComment> &msgs); bool getGxsRelatedComments(const uint32_t &token, std::vector<RsGxsComment> &msgs);
bool createGxsComment(uint32_t &token, RsGxsComment &msg); bool createGxsComment(uint32_t &token, const RsGxsComment &msg);
bool createGxsVote(uint32_t &token, RsGxsVote &msg); bool createGxsVote(uint32_t &token, RsGxsVote &msg);
// Special Acknowledge. // Special Acknowledge.

View File

@ -85,7 +85,7 @@ public:
return mCommentService->getGxsRelatedComments(token, msgs); return mCommentService->getGxsRelatedComments(token, msgs);
} }
virtual bool createNewComment(uint32_t &token, RsGxsComment &msg) override virtual bool createNewComment(uint32_t &token, const RsGxsComment &msg) override
{ {
return mCommentService->createGxsComment(token, msg); return mCommentService->createGxsComment(token, msg);
} }

View File

@ -96,10 +96,16 @@ virtual void setMessageReadStatus(uint32_t& token, const RsGxsGrpMsgIdPair& msgI
std::vector<RsGxsComment> &msgs ) std::vector<RsGxsComment> &msgs )
{ return mCommentService->getGxsRelatedComments(token, msgs); } { return mCommentService->getGxsRelatedComments(token, msgs); }
virtual bool createNewComment(uint32_t &token, RsGxsComment &msg) virtual bool createNewComment(uint32_t &token, const RsGxsComment &msg) override
{ {
return mCommentService->createGxsComment(token, msg); return mCommentService->createGxsComment(token, msg);
} }
virtual bool createComment(RsGxsComment& msg) override
{
uint32_t token;
return mCommentService->createGxsComment(token, msg) && waitToken(token) == RsTokenService::COMPLETE ;
}
virtual bool createNewVote(uint32_t &token, RsGxsVote &msg) virtual bool createNewVote(uint32_t &token, RsGxsVote &msg)
{ {

View File

@ -59,6 +59,8 @@
* #define ID_DEBUG 1 * #define ID_DEBUG 1
*****/ *****/
#define QT_BUG_CRASH_IN_TAKECHILD_WORKAROUND 1
// Data Requests. // Data Requests.
#define IDDIALOG_IDLIST 1 #define IDDIALOG_IDLIST 1
#define IDDIALOG_IDDETAILS 2 #define IDDIALOG_IDDETAILS 2
@ -586,6 +588,17 @@ void IdDialog::loadCircles(const std::list<RsGroupMetaData>& groupInfo)
mStateHelper->setActive(CIRCLESDIALOG_GROUPMETA, true); mStateHelper->setActive(CIRCLESDIALOG_GROUPMETA, true);
#ifdef QT_BUG_CRASH_IN_TAKECHILD_WORKAROUND
// These 3 lines are normally not needed. But apparently a bug (in Qt ??) causes Qt to crash when takeChild() is called. If we remove everything from the
// tree widget before updating it, takeChild() is never called, but the all tree is filled again from scratch. This is less efficient obviously, and
// also collapses the tree. Because it is a *temporary* fix, I dont take the effort to save open/collapsed items yet. If we cannot find a proper way to fix
// this, then we'll need to implement the two missing functions to save open/collapsed items.
ui->treeWidget_membership->clear();
mExternalOtherCircleItem = NULL ;
mExternalBelongingCircleItem = NULL ;
#endif
/* add the top level item */ /* add the top level item */
//QTreeWidgetItem *personalCirclesItem = new QTreeWidgetItem(); //QTreeWidgetItem *personalCirclesItem = new QTreeWidgetItem();
//personalCirclesItem->setText(0, tr("Personal Circles")); //personalCirclesItem->setText(0, tr("Personal Circles"));

View File

@ -28,7 +28,6 @@
#include "ui_PostedCreatePostDialog.h" #include "ui_PostedCreatePostDialog.h"
#include "util/misc.h" #include "util/misc.h"
#include "util/TokenQueue.h"
#include "util/RichTextEdit.h" #include "util/RichTextEdit.h"
#include "gui/feeds/SubFileItem.h" #include "gui/feeds/SubFileItem.h"
#include "util/rsdir.h" #include "util/rsdir.h"
@ -45,9 +44,9 @@
#define VIEW_IMAGE 2 #define VIEW_IMAGE 2
#define VIEW_LINK 3 #define VIEW_LINK 3
PostedCreatePostDialog::PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted *posted, const RsGxsGroupId& grpId, QWidget *parent): PostedCreatePostDialog::PostedCreatePostDialog(RsPosted *posted, const RsGxsGroupId& grpId, QWidget *parent):
QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint), QDialog(parent, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint),
mTokenQueue(tokenQ), mPosted(posted), mGrpId(grpId), mPosted(posted), mGrpId(grpId),
ui(new Ui::PostedCreatePostDialog) ui(new Ui::PostedCreatePostDialog)
{ {
ui->setupUi(this); ui->setupUi(this);
@ -176,7 +175,6 @@ void PostedCreatePostDialog::createPost()
uint32_t token; uint32_t token;
mPosted->createPost(token, post); mPosted->createPost(token, post);
// mTokenQueue->queueRequest(token, TOKENREQ_MSGINFO, RS_TOKREQ_ANSTYPE_ACK, TOKEN_USER_TYPE_POST);
accept(); accept();
} }

View File

@ -26,8 +26,6 @@
#include "retroshare/rsposted.h" #include "retroshare/rsposted.h"
#include "util/RichTextEdit.h" #include "util/RichTextEdit.h"
class TokenQueue;
namespace Ui { namespace Ui {
class PostedCreatePostDialog; class PostedCreatePostDialog;
} }
@ -41,7 +39,7 @@ public:
* @param tokenQ parent callee token * @param tokenQ parent callee token
* @param posted * @param posted
*/ */
explicit PostedCreatePostDialog(TokenQueue* tokenQ, RsPosted* posted, const RsGxsGroupId& grpId, QWidget *parent = 0); explicit PostedCreatePostDialog(RsPosted* posted, const RsGxsGroupId& grpId, QWidget *parent = 0);
~PostedCreatePostDialog(); ~PostedCreatePostDialog();
private: private:
@ -62,7 +60,6 @@ private:
QString mLink; QString mLink;
QString mNotes; QString mNotes;
TokenQueue* mTokenQueue;
RsPosted* mPosted; RsPosted* mPosted;
RsGxsGroupId mGrpId; RsGxsGroupId mGrpId;

View File

@ -250,7 +250,7 @@ void PostedListWidget::newPost()
return; return;
} }
PostedCreatePostDialog *cp = new PostedCreatePostDialog(mTokenQueue, rsPosted, groupId(), this); PostedCreatePostDialog *cp = new PostedCreatePostDialog(rsPosted, groupId(), this);
cp->show(); cp->show();
/* window will destroy itself! */ /* window will destroy itself! */

View File

@ -307,7 +307,7 @@ void GxsCommentTreeWidget::banUser()
void GxsCommentTreeWidget::makeComment() void GxsCommentTreeWidget::makeComment()
{ {
GxsCreateCommentDialog pcc(mTokenQueue, mCommentService, std::make_pair(mGroupId,mLatestMsgId), mLatestMsgId, this); GxsCreateCommentDialog pcc(mCommentService, std::make_pair(mGroupId,mLatestMsgId), mLatestMsgId, this);
pcc.exec(); pcc.exec();
} }
@ -316,7 +316,7 @@ void GxsCommentTreeWidget::replyToComment()
RsGxsGrpMsgIdPair msgId; RsGxsGrpMsgIdPair msgId;
msgId.first = mGroupId; msgId.first = mGroupId;
msgId.second = mCurrentCommentMsgId; msgId.second = mCurrentCommentMsgId;
GxsCreateCommentDialog pcc(mTokenQueue, mCommentService, msgId, mLatestMsgId, this); GxsCreateCommentDialog pcc(mCommentService, msgId, mLatestMsgId, this);
pcc.loadComment(mCurrentCommentText, mCurrentCommentAuthor, mCurrentCommentAuthorId); pcc.loadComment(mCurrentCommentText, mCurrentCommentAuthor, mCurrentCommentAuthorId);
pcc.exec(); pcc.exec();

View File

@ -26,20 +26,16 @@
#include <QMessageBox> #include <QMessageBox>
#include <iostream> #include <iostream>
GxsCreateCommentDialog::GxsCreateCommentDialog(TokenQueue *tokQ, RsGxsCommentService *service, GxsCreateCommentDialog::GxsCreateCommentDialog(RsGxsCommentService *service, const RsGxsGrpMsgIdPair &parentId, const RsGxsMessageId& threadId, QWidget *parent) :
const RsGxsGrpMsgIdPair &parentId, const RsGxsMessageId& threadId, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::GxsCreateCommentDialog), mTokenQueue(tokQ), mCommentService(service), mParentId(parentId), mThreadId(threadId) ui(new Ui::GxsCreateCommentDialog), mCommentService(service), mParentId(parentId), mThreadId(threadId)
{ {
ui->setupUi(this); ui->setupUi(this);
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(createComment())); connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(createComment()));
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(close())); connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(close()));
/* fill in the available OwnIds for signing */ /* fill in the available OwnIds for signing */
ui->idChooser->loadIds(IDCHOOSER_ID_REQUIRED, RsGxsId()); ui->idChooser->loadIds(IDCHOOSER_ID_REQUIRED, RsGxsId());
} }
void GxsCreateCommentDialog::loadComment(const QString &msgText, const QString &msgAuthor, const RsGxsId &msgAuthorId) void GxsCreateCommentDialog::loadComment(const QString &msgText, const QString &msgAuthor, const RsGxsId &msgAuthorId)
@ -80,9 +76,9 @@ void GxsCreateCommentDialog::createComment()
std::cerr << "ThreadId : " << comment.mMeta.mThreadId << std::endl; std::cerr << "ThreadId : " << comment.mMeta.mThreadId << std::endl;
std::cerr << "ParentId : " << comment.mMeta.mParentId << std::endl; std::cerr << "ParentId : " << comment.mMeta.mParentId << std::endl;
RsGxsId authorId; RsGxsId authorId;
switch (ui->idChooser->getChosenId(authorId)) { switch (ui->idChooser->getChosenId(authorId))
{
case GxsIdChooser::KnowId: case GxsIdChooser::KnowId:
case GxsIdChooser::UnKnowId: case GxsIdChooser::UnKnowId:
comment.mMeta.mAuthorId = authorId; comment.mMeta.mAuthorId = authorId;
@ -96,17 +92,12 @@ void GxsCreateCommentDialog::createComment()
std::cerr << "GxsCreateCommentDialog::createComment() ERROR GETTING AuthorId!"; std::cerr << "GxsCreateCommentDialog::createComment() ERROR GETTING AuthorId!";
std::cerr << std::endl; std::cerr << std::endl;
int ret = QMessageBox::information(this, tr("Comment Signing Error"), QMessageBox::information(this, tr("Comment Signing Error"), tr("You need to create an Identity\n" "before you can comment"), QMessageBox::Ok);
tr("You need to create an Identity\n"
"before you can comment"),
QMessageBox::Ok);
Q_UNUSED(ret)
return; return;
}//switch (ui->idChooser->getChosenId(authorId)) }
uint32_t token; uint32_t token;
mCommentService->createNewComment(token, comment); mCommentService->createComment(comment);
mTokenQueue->queueRequest(token, TOKENREQ_MSGINFO, RS_TOKREQ_ANSTYPE_ACK, 0);
close(); close();
} }

View File

@ -36,8 +36,7 @@ class GxsCreateCommentDialog : public QDialog
Q_OBJECT Q_OBJECT
public: public:
explicit GxsCreateCommentDialog(TokenQueue* tokQ, RsGxsCommentService *service, explicit GxsCreateCommentDialog(RsGxsCommentService *service, const RsGxsGrpMsgIdPair& parentId, const RsGxsMessageId& threadId, QWidget *parent = 0);
const RsGxsGrpMsgIdPair& parentId, const RsGxsMessageId& threadId, QWidget *parent = 0);
~GxsCreateCommentDialog(); ~GxsCreateCommentDialog();
void loadComment(const QString &msgText, const QString &msgAuthor, const RsGxsId &msgAuthorId); void loadComment(const QString &msgText, const QString &msgAuthor, const RsGxsId &msgAuthorId);
@ -47,7 +46,6 @@ private slots:
private: private:
Ui::GxsCreateCommentDialog *ui; Ui::GxsCreateCommentDialog *ui;
TokenQueue *mTokenQueue;
RsGxsCommentService *mCommentService; RsGxsCommentService *mCommentService;
RsGxsGrpMsgIdPair mParentId; RsGxsGrpMsgIdPair mParentId;