You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2017/08/11 22:08:01 UTC
[trafficserver] branch master updated: Remove the wrong entry from
priority queue and insert the new node into queue
This is an automated email from the ASF dual-hosted git repository.
zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new a50aaf1 Remove the wrong entry from priority queue and insert the new node into queue
a50aaf1 is described below
commit a50aaf1a4f0a76faeb3050dec3a5e75ff90b9f94
Author: scw00 <sc...@apache.org>
AuthorDate: Thu Aug 10 20:43:51 2017 +0800
Remove the wrong entry from priority queue and insert the new node into queue
---
lib/ts/PriorityQueue.h | 6 ++++++
lib/ts/test_PriorityQueue.cc | 30 ++++++++++++++++++++++++++++++
proxy/http2/Http2DependencyTree.h | 8 ++++++++
proxy/http2/test_Http2DependencyTree.cc | 32 ++++++++++++++++++++++++++++++++
4 files changed, 76 insertions(+)
diff --git a/lib/ts/PriorityQueue.h b/lib/ts/PriorityQueue.h
index c233670..8e27cb3 100644
--- a/lib/ts/PriorityQueue.h
+++ b/lib/ts/PriorityQueue.h
@@ -125,6 +125,12 @@ PriorityQueue<T, Comp>::erase(PriorityQueueEntry<T> *entry)
return;
}
+ // If the entry doesn't belong to this queue just return.
+ if (entry != _v[entry->index]) {
+ ink_assert(!_v.in(entry));
+ return;
+ }
+
ink_release_assert(entry->index < _v.length());
const uint32_t original_index = entry->index;
if (original_index != (_v.length() - 1)) {
diff --git a/lib/ts/test_PriorityQueue.cc b/lib/ts/test_PriorityQueue.cc
index aa13e9f..6206c3c 100644
--- a/lib/ts/test_PriorityQueue.cc
+++ b/lib/ts/test_PriorityQueue.cc
@@ -524,3 +524,33 @@ REGRESSION_TEST(PriorityQueue_pop_and_erase)(RegressionTest *t, int /* atype ATS
delete entry_y;
delete entry_z;
}
+
+REGRESSION_TEST(PriorityQueue_pop_and_erase_2)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
+{
+ TestBox box(t, pstatus);
+ box = REGRESSION_TEST_PASSED;
+
+ PQ *pq1 = new PQ();
+
+ N *x = new N(20, "X");
+ N *y = new N(30, "Y");
+
+ Entry *X = new Entry(x);
+ Entry *Y = new Entry(y);
+
+ box.check(X->index == 0 && Y->index == 0, "X and Y index should be 0");
+
+ pq1->push(X);
+
+ pq1->erase(Y);
+
+ box.check(pq1->top() == X, "X should be in queue");
+
+ delete x;
+ delete y;
+
+ delete X;
+ delete Y;
+
+ delete pq1;
+}
diff --git a/proxy/http2/Http2DependencyTree.h b/proxy/http2/Http2DependencyTree.h
index 526b9fc..8ad7fb0 100644
--- a/proxy/http2/Http2DependencyTree.h
+++ b/proxy/http2/Http2DependencyTree.h
@@ -175,12 +175,20 @@ Http2DependencyTree<T>::add(uint32_t parent_id, uint32_t id, uint32_t weight, bo
if (exclusive) {
while (Node *child = parent->children.pop()) {
+ if (child->queued) {
+ parent->queue->erase(child->entry);
+ node->queue->push(child->entry);
+ }
node->children.push(child);
child->parent = node;
}
}
parent->children.push(node);
+ if (!node->queue->empty()) {
+ parent->queue->push(node->entry);
+ node->queued = true;
+ }
++_node_count;
return node;
diff --git a/proxy/http2/test_Http2DependencyTree.cc b/proxy/http2/test_Http2DependencyTree.cc
index 5056cbd..a147685 100644
--- a/proxy/http2/test_Http2DependencyTree.cc
+++ b/proxy/http2/test_Http2DependencyTree.cc
@@ -498,6 +498,38 @@ REGRESSION_TEST(Http2DependencyTree_remove_2)(RegressionTest *t, int /* atype AT
delete tree;
}
+/**
+ * Exclusive Dependency Creation
+ *
+ * A A
+ * / \ => |
+ * B C D
+ * / \
+ * B C
+ */
+REGRESSION_TEST(Http2DependencyTree_exclusive_node)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
+{
+ TestBox box(t, pstatus);
+ box = REGRESSION_TEST_PASSED;
+
+ Tree *tree = new Tree(100);
+ string a("A"), b("B"), c("C"), d("D");
+
+ Tree::Node *B = tree->add(0, 1, 0, false, &b);
+ tree->add(0, 3, 0, false, &c);
+
+ tree->activate(B);
+ // Add node with exclusive flag
+ tree->add(0, 5, 0, true, &d);
+
+ tree->deactivate(B, 0);
+ tree->remove(B);
+
+ box.check(tree->top() == NULL, "Tree top should be NULL");
+
+ delete tree;
+}
+
REGRESSION_TEST(Http2DependencyTree_max_depth)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus)
{
TestBox box(t, pstatus);
--
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>'].